Merge remote-tracking branch 'origin/master' into servlet-3.1-api
diff --git a/VERSION.txt b/VERSION.txt
index 4da151f..64c6a8e 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1,5 +1,18 @@
-jetty-9.0.2-SNAPSHOT
+jetty-9.0.3-SNAPSHOT
 
+jetty-9.0.2.v20130417 - 17 April 2013
+ + 364921 FIN WAIT sockets
+ + 402885 reuse Deflaters in GzipFilter
+ + 403591 do not use the ConcurrentArrayBlockingQueue for thread pool, selector
+   and async request log
+ + 404511 fixed poor methods in ArrayTernaryTrie
+ + 405119 Tidy up comments and code formatting for osgi
+ + 405352 Servlet init-param always overridden by WebServlet annotation
+ + 405364 spdy imeplement MAX_CONCURRENT_STREAMS
+ + 405449 spdy improve handling of duplicate stream Ids
+ + 405540 ServletContextListeners call in reverse in doStop
+ + 405551 InputStreamResponseListener.await returns null when request fails.
+ + 405679 example other server for documentation
 
 jetty-9.0.1.v20130408 - 08 April 2013
  + 384552 add comment to jetty-https.xml describing keymanager password
diff --git a/aggregates/jetty-all/pom.xml b/aggregates/jetty-all/pom.xml
index 6ad817d..104e6c4 100644
--- a/aggregates/jetty-all/pom.xml
+++ b/aggregates/jetty-all/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
diff --git a/examples/async-rest/async-rest-jar/pom.xml b/examples/async-rest/async-rest-jar/pom.xml
index 6defdb5..7353987 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-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/pom.xml b/examples/async-rest/async-rest-webapp/pom.xml
index 0cb4940..df2b793 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>  
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.eclipse.jetty.example-async-rest</groupId>
diff --git a/examples/async-rest/pom.xml b/examples/async-rest/pom.xml
index 082de5c..640f748 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-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 498e11d..0b32a4c 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
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 c8b5f94..92f5ddb 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
@@ -67,6 +67,7 @@
             new SslConnectionFactory(sslContextFactory,"http/1.1"),
             new HttpConnectionFactory(https_config));
         https.setPort(8443);
+        https.setIdleTimeout(500000);
 
         // Set the connectors
         server.setConnectors(new Connector[] { http, https });
diff --git a/examples/embedded/src/main/resources/jetty-logging.properties b/examples/embedded/src/main/resources/jetty-logging.properties
index f912160..73456ad 100644
--- a/examples/embedded/src/main/resources/jetty-logging.properties
+++ b/examples/embedded/src/main/resources/jetty-logging.properties
@@ -5,5 +5,6 @@
 #org.eclipse.jetty.STACKS=false
 #org.eclipse.jetty.spdy.LEVEL=DEBUG
 #org.eclipse.jetty.server.LEVEL=DEBUG
-#org.eclipse.jetty.io.ssl.LEVEL=DEBUG
+org.eclipse.jetty.io.LEVEL=DEBUG
+org.eclipse.jetty.io.ssl.LEVEL=DEBUG
 #org.eclipse.jetty.spdy.server.LEVEL=DEBUG
diff --git a/examples/embedded/src/main/resources/jetty-otherserver.xml b/examples/embedded/src/main/resources/jetty-otherserver.xml
new file mode 100644
index 0000000..04e3358
--- /dev/null
+++ b/examples/embedded/src/main/resources/jetty-otherserver.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+
+<Configure id="OtherServer" class="org.eclipse.jetty.server.Server">
+    <Set name="handler">
+      <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
+        <Set name="handlers">
+         <Array type="org.eclipse.jetty.server.Handler">
+           <Item>
+             <New id="OtherContexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
+           </Item>
+           <Item>
+             <New class="org.eclipse.jetty.server.handler.DefaultHandler"/>
+           </Item>
+         </Array>
+        </Set>
+      </New>
+    </Set>
+
+  <Call name="addConnector">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="OtherServer" /></Arg>
+        <Set name="port">8888</Set>
+      </New>
+    </Arg>
+  </Call>
+
+  <Call name="addBean">
+    <Arg>
+      <New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager">
+        <Set name="contexts">
+          <Ref refid="OtherContexts" />
+        </Set>
+
+        <Call id="webappprovider" name="addAppProvider">
+          <Arg>
+            <New class="org.eclipse.jetty.deploy.providers.WebAppProvider">
+              <Set name="monitoredDirName"><Property name="jetty.home" default="." />/other-webapps</Set>
+              <Set name="defaultsDescriptor"><Property name="jetty.home" default="." />/etc/webdefault.xml</Set>
+              <Set name="configurationManager">
+                <New class="org.eclipse.jetty.deploy.PropertiesConfigurationManager"/>
+              </Set>
+            </New>
+          </Arg>
+        </Call>
+      </New>
+    </Arg>
+  </Call>
+</Configure>
diff --git a/examples/pom.xml b/examples/pom.xml
index a5d95ba..bd2e62b 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <groupId>org.eclipse.jetty.examples</groupId>
diff --git a/jetty-annotations/pom.xml b/jetty-annotations/pom.xml
index 32bb8c6..8661a35 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-annotations</artifactId>
diff --git a/jetty-ant/pom.xml b/jetty-ant/pom.xml
index 80f05c5..cb26c36 100755
--- a/jetty-ant/pom.xml
+++ b/jetty-ant/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-ant</artifactId>
diff --git a/jetty-client/pom.xml b/jetty-client/pom.xml
index c1236c3..331f400 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.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
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 644326a..6ac55e6 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
@@ -130,28 +130,23 @@
     }
 
     @Override
-    public void onFailure(Response response, Throwable failure)
-    {
-        LOG.debug("Queuing failure {} {}", FAILURE, failure);
-        queue.offer(FAILURE);
-        responseLatch.countDown();
-        resultLatch.countDown();
-        this.failure = failure;
-        signal();
-    }
-
-    @Override
-    public void onSuccess(Response response)
-    {
-        LOG.debug("Queuing end of content {}{}", EOF, "");
-        queue.offer(EOF);
-    }
-
-    @Override
     public void onComplete(Result result)
     {
         this.result = result;
+        if (result.isSucceeded())
+        {
+            LOG.debug("Queuing end of content {}{}", EOF, "");
+            queue.offer(EOF);
+        }
+        else
+        {
+            LOG.debug("Queuing failure {} {}", FAILURE, failure);
+            queue.offer(FAILURE);
+            this.failure = result.getFailure();
+            responseLatch.countDown();
+        }
         resultLatch.countDown();
+        signal();
     }
 
     protected boolean await()
@@ -176,7 +171,7 @@
     {
         synchronized (this)
         {
-            notify();
+            notifyAll();
         }
     }
 
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 218f0e0..5a800af 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
@@ -445,6 +445,20 @@
         Assert.assertNull(failure.get());
     }
 
+    @Test
+    public void testInputStreamResponseListenerFailedBeforeResponse() throws Exception
+    {
+        start(new EmptyServerHandler());
+
+        InputStreamResponseListener listener = new InputStreamResponseListener();
+        // Connect to the wrong port
+        client.newRequest("localhost", 0)
+                .scheme(scheme)
+                .send(listener);
+        Result result = listener.await(5, TimeUnit.SECONDS);
+        Assert.assertNotNull(result);
+    }
+
     @Test(expected = ExecutionException.class)
     public void testInputStreamContentProviderThrowingWhileReading() throws Exception
     {
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesClientTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesClientTest.java
index 67c9931..c7a685c 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesClientTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesClientTest.java
@@ -357,12 +357,7 @@
         proxy.flushToClient(record);
 
         record = proxy.readFromClient();
-        Assert.assertEquals(TLSRecord.Type.ALERT, record.getType());
-        proxy.flushToServer(record);
-
-        record = proxy.readFromClient();
         Assert.assertNull(record);
-        proxy.flushToServer(record);
 
         server.close();
     }
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 1faca02..e0130dd 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
@@ -72,7 +72,6 @@
 import org.junit.Assert;
 import org.junit.Assume;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class SslBytesServerTest extends SslBytesTest
@@ -87,6 +86,7 @@
     private SslContextFactory sslContextFactory;
     private SSLContext sslContext;
     private SimpleProxy proxy;
+    private Runnable idleHook;
 
     @Before
     public void init() throws Exception
@@ -119,6 +119,15 @@
                             }
                         };
                     }
+
+                    @Override
+                    protected boolean onReadTimeout()
+                    {
+                        final Runnable idleHook = SslBytesServerTest.this.idleHook;
+                        if (idleHook != null)
+                            idleHook.run();
+                        return super.onReadTimeout();
+                    }
                 }, connector, endPoint);
             }
         };
@@ -165,7 +174,6 @@
             }
         };
         connector.setIdleTimeout(idleTimeout);
-//        connector.setPort(5870);
         connector.setPort(0);
 
         server.addConnector(connector);
@@ -209,7 +217,7 @@
 
         proxy = new SimpleProxy(threadPool, "localhost", serverPort);
         proxy.start();
-        logger.debug(":{} <==> :{}", proxy.getPort(), serverPort);
+        logger.info("proxy:{} <==> server:{}", proxy.getPort(), serverPort);
     }
 
     @After
@@ -377,13 +385,9 @@
         Assert.assertNull(String.valueOf(record), record);
         proxy.flushToServer(record);
 
-        // Close Alert
-        record = proxy.readFromServer();
-        proxy.flushToClient(record);
         // Socket close
         record = proxy.readFromServer();
         Assert.assertNull(String.valueOf(record), record);
-        proxy.flushToClient(record);
     }
 
     @Test
@@ -669,13 +673,9 @@
         Assert.assertNull(String.valueOf(record), record);
         proxy.flushToServer(record);
 
-        // Close Alert
-        record = proxy.readFromServer();
-        proxy.flushToClient(record);
         // Socket close
         record = proxy.readFromServer();
         Assert.assertNull(String.valueOf(record), record);
-        proxy.flushToClient(record);
     }
 
     @Test
@@ -728,22 +728,15 @@
         Assert.assertEquals(TLSRecord.Type.APPLICATION, record.getType());
         proxy.flushToClient(record);
 
-        // Close Alert
+        // Socket close
         record = proxy.readFromServer();
-        Assert.assertNotNull(record);
-        Assert.assertEquals(TLSRecord.Type.ALERT, record.getType());
-        // We can't forward to the client, its socket is already closed
+        Assert.assertNull(record);
 
         // Check that we did not spin
         TimeUnit.MILLISECONDS.sleep(500);
         Assert.assertThat(sslFills.get(), Matchers.lessThan(20));
         Assert.assertThat(sslFlushes.get(), Matchers.lessThan(20));
         Assert.assertThat(httpParses.get(), Matchers.lessThan(20));
-
-        // Socket close
-        record = proxy.readFromServer();
-        Assert.assertNull(String.valueOf(record), record);
-        proxy.flushToClient(record);
     }
 
     @Test
@@ -803,11 +796,9 @@
         Assert.assertEquals(TLSRecord.Type.APPLICATION, record.getType());
         proxy.flushToClient(record);
 
-        // Close Alert
+        // Socket close
         record = proxy.readFromServer();
-        Assert.assertNotNull(record);
-        Assert.assertEquals(TLSRecord.Type.ALERT, record.getType());
-        // We can't forward to the client, its socket is already closed
+        Assert.assertNull(String.valueOf(record), record);
 
         // Check that we did not spin
         TimeUnit.MILLISECONDS.sleep(500);
@@ -819,11 +810,6 @@
         record = proxy.readFromClient();
         Assert.assertNull(String.valueOf(record), record);
         proxy.flushToServer(record);
-
-        // Socket close
-        record = proxy.readFromServer();
-        Assert.assertNull(String.valueOf(record), record);
-        proxy.flushToClient(record);
     }
 
     @Test
@@ -864,12 +850,9 @@
         // Close the raw socket, this generates a truncation attack
         proxy.flushToServer(null);
 
-        // Expect alert + raw close from server
-        record = proxy.readFromServer();
-        Assert.assertEquals(TLSRecord.Type.ALERT, record.getType());
+        // Expect raw close from server
         record = proxy.readFromServer();
         Assert.assertNull(String.valueOf(record), record);
-        proxy.flushToClient(record);
 
         // Check that we did not spin
         TimeUnit.MILLISECONDS.sleep(500);
@@ -917,12 +900,9 @@
         Assert.assertEquals(TLSRecord.Type.APPLICATION, record.getType());
         proxy.flushToClient(record);
 
-        // Expect alert + raw close from server
-        record = proxy.readFromServer();
-        Assert.assertEquals(TLSRecord.Type.ALERT, record.getType());
+        // Expect raw close from server
         record = proxy.readFromServer();
         Assert.assertNull(String.valueOf(record), record);
-        proxy.flushToClient(record);
 
         // Check that we did not spin
         TimeUnit.MILLISECONDS.sleep(500);
@@ -1099,6 +1079,7 @@
         System.arraycopy(closeBytes, 0, bytes, dataBytes.length, closeBytes.length / 2);
         proxy.flushToServer(100, bytes);
 
+        // Send the other half of the close alert bytes
         bytes = new byte[closeBytes.length - closeBytes.length / 2];
         System.arraycopy(closeBytes, closeBytes.length / 2, bytes, 0, bytes.length);
         proxy.flushToServer(100, bytes);
@@ -1113,27 +1094,15 @@
         Assert.assertEquals(TLSRecord.Type.APPLICATION, record.getType());
         proxy.flushToClient(record);
 
-        // Close Alert
+        // Socket close
         record = proxy.readFromServer();
-        Assert.assertNotNull(record);
-        Assert.assertEquals(TLSRecord.Type.ALERT, record.getType());
-        // We can't forward to the client, its socket is already closed
+        Assert.assertNull(record);
 
         // Check that we did not spin
         TimeUnit.MILLISECONDS.sleep(500);
         Assert.assertThat(sslFills.get(), Matchers.lessThan(20));
         Assert.assertThat(sslFlushes.get(), Matchers.lessThan(20));
         Assert.assertThat(httpParses.get(), Matchers.lessThan(20));
-
-        // Socket close
-        record = proxy.readFromClient();
-        Assert.assertNull(String.valueOf(record), record);
-        proxy.flushToServer(record);
-
-        // Socket close
-        record = proxy.readFromServer();
-        Assert.assertNull(String.valueOf(record), record);
-        proxy.flushToClient(record);
     }
 
     @Test
@@ -1749,13 +1718,37 @@
         client.close();
     }
 
-    @Ignore
     @Test
     public void testRequestConcurrentWithIdleExpiration() throws Exception
     {
         final SSLSocket client = newClient();
+        final OutputStream clientOutput = client.getOutputStream();
         final CountDownLatch latch = new CountDownLatch(1);
 
+        idleHook = new Runnable()
+        {
+            public void run()
+            {
+                if (latch.getCount()==0)
+                    return;
+                try
+                {
+                    // Send request
+                    clientOutput.write(("" +
+                            "GET / HTTP/1.1\r\n" +
+                            "Host: localhost\r\n" +
+                            "\r\n").getBytes("UTF-8"));
+                    clientOutput.flush();
+                    latch.countDown();
+                }
+                catch (Exception x)
+                {
+                    // Latch won't trigger and test will fail
+                    x.printStackTrace();
+                }
+            }
+        };
+
         SimpleProxy.AutomaticFlow automaticProxyFlow = proxy.startAutomaticFlow();
         client.startHandshake();
         Assert.assertTrue(automaticProxyFlow.stop(5, TimeUnit.SECONDS));
@@ -1779,86 +1772,13 @@
         Assert.assertThat(sslFlushes.get(), Matchers.lessThan(20));
         Assert.assertThat(httpParses.get(), Matchers.lessThan(50));
 
-        completeClose(client);
+        record = proxy.readFromServer();
+        Assert.assertNull(record);
 
         TimeUnit.MILLISECONDS.sleep(200);
-        //System.err.println(((Dumpable)server.getConnectors()[0]).dump());
         Assert.assertThat(((Dumpable)server.getConnectors()[0]).dump(), Matchers.not(Matchers.containsString("SCEP@")));
-
     }
 
-    /*
-        @Test
-        public void testRequestWriteBlockedWithPipelinedRequest() throws Exception
-        {
-            final SSLSocket client = newClient();
-            final OutputStream clientOutput = client.getOutputStream();
-
-            SimpleProxy.AutomaticFlow automaticProxyFlow = proxy.startAutomaticFlow();
-            client.startHandshake();
-            Assert.assertTrue(automaticProxyFlow.stop(5, TimeUnit.SECONDS));
-
-            byte[] data = new byte[128 * 1024];
-            Arrays.fill(data, (byte)'X');
-            final String content = new String(data, "UTF-8");
-            Future<Object> request = threadPool.submit(new Callable<Object>()
-            {
-                public Object call() throws Exception
-                {
-                    clientOutput.write(("" +
-                            "POST /echo HTTP/1.1\r\n" +
-                            "Host: localhost\r\n" +
-                            "Content-Length: " + content.length() + "\r\n" +
-                            "\r\n" +
-                            content).getBytes("UTF-8"));
-                    clientOutput.flush();
-                    return null;
-                }
-            });
-
-            // Nine TLSRecords will be generated for the request
-            for (int i = 0; i < 9; ++i)
-            {
-                // Application data
-                TLSRecord record = proxy.readFromClient();
-                Assert.assertEquals(TLSRecord.Type.APPLICATION, record.getType());
-                proxy.flushToServer(record, 0);
-            }
-            Assert.assertNull(request.get(5, TimeUnit.SECONDS));
-
-            // We do not read the big request to cause a write blocked on the server
-            TimeUnit.MILLISECONDS.sleep(500);
-
-            // Now send the pipelined request
-            Future<Object> pipelined = threadPool.submit(new Callable<Object>()
-            {
-                public Object call() throws Exception
-                {
-                    clientOutput.write(("" +
-                            "GET /pipelined HTTP/1.1\r\n" +
-                            "Host: localhost\r\n" +
-                            "\r\n").getBytes("UTF-8"));
-                    clientOutput.flush();
-                    return null;
-                }
-            });
-
-            TLSRecord record = proxy.readFromClient();
-            Assert.assertEquals(TLSRecord.Type.APPLICATION, record.getType());
-            proxy.flushToServer(record, 0);
-            Assert.assertNull(pipelined.get(5, TimeUnit.SECONDS));
-
-            // Check that we did not spin
-            TimeUnit.MILLISECONDS.sleep(500);
-            Assert.assertThat(sslFills.get(), lessThan(20));
-            Assert.assertThat(sslFlushes.get(), lessThan(20));
-            Assert.assertThat(httpParses.get(), lessThan(50));
-
-            Thread.sleep(5000);
-
-    //        closeClient(client);
-        }
-    */
     private void assumeJavaVersionSupportsTLSRenegotiations()
     {
         // Due to a security bug, TLS renegotiations were disabled in JDK 1.6.0_19-21
@@ -1893,31 +1813,8 @@
         Assert.assertNull(String.valueOf(record), record);
         proxy.flushToServer(record);
 
-        // Close Alert
-        record = proxy.readFromServer();
-        proxy.flushToClient(record);
-
         // Socket close
         record = proxy.readFromServer();
         Assert.assertNull(String.valueOf(record), record);
-        proxy.flushToClient(record);
-    }
-
-    private void completeClose(SSLSocket client) throws Exception
-    {
-        client.close();
-
-        // Close Alert
-        TLSRecord record = proxy.readFromClient();
-        proxy.flushToServer(record);
-        // Socket close
-        record = proxy.readFromClient();
-        Assert.assertNull(String.valueOf(record), record);
-        proxy.flushToServer(record);
-
-        // Close Alert
-        record = proxy.readFromServer();
-        proxy.flushToClient(record);
-
     }
 }
diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesTest.java
index c7fe744..b0f5769 100644
--- a/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesTest.java
+++ b/jetty-client/src/test/java/org/eclipse/jetty/client/ssl/SslBytesTest.java
@@ -34,12 +34,17 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
+import org.eclipse.jetty.toolchain.test.TestTracker;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.junit.Assert;
+import org.junit.Rule;
 
 public abstract class SslBytesTest
 {
+    @Rule
+    public TestTracker tracker = new TestTracker();
+
     protected final Logger logger = Log.getLogger(getClass());
 
     public static class TLSRecord
@@ -115,8 +120,7 @@
 
         public void start() throws Exception
         {
-            serverSocket = new ServerSocket(47009);
-//            serverSocket = new ServerSocket(0);
+            serverSocket = new ServerSocket(0);
             Thread acceptor = new Thread(this);
             acceptor.start();
             server = new Socket(serverHost, serverPort);
diff --git a/jetty-continuation/pom.xml b/jetty-continuation/pom.xml
index e146ba8..e339635 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-continuation</artifactId>
diff --git a/jetty-deploy/pom.xml b/jetty-deploy/pom.xml
index 55848f5..5d25eef 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-deploy</artifactId>
diff --git a/jetty-distribution/pom.xml b/jetty-distribution/pom.xml
index dfe828f..2189d3b 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <artifactId>jetty-distribution</artifactId>
   <name>Jetty :: Distribution Assemblies</name>
diff --git a/jetty-http/pom.xml b/jetty-http/pom.xml
index 1403df1..f13379c 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-http</artifactId>
diff --git a/jetty-io/pom.xml b/jetty-io/pom.xml
index 24eedb6..6af3a28 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-io</artifactId>
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 4fca18f..19b6548 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
@@ -190,6 +190,10 @@
         if (DEBUG)
             LOG.debug("onFillable enter {}", getEndPoint());
 
+        // We have received a close handshake, close the end point to send FIN.
+        if (_decryptedEndPoint.isInputShutdown())
+            getEndPoint().close();
+            
         // wake up whoever is doing the fill or the flush so they can
         // do all the filling, unwrapping, wrapping and flushing
         _decryptedEndPoint.getFillInterest().fillable();
@@ -612,8 +616,11 @@
                                         // maybe we will fill some more on a retry
                                         continue;
                                     }
-                                    // we need to wait for more net data
-                                    return 0;
+                                    else
+                                    {
+                                        // we need to wait for more net data
+                                        return 0;
+                                    }
 
                                 case FINISHED:
                                     throw new IllegalStateException();
@@ -726,6 +733,7 @@
                             {
                                 _cannotAcceptMoreAppDataToFlush = true;
                                 getEndPoint().flush(_encryptedOutput);
+                                getEndPoint().shutdownOutput();
                                 // If we failed to flush the close handshake then we will just pretend that
                                 // the write has progressed normally and let a subsequent call to flush
                                 // (or WriteFlusher#onIncompleteFlushed) to finish writing the close handshake.
@@ -733,8 +741,11 @@
                                 if (BufferUtil.hasContent(_encryptedOutput))
                                     return false;
                             }
-
                             // otherwise we have written, and the caller will close the underlying connection
+                            else
+                            {
+                                getEndPoint().shutdownOutput();
+                            }
                             return allConsumed;
 
                         case BUFFER_UNDERFLOW:
@@ -823,24 +834,37 @@
             {
                 _bufferPool.release(_encryptedOutput);
                 _encryptedOutput = null;
-                if (_sslEngine.isOutboundDone())
-                    getEndPoint().shutdownOutput();
             }
         }
 
         @Override
         public void shutdownOutput()
         {
-            _sslEngine.closeOutbound();
-            try
+            boolean ishut = isInputShutdown();
+            if (DEBUG)
+                LOG.debug("{} shutdownOutput: oshut={}, ishut={}", SslConnection.this, isOutputShutdown(), ishut);
+            if (ishut)
             {
-                flush(BufferUtil.EMPTY_BUFFER);
-            }
-            catch (IOException e)
-            {
-                LOG.ignore(e);
+                // Aggressively close, since inbound close alert has already been processed
+                // and the TLS specification allows to close the connection directly, which
+                // is what most other implementations expect: a FIN rather than a TLS close
+                // reply. If a TLS close reply is sent, most implementation send a RST.
                 getEndPoint().close();
             }
+            else
+            {
+                try
+                {
+                    _sslEngine.closeOutbound();
+                    flush(BufferUtil.EMPTY_BUFFER); // Send close handshake
+                    SslConnection.this.fillInterested(); // seek reply FIN or RST or close handshake
+                }
+                catch (Exception e)
+                {
+                    LOG.ignore(e);
+                    getEndPoint().close();
+                }
+            }
         }
 
         @Override
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointSslTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointSslTest.java
index 77aea8b..7bd0596 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointSslTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointSslTest.java
@@ -202,16 +202,21 @@
 
         filled=client.read(sslIn);
         if (debug) System.err.println("in="+filled);
-        sslIn.flip();
-        try
+        
+        if (filled>=0)
         {
-            // Since the client closed abruptly, the server is sending a close alert with a failure
-            engine.unwrap(sslIn, appIn);
-            Assert.fail();
-        }
-        catch (SSLException x)
-        {
-            // Expected
+            // this is the old behaviour. 
+            sslIn.flip();
+            try
+            {
+                // Since the client closed abruptly, the server is sending a close alert with a failure
+                engine.unwrap(sslIn, appIn);
+                Assert.fail();
+            }
+            catch (SSLException x)
+            {
+                // Expected
+            }
         }
 
         sslIn.clear();
diff --git a/jetty-jaas/pom.xml b/jetty-jaas/pom.xml
index 974d960..a719a7b 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jaas</artifactId>
diff --git a/jetty-jaspi/pom.xml b/jetty-jaspi/pom.xml
index 4ed1f95..d77e5e8 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jaspi</artifactId>
diff --git a/jetty-jmx/pom.xml b/jetty-jmx/pom.xml
index dd2813f..d2148b0 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jmx</artifactId>
diff --git a/jetty-jndi/pom.xml b/jetty-jndi/pom.xml
index e58d8f6..29575ba 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jndi</artifactId>
diff --git a/jetty-jsp/pom.xml b/jetty-jsp/pom.xml
index b010b81..ec6c3bc 100644
--- a/jetty-jsp/pom.xml
+++ b/jetty-jsp/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jsp</artifactId>
diff --git a/jetty-jspc-maven-plugin/pom.xml b/jetty-jspc-maven-plugin/pom.xml
index 2d2ae6b..0b046e8 100644
--- a/jetty-jspc-maven-plugin/pom.xml
+++ b/jetty-jspc-maven-plugin/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-jspc-maven-plugin</artifactId>
diff --git a/jetty-maven-plugin/pom.xml b/jetty-maven-plugin/pom.xml
index 1cc716c..9461c3b 100644
--- a/jetty-maven-plugin/pom.xml
+++ b/jetty-maven-plugin/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-maven-plugin</artifactId>
diff --git a/jetty-monitor/pom.xml b/jetty-monitor/pom.xml
index 2704f7e..684ebd6 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-monitor</artifactId>
diff --git a/jetty-nosql/pom.xml b/jetty-nosql/pom.xml
index cf8ca80..8aa82cc 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-nosql</artifactId>
diff --git a/jetty-osgi/jetty-osgi-boot-jsp/pom.xml b/jetty-osgi/jetty-osgi-boot-jsp/pom.xml
index a7e5645..1060112 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-osgi-boot-jsp</artifactId>
diff --git a/jetty-osgi/jetty-osgi-boot-warurl/pom.xml b/jetty-osgi/jetty-osgi-boot-warurl/pom.xml
index 5927ad5..62971f7 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-osgi/jetty-osgi-boot/pom.xml b/jetty-osgi/jetty-osgi-boot/pom.xml
index a630b1f..ba5baef 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-osgi-boot</artifactId>
diff --git a/jetty-osgi/jetty-osgi-httpservice/pom.xml b/jetty-osgi/jetty-osgi-httpservice/pom.xml
index db9872a..1d68a56 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-httpservice</artifactId>
diff --git a/jetty-osgi/jetty-osgi-npn/pom.xml b/jetty-osgi/jetty-osgi-npn/pom.xml
index 0515eaa..20a2b34 100644
--- a/jetty-osgi/jetty-osgi-npn/pom.xml
+++ b/jetty-osgi/jetty-osgi-npn/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty.osgi</groupId>
     <artifactId>jetty-osgi-project</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-osgi-npn</artifactId>
diff --git a/jetty-osgi/pom.xml b/jetty-osgi/pom.xml
index cf27138..13092a4 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jetty.osgi</groupId>
   <artifactId>jetty-osgi-project</artifactId>
diff --git a/jetty-osgi/test-jetty-osgi-context/pom.xml b/jetty-osgi/test-jetty-osgi-context/pom.xml
index 03634fd..d6cad44 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>test-jetty-osgi-context</artifactId>
diff --git a/jetty-osgi/test-jetty-osgi-webapp/pom.xml b/jetty-osgi/test-jetty-osgi-webapp/pom.xml
index 444840f..18b13fb 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-osgi/test-jetty-osgi/pom.xml b/jetty-osgi/test-jetty-osgi/pom.xml
index 85d0989..19ef69b 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-plus/pom.xml b/jetty-plus/pom.xml
index d1bacea..e3a3a49 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-plus</artifactId>
diff --git a/jetty-proxy/pom.xml b/jetty-proxy/pom.xml
index 27353e1..031e1f4 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-proxy</artifactId>
diff --git a/jetty-rewrite/pom.xml b/jetty-rewrite/pom.xml
index cdbf469..011a764 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-rewrite</artifactId>
diff --git a/jetty-runner/pom.xml b/jetty-runner/pom.xml
index ec57a92..0f6dff6 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.eclipse.jetty</groupId>
diff --git a/jetty-security/pom.xml b/jetty-security/pom.xml
index 9aa83c7..2e91241 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-security</artifactId>
diff --git a/jetty-server/pom.xml b/jetty-server/pom.xml
index 04c86c6..439f48a 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-server</artifactId>
diff --git a/jetty-server/src/main/config/etc/jetty.xml b/jetty-server/src/main/config/etc/jetty.xml
index 2d9b859..668980e 100644
--- a/jetty-server/src/main/config/etc/jetty.xml
+++ b/jetty-server/src/main/config/etc/jetty.xml
@@ -47,11 +47,6 @@
         <Arg name="minThreads" type="int">10</Arg>
         <Arg name="maxThreads" type="int">200</Arg>
         <Arg name="idleTimeout" type="int">60000</Arg>
-        <!-- Arg >
-          <New class="org.eclipse.jetty.util.ConcurrentArrayBlockingQueue$Unbounded">
-            <Arg type='int'>32</Arg>
-          </New>
-        </Arg --> 
         <Set name="detailedDump">false</Set>
       </New>
     </Arg>
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncNCSARequestLog.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncNCSARequestLog.java
index 300d23c..9c5d461 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncNCSARequestLog.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AsyncNCSARequestLog.java
@@ -22,7 +22,7 @@
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.TimeUnit;
 
-import org.eclipse.jetty.util.ConcurrentArrayBlockingQueue;
+import org.eclipse.jetty.util.BlockingArrayQueue;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
@@ -42,7 +42,7 @@
     {
         this(null,null);
     }
-    
+
     public AsyncNCSARequestLog(BlockingQueue<String> queue)
     {
         this(null,queue);
@@ -52,12 +52,12 @@
     {
         this(filename,null);
     }
-    
+
     public AsyncNCSARequestLog(String filename,BlockingQueue<String> queue)
     {
         super(filename);
         if (queue==null)
-            queue=new ConcurrentArrayBlockingQueue.Unbounded<String>();
+            queue=new BlockingArrayQueue<>(1024);
         _queue=queue;
     }
 
@@ -67,7 +67,7 @@
         {
             setName("AsyncNCSARequestLog@"+Integer.toString(AsyncNCSARequestLog.this.hashCode(),16));
         }
-        
+
         @Override
         public void run()
         {
@@ -78,7 +78,7 @@
                     String log = _queue.poll(10,TimeUnit.SECONDS);
                     if (log!=null)
                         AsyncNCSARequestLog.super.write(log);
-                    
+
                     while(!_queue.isEmpty())
                     {
                         log=_queue.poll();
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 6d913fb..72d6ee3 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
@@ -303,7 +303,8 @@
      *
      * @param virtualHosts
      *            Array of virtual hosts that this context responds to. A null host name or null/empty array means any hostname is acceptable. Host names may be
-     *            String representation of IP addresses. Host names may start with '*.' to wildcard one level of names.
+     *            String representation of IP addresses. Host names may start with '*.' to wildcard one level of names. Host names may start with '@', in which case they
+     *            will match the {@link Connector#getName()} for the request.
      */
     public void addVirtualHosts(String[] virtualHosts)
     {
@@ -817,8 +818,8 @@
             if (!_contextListeners.isEmpty())
             {
                 ServletContextEvent event = new ServletContextEvent(_scontext);
-                for (ServletContextListener listener : _contextListeners)
-                    callContextDestroyed(listener,event);
+                for (int i = _contextListeners.size(); i-->0;) 
+                    callContextDestroyed(_contextListeners.get(i),event);
             }
 
             if (_errorHandler != null)
@@ -1093,20 +1094,15 @@
                 if (!_requestListeners.isEmpty())
                 {
                     final ServletRequestEvent sre = new ServletRequestEvent(_scontext,request);
-                    ListIterator<ServletRequestListener> iter = _requestListeners.listIterator(_requestListeners.size());
-                    while (iter.hasNext())
-                        iter.next();
-                    while (iter.hasPrevious())
-                        iter.previous().requestDestroyed(sre);
+                    for (int i=_requestListeners.size();i-->0;)
+                        _requestListeners.get(i).requestDestroyed(sre);
                 }
 
                 if (!_requestAttributeListeners.isEmpty())
                 {
                     ListIterator<ServletRequestAttributeListener> iter = _requestAttributeListeners.listIterator(_requestAttributeListeners.size());
-                    while(iter.hasNext())
-                        iter.next();
-                    while(iter.hasPrevious())
-                        baseRequest.removeEventListener(iter.previous());
+                    for (int i=_requestAttributeListeners.size();i-->0;)
+                        baseRequest.removeEventListener(_requestAttributeListeners.get(i));
                 }
             }
         }
diff --git a/jetty-servlet/pom.xml b/jetty-servlet/pom.xml
index 552e4b2..aa46b77 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-servlet</artifactId>
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 9baefac..4aa3b5d 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
@@ -208,6 +208,9 @@
         _filterNameMappings=null;
 
         _servletPathMap=null;
+        
+        _matchBeforeIndex=-1;
+        _matchAfterIndex=-1;
     }
 
     /* ------------------------------------------------------------ */
@@ -1053,7 +1056,7 @@
     public void addFilterMapping (FilterMapping mapping)
     {
         if (mapping != null)
-        { 
+        {
             Source source = (mapping.getFilterHolder()==null?null:mapping.getFilterHolder().getSource());
             FilterMapping[] mappings =getFilterMappings();
             if (mappings==null || mappings.length==0)
diff --git a/jetty-servlets/pom.xml b/jetty-servlets/pom.xml
index 0e0f464..606a020 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-servlets</artifactId>
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 bd5a21b..03752cb 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
@@ -26,26 +26,22 @@
 import java.util.regex.Pattern;
 import java.util.zip.Deflater;
 import java.util.zip.DeflaterOutputStream;
-import java.util.zip.GZIPOutputStream;
 
+import javax.servlet.AsyncEvent;
+import javax.servlet.AsyncListener;
 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.ServletResponseWrapper;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
 
-import org.eclipse.jetty.continuation.Continuation;
-import org.eclipse.jetty.continuation.ContinuationListener;
-import org.eclipse.jetty.continuation.ContinuationSupport;
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.servlets.gzip.AbstractCompressedStream;
 import org.eclipse.jetty.servlets.gzip.CompressedResponseWrapper;
-import org.eclipse.jetty.util.StringUtil;
+import org.eclipse.jetty.servlets.gzip.GzipOutputStream;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 
@@ -129,6 +125,9 @@
     protected int _minGzipSize=256;
     protected int _deflateCompressionLevel=Deflater.DEFAULT_COMPRESSION;
     protected boolean _deflateNoWrap = true;
+    
+    // non-static, as other GzipFilter instances may have different configurations
+    protected final ThreadLocal<Deflater> _deflater = new ThreadLocal<Deflater>();
 
     protected final Set<String> _methods=new HashSet<String>();
     protected Set<String> _excludedAgents;
@@ -296,10 +295,10 @@
         }
         finally
         {
-            Continuation continuation = ContinuationSupport.getContinuation(request);
-                if (continuation.isSuspended() && continuation.isResponseWrapped())
+            if (request.isAsyncStarted())
             {
-                continuation.addContinuationListener(new ContinuationListenerWaitingForWrappedResponseToFinish(wrappedResponse));
+                 
+                request.getAsyncContext().addListener(new FinishOnCompleteListener(wrappedResponse));
             }
             else if (exceptional && !response.isCommitted())
             {
@@ -403,64 +402,55 @@
     protected CompressedResponseWrapper createWrappedResponse(HttpServletRequest request, HttpServletResponse response, final String compressionType)
     {
         CompressedResponseWrapper wrappedResponse = null;
-        if (compressionType==null)
+        wrappedResponse = new CompressedResponseWrapper(request,response)
         {
-            wrappedResponse = new CompressedResponseWrapper(request,response)
+            @Override
+            protected AbstractCompressedStream newCompressedStream(HttpServletRequest request, HttpServletResponse response) throws IOException
             {
-                @Override
-                protected AbstractCompressedStream newCompressedStream(HttpServletRequest request,HttpServletResponse response) throws IOException
+                return new AbstractCompressedStream(compressionType,request,this,_vary)
                 {
-                    return new AbstractCompressedStream(null,request,this,_vary)
+                    private Deflater _allocatedDeflater;
+
+                    @Override
+                    protected DeflaterOutputStream createStream() throws IOException
                     {
-                        @Override
-                        protected DeflaterOutputStream createStream() throws IOException
+                        if (compressionType == null)
                         {
                             return null;
                         }
-                    };
-                }
-            };
-        }
-        else if (compressionType.equals(GZIP))
-        {
-            wrappedResponse = new CompressedResponseWrapper(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
+                        
+                        // acquire deflater instance
+                        _allocatedDeflater = _deflater.get();   
+                        if (_allocatedDeflater==null)
+                            _allocatedDeflater = new Deflater(_deflateCompressionLevel,_deflateNoWrap);
+                        else
                         {
-                            return new GZIPOutputStream(_response.getOutputStream(),_bufferSize);
+                            _deflater.remove();
+                            _allocatedDeflater.reset();
                         }
-                    };
-                }
-            };
-        }
-        else if (compressionType.equals(DEFLATE))
-        {
-            wrappedResponse = new CompressedResponseWrapper(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
+                        
+                        switch (compressionType)
                         {
-                            return new DeflaterOutputStream(_response.getOutputStream(),new Deflater(_deflateCompressionLevel,_deflateNoWrap));
+                            case GZIP:
+                                return new GzipOutputStream(_response.getOutputStream(),_allocatedDeflater,_bufferSize);
+                            case DEFLATE:
+                                return new DeflaterOutputStream(_response.getOutputStream(),_allocatedDeflater,_bufferSize);
                         }
-                    };
-                }
-            };
-        } 
-        else
-        {
-            throw new IllegalStateException(compressionType + " not supported");
-        }
+                        throw new IllegalStateException(compressionType + " not supported");
+                    }
+
+                    @Override
+                    public void finish() throws IOException
+                    {
+                        super.finish();
+                        if (_allocatedDeflater != null && _deflater.get() == null)
+                        {
+                            _deflater.set(_allocatedDeflater);
+                        }
+                    }
+                };
+            }
+        };
         configureWrappedResponse(wrappedResponse);
         return wrappedResponse;
     }
@@ -472,18 +462,18 @@
         wrappedResponse.setMinCompressSize(_minGzipSize);
     }
 
-    private class ContinuationListenerWaitingForWrappedResponseToFinish implements ContinuationListener
+    private class FinishOnCompleteListener implements AsyncListener
     {    
         private CompressedResponseWrapper wrappedResponse;
 
-        public ContinuationListenerWaitingForWrappedResponseToFinish(CompressedResponseWrapper wrappedResponse)
+        public FinishOnCompleteListener(CompressedResponseWrapper wrappedResponse)
         {
             this.wrappedResponse = wrappedResponse;
         }
 
         @Override
-        public void onComplete(Continuation continuation)
-        {
+        public void onComplete(AsyncEvent event) throws IOException
+        {          
             try
             {
                 wrappedResponse.finish();
@@ -495,7 +485,17 @@
         }
 
         @Override
-        public void onTimeout(Continuation continuation)
+        public void onTimeout(AsyncEvent event) throws IOException
+        {
+        }
+
+        @Override
+        public void onError(AsyncEvent event) throws IOException
+        {
+        }
+
+        @Override
+        public void onStartAsync(AsyncEvent event) throws IOException
         {
         }
     }
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
index 3ea1c2a..ec125b9 100644
--- 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
@@ -29,13 +29,12 @@
 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.continuation.Continuation;
-import org.eclipse.jetty.continuation.ContinuationListener;
-import org.eclipse.jetty.continuation.ContinuationSupport;
 import org.eclipse.jetty.http.HttpMethod;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.handler.HandlerWrapper;
@@ -265,12 +264,28 @@
                 }
                 finally
                 {
-                    Continuation continuation = ContinuationSupport.getContinuation(request);
-                    if (continuation.isSuspended() && continuation.isResponseWrapped())
+                    if (request.isAsyncStarted())
                     {
-                        continuation.addContinuationListener(new ContinuationListener()
+                        request.getAsyncContext().addListener(new AsyncListener()
                         {
-                            public void onComplete(Continuation continuation)
+                            
+                            @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
                                 {
@@ -281,9 +296,6 @@
                                     LOG.warn(e);
                                 }
                             }
-
-                            public void onTimeout(Continuation continuation)
-                            {}
                         });
                     }
                     else if (exceptional && !response.isCommitted())
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
new file mode 100644
index 0000000..8f20c2f
--- /dev/null
+++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/gzip/GzipOutputStream.java
@@ -0,0 +1,71 @@
+//
+//  ========================================================================
+//  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
+//  ------------------------------------------------------------------------
+//  All rights reserved. This program and the accompanying materials
+//  are made available under the terms of the Eclipse Public License v1.0
+//  and Apache License v2.0 which accompanies this distribution.
+//
+//      The Eclipse Public License is available at
+//      http://www.eclipse.org/legal/epl-v10.html
+//
+//      The Apache License v2.0 is available at
+//      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;
+import java.util.zip.DeflaterOutputStream;
+
+/**
+ * Reimplementation of {@link java.util.zip.GZIPOutputStream} that supports reusing a {@link Deflater} instance.
+ */
+public class GzipOutputStream extends DeflaterOutputStream
+{
+
+    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, int size) throws IOException
+    {
+        super(out,deflater,size);
+        out.write(GZIP_HEADER);
+    }
+
+    public synchronized void write(byte[] buf, int off, int len) throws IOException
+    {
+        super.write(buf,off,len);
+        _crc.update(buf,off,len);
+    }
+
+    public 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/test/java/org/eclipse/jetty/servlets/PipelineHelper.java b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PipelineHelper.java
index 8e2fea7..95f0a23 100644
--- a/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PipelineHelper.java
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/servlets/PipelineHelper.java
@@ -219,8 +219,8 @@
             int val = inputStream.read();
             try
             {
-                if (left % 10 == 0)
-                    Thread.sleep(1);
+                if (left % 1000 == 0)
+                    Thread.sleep(10);
             }
             catch (InterruptedException e)
             {
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 f9296ce..61ff30a 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
@@ -18,7 +18,6 @@
 
 package org.eclipse.jetty.servlets;
 
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
@@ -42,7 +41,9 @@
 import org.eclipse.jetty.util.BufferUtil;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
+import org.hamcrest.Matchers;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -91,8 +92,10 @@
 
         _doneRequests.await(10,TimeUnit.SECONDS);
 
-        assertFalse("TEST WAS NOT PARALLEL ENOUGH!",TestServlet.__maxSleepers<=MAX_QOS);
-        assertTrue(TestServlet.__maxSleepers<=NUM_CONNECTIONS);
+        if (TestServlet.__maxSleepers<=MAX_QOS)
+            LOG.warn("TEST WAS NOT PARALLEL ENOUGH!");
+        else
+            Assert.assertThat(TestServlet.__maxSleepers,Matchers.lessThanOrEqualTo(NUM_CONNECTIONS));
     }
 
     @Test
@@ -109,8 +112,10 @@
         }
 
         _doneRequests.await(10,TimeUnit.SECONDS);
-        assertFalse("TEST WAS NOT PARALLEL ENOUGH!",TestServlet.__maxSleepers<MAX_QOS);
-        assertTrue(TestServlet.__maxSleepers==MAX_QOS);
+        if (TestServlet.__maxSleepers<MAX_QOS)
+            LOG.warn("TEST WAS NOT PARALLEL ENOUGH!");
+        else
+            Assert.assertEquals(TestServlet.__maxSleepers,MAX_QOS);
     }
 
     @Test
@@ -126,8 +131,10 @@
         }
 
         _doneRequests.await(20,TimeUnit.SECONDS);
-        assertFalse("TEST WAS NOT PARALLEL ENOUGH!",TestServlet.__maxSleepers<MAX_QOS);
-        assertTrue(TestServlet.__maxSleepers<=MAX_QOS);
+        if (TestServlet.__maxSleepers<MAX_QOS)
+            LOG.warn("TEST WAS NOT PARALLEL ENOUGH!");
+        else
+            Assert.assertEquals(TestServlet.__maxSleepers,MAX_QOS);
     }
 
     class Worker implements Runnable {
@@ -137,6 +144,7 @@
             _num = num;
         }
 
+        @Override
         public void run()
         {
             for (int i=0;i<NUM_LOOPS;i++)
@@ -170,6 +178,7 @@
             _num = num;
         }
 
+        @Override
         public void run()
         {
             URL url=null;
@@ -198,6 +207,7 @@
         private static int __sleepers;
         private static int __maxSleepers;
 
+        @Override
         protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
         {
             try
@@ -232,6 +242,7 @@
 
     public static class QoSFilter2 extends QoSFilter
     {
+        @Override
         public int getPriority(ServletRequest request)
         {
             String p = request.getParameter("priority");
diff --git a/jetty-spdy/pom.xml b/jetty-spdy/pom.xml
index 7b3020b..8b3fa2d 100644
--- a/jetty-spdy/pom.xml
+++ b/jetty-spdy/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty</groupId>
         <artifactId>jetty-project</artifactId>
-        <version>9.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-spdy/spdy-client/pom.xml b/jetty-spdy/spdy-client/pom.xml
index 9bb89ae..4c70d34 100644
--- a/jetty-spdy/spdy-client/pom.xml
+++ b/jetty-spdy/spdy-client/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty.spdy</groupId>
         <artifactId>spdy-parent</artifactId>
-        <version>9.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-spdy/spdy-core/pom.xml b/jetty-spdy/spdy-core/pom.xml
index 3bd7e71..423f327 100644
--- a/jetty-spdy/spdy-core/pom.xml
+++ b/jetty-spdy/spdy-core/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty.spdy</groupId>
         <artifactId>spdy-parent</artifactId>
-        <version>9.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
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
index a0bda51..30dc870 100644
--- 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
@@ -244,7 +244,6 @@
     @Override
     public PingResultInfo ping(PingInfo pingInfo) throws ExecutionException, InterruptedException, TimeoutException
     {
-        //TODO: find a better name for PingResultInfo
         FuturePromise<PingResultInfo> result = new FuturePromise<>();
         ping(pingInfo, result);
         if (pingInfo.getTimeout() > 0)
@@ -548,10 +547,10 @@
                 int maxConcurrentStreams = maxConcurrentLocalStreams;
                 if (maxConcurrentStreams > -1 && oldStreamCountValue >= maxConcurrentStreams)
                 {
-                    String msg = String.format("Max concurrent local streams (%d) exceeded.",
+                    String message = String.format("Max concurrent local streams (%d) exceeded.",
                             maxConcurrentStreams);
-                    LOG.debug(msg);
-                    promise.failed(new SPDYException(msg));
+                    LOG.debug(message);
+                    promise.failed(new SPDYException(message));
                     return null;
                 }
                 if (localStreamCount.compareAndSet(oldStreamCountValue, oldStreamCountValue + 1))
@@ -561,22 +560,17 @@
 
         if (streams.putIfAbsent(streamId, stream) != null)
         {
-            //TODO: fail promise
+            String message = "Duplicate stream id " + streamId;
+            IllegalStateException duplicateIdException = new IllegalStateException(message);
+            promise.failed(duplicateIdException);
             if (local)
             {
                 localStreamCount.decrementAndGet();
-                throw new IllegalStateException("Duplicate stream id " + streamId);
+                throw duplicateIdException;
             }
             RstInfo rstInfo = new RstInfo(streamId, StreamStatus.PROTOCOL_ERROR);
             LOG.debug("Duplicate stream, {}", rstInfo);
-            try
-            {
-                rst(rstInfo); //TODO: non blocking reset or find the reason why blocking is used
-            }
-            catch (InterruptedException | ExecutionException | TimeoutException e)
-            {
-                e.printStackTrace(); // TODO: really catch???
-            }
+            rst(rstInfo, new Callback.Adapter()); // We don't care (too much) if the reset fails.
             return null;
         }
         else
diff --git a/jetty-spdy/spdy-example-webapp/pom.xml b/jetty-spdy/spdy-example-webapp/pom.xml
index 37830b2..1045409 100644
--- a/jetty-spdy/spdy-example-webapp/pom.xml
+++ b/jetty-spdy/spdy-example-webapp/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty.spdy</groupId>
         <artifactId>spdy-parent</artifactId>
-        <version>9.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>spdy-example-webapp</artifactId>
diff --git a/jetty-spdy/spdy-http-server/pom.xml b/jetty-spdy/spdy-http-server/pom.xml
index c3ec31e..5be0935 100644
--- a/jetty-spdy/spdy-http-server/pom.xml
+++ b/jetty-spdy/spdy-http-server/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty.spdy</groupId>
         <artifactId>spdy-parent</artifactId>
-        <version>9.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>spdy-http-server</artifactId>
diff --git a/jetty-spdy/spdy-server/pom.xml b/jetty-spdy/spdy-server/pom.xml
index 0bd4ca8..d489447 100644
--- a/jetty-spdy/spdy-server/pom.xml
+++ b/jetty-spdy/spdy-server/pom.xml
@@ -3,7 +3,7 @@
     <parent>
         <groupId>org.eclipse.jetty.spdy</groupId>
         <artifactId>spdy-parent</artifactId>
-        <version>9.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-spring/pom.xml b/jetty-spring/pom.xml
index 97e3aa4..a6f68be 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-spring</artifactId>
diff --git a/jetty-start/pom.xml b/jetty-start/pom.xml
index 240d08c..ea93a42 100644
--- a/jetty-start/pom.xml
+++ b/jetty-start/pom.xml
@@ -2,7 +2,7 @@
   <parent>
     <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-project</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-start</artifactId>
diff --git a/jetty-util-ajax/pom.xml b/jetty-util-ajax/pom.xml
index 247bfd2..073591a 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-util-ajax</artifactId>
diff --git a/jetty-util/pom.xml b/jetty-util/pom.xml
index 01bf1fb..0ea0ce3 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-util</artifactId>
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
index 4ffc802..6aa3287 100644
--- 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
@@ -31,7 +31,6 @@
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.eclipse.jetty.util.BlockingArrayQueue;
-import org.eclipse.jetty.util.ConcurrentArrayBlockingQueue;
 import org.eclipse.jetty.util.StringUtil;
 import org.eclipse.jetty.util.annotation.ManagedAttribute;
 import org.eclipse.jetty.util.annotation.ManagedObject;
@@ -90,9 +89,9 @@
         setMaxThreads(maxThreads);
         setIdleTimeout(idleTimeout);
         setStopTimeout(5000);
-        
+
         if (queue==null)
-            queue=new ConcurrentArrayBlockingQueue.Unbounded<Runnable>();
+            queue=new BlockingArrayQueue<>(_minThreads, _minThreads);
         _jobs=queue;
 
     }
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/QueueBenchmarkTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/QueueBenchmarkTest.java
index 8990102..750c288 100644
--- a/jetty-util/src/test/java/org/eclipse/jetty/util/QueueBenchmarkTest.java
+++ b/jetty-util/src/test/java/org/eclipse/jetty/util/QueueBenchmarkTest.java
@@ -29,15 +29,13 @@
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jetty.toolchain.test.AdvancedRunner;
-import org.eclipse.jetty.toolchain.test.annotation.Slow;
+import org.eclipse.jetty.toolchain.test.annotation.Stress;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
 import org.junit.Assume;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-@Ignore
 @RunWith(AdvancedRunner.class)
 public class QueueBenchmarkTest
 {
@@ -57,7 +55,7 @@
         }
     };
 
-    @Slow
+    @Stress("High CPU")
     @Test
     public void testQueues() throws Exception
     {
@@ -77,7 +75,7 @@
         testQueues(readers, writers, iterations, queues, false);
     }
 
-    @Slow
+    @Stress("High CPU")
     @Test
     public void testBlockingQueues() throws Exception
     {
diff --git a/jetty-webapp/pom.xml b/jetty-webapp/pom.xml
index f397e92..0f9acf2 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-webapp</artifactId>
diff --git a/jetty-websocket/pom.xml b/jetty-websocket/pom.xml
index 8633efc..0f43381 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.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-websocket/websocket-api/pom.xml b/jetty-websocket/websocket-api/pom.xml
index f850046..dc96e78 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.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-websocket/websocket-client/pom.xml b/jetty-websocket/websocket-client/pom.xml
index ae00946..955cd56 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.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-websocket/websocket-common/pom.xml b/jetty-websocket/websocket-common/pom.xml
index eb05238..21e74f2 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/ExtensionStack.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/ExtensionStack.java
index c3e266e..29450cf 100644
--- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/ExtensionStack.java
+++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/extensions/ExtensionStack.java
@@ -251,19 +251,35 @@
     {
         StringBuilder s = new StringBuilder();
         s.append("ExtensionStack[");
-        s.append("extensions=[");
-        boolean delim = false;
-        for (Extension ext : extensions)
+        s.append("extensions=");
+        if (extensions == null)
         {
-            if (delim)
-            {
-                s.append(',');
-            }
-            s.append(ext.getName());
-            delim = true;
+            s.append("<null>");
         }
-        s.append("],incoming=").append(this.nextIncoming.getClass().getName());
-        s.append(",outgoing=").append(this.nextOutgoing.getClass().getName());
+        else
+        {
+            s.append('[');
+            boolean delim = false;
+            for (Extension ext : extensions)
+            {
+                if (delim)
+                {
+                    s.append(',');
+                }
+                if (ext == null)
+                {
+                    s.append("<null>");
+                }
+                else
+                {
+                    s.append(ext.getName());
+                }
+                delim = true;
+            }
+            s.append(']');
+        }
+        s.append(",incoming=").append((this.nextIncoming == null)?"<null>":this.nextIncoming.getClass().getName());
+        s.append(",outgoing=").append((this.nextOutgoing == null)?"<null>":this.nextOutgoing.getClass().getName());
         s.append("]");
         return s.toString();
     }
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 8b2825a..096dc82 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
@@ -160,4 +160,12 @@
             stack.stop();
         }
     }
+
+    @Test
+    public void testToString()
+    {
+        ExtensionStack stack = createExtensionStack();
+        // Shouldn't cause a NPE.
+        LOG.debug("Shouldn't cause a NPE: {}",stack.toString());
+    }
 }
diff --git a/jetty-websocket/websocket-server/pom.xml b/jetty-websocket/websocket-server/pom.xml
index 25b9506..a17191e 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.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-websocket/websocket-servlet/pom.xml b/jetty-websocket/websocket-servlet/pom.xml
index abe6ee6..9c5f225 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.0.2-SNAPSHOT</version>
+        <version>9.0.3-SNAPSHOT</version>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
diff --git a/jetty-xml/pom.xml b/jetty-xml/pom.xml
index d8a39e8..b3e283d 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>jetty-xml</artifactId>
diff --git a/pom.xml b/pom.xml
index 91afeb5..33384ea 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
     <version>20</version>
   </parent>
   <artifactId>jetty-project</artifactId>
-  <version>9.0.2-SNAPSHOT</version>
+  <version>9.0.3-SNAPSHOT</version>
   <name>Jetty :: Project</name>
   <url>${jetty.url}</url>
   <packaging>pom</packaging>
diff --git a/tests/pom.xml b/tests/pom.xml
index 707898b..44f156e 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <groupId>org.eclipse.jetty.tests</groupId>
diff --git a/tests/test-continuation/pom.xml b/tests/test-continuation/pom.xml
index e0da1c4..d9b484d 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
diff --git a/tests/test-loginservice/pom.xml b/tests/test-loginservice/pom.xml
index 99e5b6d..cf0e34c 100644
--- a/tests/test-loginservice/pom.xml
+++ b/tests/test-loginservice/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>tests-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <artifactId>test-loginservice</artifactId>
   <name>Jetty Tests :: Login Service</name>
diff --git a/tests/test-sessions/pom.xml b/tests/test-sessions/pom.xml
index dac1976..1d59cd9 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <artifactId>test-sessions-parent</artifactId>
   <name>Jetty Tests :: Sessions :: Parent</name>
diff --git a/tests/test-sessions/test-hash-sessions/pom.xml b/tests/test-sessions/test-hash-sessions/pom.xml
index 5a52c04..446da47 100644
--- a/tests/test-sessions/test-hash-sessions/pom.xml
+++ b/tests/test-sessions/test-hash-sessions/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-sessions-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <artifactId>test-hash-sessions</artifactId>
   <name>Jetty Tests :: Sessions :: Hash</name>
diff --git a/tests/test-sessions/test-jdbc-sessions/pom.xml b/tests/test-sessions/test-jdbc-sessions/pom.xml
index 46e03ba..1337d07 100644
--- a/tests/test-sessions/test-jdbc-sessions/pom.xml
+++ b/tests/test-sessions/test-jdbc-sessions/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-sessions-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <artifactId>test-jdbc-sessions</artifactId>
   <name>Jetty Tests :: Sessions :: JDBC</name>
diff --git a/tests/test-sessions/test-sessions-common/pom.xml b/tests/test-sessions/test-sessions-common/pom.xml
index 7c7a8b6..f32cfbc 100644
--- a/tests/test-sessions/test-sessions-common/pom.xml
+++ b/tests/test-sessions/test-sessions-common/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-sessions-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <artifactId>test-sessions-common</artifactId>
   <name>Jetty Tests :: Sessions :: Common</name>
diff --git a/tests/test-webapps/pom.xml b/tests/test-webapps/pom.xml
index f6ae886..60cd972 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <artifactId>test-webapps-parent</artifactId>
diff --git a/tests/test-webapps/test-jaas-webapp/pom.xml b/tests/test-webapps/test-jaas-webapp/pom.xml
index fbffd7d..a743267 100644
--- a/tests/test-webapps/test-jaas-webapp/pom.xml
+++ b/tests/test-webapps/test-jaas-webapp/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <artifactId>test-jaas-webapp</artifactId>
   <name>Jetty Tests :: WebApp :: JAAS</name>
diff --git a/tests/test-webapps/test-jetty-webapp/pom.xml b/tests/test-webapps/test-jetty-webapp/pom.xml
index 6aae466..9da9751 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
diff --git a/tests/test-webapps/test-jetty-webapp/src/main/config/webapps/test.xml b/tests/test-webapps/test-jetty-webapp/src/main/config/webapps/test.xml
index 1bef8ab..ff7eb6b 100644
--- a/tests/test-webapps/test-jetty-webapp/src/main/config/webapps/test.xml
+++ b/tests/test-webapps/test-jetty-webapp/src/main/config/webapps/test.xml
@@ -45,7 +45,10 @@
   <!-- virtual hosts
   <Set name="virtualHosts">
     <Array type="String">
-      <Item>www.myVirtualDomain.com</Item>
+      <Item>www.MyVirtualDomain.com</Item>
+      <Item>m.MyVirtualDomain.com</Item>
+      <Item>*.OtherVirtualDomain.com</Item>
+      <Item>@ConnectorName</Item>
       <Item>localhost</Item>
       <Item>127.0.0.1</Item>
     </Array>
diff --git a/tests/test-webapps/test-jndi-webapp/pom.xml b/tests/test-webapps/test-jndi-webapp/pom.xml
index dd1a649..f6a62de 100644
--- a/tests/test-webapps/test-jndi-webapp/pom.xml
+++ b/tests/test-webapps/test-jndi-webapp/pom.xml
@@ -4,7 +4,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <artifactId>test-jndi-webapp</artifactId>
   <name>Jetty Tests :: WebApp :: JNDI</name>
diff --git a/tests/test-webapps/test-mock-resources/pom.xml b/tests/test-webapps/test-mock-resources/pom.xml
index 010dd00..6714ae3 100644
--- a/tests/test-webapps/test-mock-resources/pom.xml
+++ b/tests/test-webapps/test-mock-resources/pom.xml
@@ -3,7 +3,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <name>Jetty Tests :: WebApp :: Mock Resources</name>
   <artifactId>test-mock-resources</artifactId>
diff --git a/tests/test-webapps/test-proxy-webapp/pom.xml b/tests/test-webapps/test-proxy-webapp/pom.xml
index 9aaf34d..8facf19 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
diff --git a/tests/test-webapps/test-servlet-spec/pom.xml b/tests/test-webapps/test-servlet-spec/pom.xml
index 6c61e57..b36590c 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.0.2-SNAPSHOT</version>
+    <version>9.0.3-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 fe27436..603cdbe 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,7 +3,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-servlet-spec-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <artifactId>test-container-initializer</artifactId>
   <packaging>jar</packaging>
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 3ae3cc3..2572855 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,7 +4,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-servlet-spec-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <name>Jetty Tests :: Webapps :: Spec Webapp</name>
   <artifactId>test-spec-webapp</artifactId>
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 3206a0b..ce89abd 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,7 +3,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-servlet-spec-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <name>Jetty Tests :: WebApp :: Servlet Spec :: Fragment Jar</name>
   <groupId>org.eclipse.jetty.tests</groupId>
diff --git a/tests/test-webapps/test-webapp-rfc2616/pom.xml b/tests/test-webapps/test-webapp-rfc2616/pom.xml
index 0dd389f..f96b4c5 100644
--- a/tests/test-webapps/test-webapp-rfc2616/pom.xml
+++ b/tests/test-webapps/test-webapp-rfc2616/pom.xml
@@ -21,7 +21,7 @@
   <parent>
     <groupId>org.eclipse.jetty.tests</groupId>
     <artifactId>test-webapps-parent</artifactId>
-    <version>9.0.2-SNAPSHOT</version>
+    <version>9.0.3-SNAPSHOT</version>
   </parent>
   <artifactId>test-webapp-rfc2616</artifactId>
   <name>Jetty Tests :: WebApp :: RFC2616</name>