diff --git a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
index 080b7bd..7581605 100644
--- a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
+++ b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
@@ -52,14 +52,13 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
-import org.eclipse.jetty.http.HttpVersion;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.ssl.SslHandshakeListener;
 import org.eclipse.jetty.server.ConnectionFactory;
+import org.eclipse.jetty.server.DetectorConnectionFactory;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.NetworkConnector;
-import org.eclipse.jetty.server.OptionalSslConnectionFactory;
 import org.eclipse.jetty.server.SecureRequestCustomizer;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
@@ -185,7 +184,7 @@
     private boolean _compressResponses;
 
     private final Map<HttpPort<?>, ServerConnector> _portConnectorMap = new ConcurrentHashMap<>();
-    private final Map<HttpPort<?>, SslContextFactory> _sslContextFactoryMap = new ConcurrentHashMap<>();
+    private final Map<HttpPort<?>, SslContextFactory.Server> _sslContextFactoryMap = new ConcurrentHashMap<>();
     private final BrokerChangeListener _brokerChangeListener = new BrokerChangeListener();
 
     private volatile boolean _serveUncompressedDojo;
@@ -390,7 +389,8 @@
         root.addServlet(new ServletHolder(new TimeZoneServlet()), "/service/timezones");
 
         final Iterable<ContentFactory> contentFactories = new QpidServiceLoader().instancesOf(ContentFactory.class);
-        contentFactories.forEach(f->{
+        contentFactories.forEach(f ->
+        {
             ServletHolder metricsServlet = new ServletHolder(new ContentServlet(f));
             String path = f.getType().toLowerCase();
             root.addServlet(metricsServlet, "/" + path);
@@ -454,7 +454,8 @@
                   .stream()
                   .map(Class::getSimpleName)
                   .map(String::toLowerCase)
-                  .forEach(name -> {
+                  .forEach(name ->
+                  {
                       root.addServlet(apiDocsServletHolder, "/apidocs/latest/" + name + "/");
                       root.addServlet(apiDocsServletHolder, "/apidocs/" + version + "/" + name + "/");
                       root.addServlet(apiDocsServletHolder, "/apidocs/latest/" + name);
@@ -518,16 +519,18 @@
     @Override
     public boolean updateSSLContext(final HttpPort httpPort)
     {
-        final SslContextFactory sslContextFactory = getSslContextFactory(httpPort);
+        final SslContextFactory.Server sslContextFactory = getSslContextFactory(httpPort);
         if ( sslContextFactory != null)
         {
             try
             {
                 final SSLContext sslContext = createSslContext(httpPort);
-                sslContextFactory.reload(f -> {
-                    f.setSslContext(sslContext);
-                    f.setNeedClientAuth(httpPort.getNeedClientAuth());
-                    f.setWantClientAuth(httpPort.getWantClientAuth());
+                sslContextFactory.reload(f ->
+                {
+                    final SslContextFactory.Server server = (SslContextFactory.Server) f;
+                    server.setSslContext(sslContext);
+                    server.setNeedClientAuth(httpPort.getNeedClientAuth());
+                    server.setWantClientAuth(httpPort.getWantClientAuth());
                 });
                 return true;
             }
@@ -539,7 +542,7 @@
         return false;
     }
 
-    private SslContextFactory getSslContextFactory(final HttpPort httpPort)
+    private SslContextFactory.Server getSslContextFactory(final HttpPort httpPort)
     {
         return _sslContextFactoryMap.get(httpPort);
     }
@@ -566,7 +569,7 @@
 
         ConnectionFactory[] connectionFactories;
         Collection<Transport> transports = port.getTransports();
-        SslContextFactory sslContextFactory = null;
+        SslContextFactory.Server sslContextFactory = null;
         if (!transports.contains(Transport.SSL))
         {
             connectionFactories = new ConnectionFactory[]{httpConnectionFactory};
@@ -578,7 +581,7 @@
                     new SslConnectionFactory(sslContextFactory, httpConnectionFactory.getProtocol());
             if (port.getTransports().contains(Transport.TCP))
             {
-                sslConnectionFactory = new OptionalSslConnectionFactory((SslConnectionFactory)sslConnectionFactory, HttpVersion.HTTP_1_1.asString());
+                sslConnectionFactory = new DetectorConnectionFactory((ConnectionFactory.Detecting) sslConnectionFactory);
             }
             connectionFactories = new ConnectionFactory[]{sslConnectionFactory, httpConnectionFactory};
         }
@@ -647,7 +650,6 @@
             });
         }
 
-
         int acceptors = connector.getAcceptors();
         int selectors = connector.getSelectorManager().getSelectorCount();
         if (LOGGER.isDebugEnabled())
@@ -680,7 +682,7 @@
         return connector;
     }
 
-    private SslContextFactory createSslContextFactory(final HttpPort<?> port)
+    private SslContextFactory.Server createSslContextFactory(final HttpPort<?> port)
     {
         SslContextFactory.Server factory = new SslContextFactory.Server()
         {
diff --git a/broker-plugins/websocket/src/main/java/org/apache/qpid/server/transport/websocket/WebSocketProvider.java b/broker-plugins/websocket/src/main/java/org/apache/qpid/server/transport/websocket/WebSocketProvider.java
index 810cc95..8fc2582 100644
--- a/broker-plugins/websocket/src/main/java/org/apache/qpid/server/transport/websocket/WebSocketProvider.java
+++ b/broker-plugins/websocket/src/main/java/org/apache/qpid/server/transport/websocket/WebSocketProvider.java
@@ -81,14 +81,13 @@
 import org.apache.qpid.server.transport.network.security.ssl.SSLUtil;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
 
-
 class WebSocketProvider implements AcceptingTransport
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketProvider.class);
     private static final String AMQP_WEBSOCKET_SUBPROTOCOL = "amqp";
 
     private final Transport _transport;
-    private final SslContextFactory _sslContextFactory;
+    private final SslContextFactory.Server _sslContextFactory;
     private final AmqpPort<?> _port;
     private final Broker<?> _broker;
     private final Set<Protocol> _supported;
@@ -188,10 +187,10 @@
             public void configure(final WebSocketServletFactory factory)
             {
                 factory.setCreator((req, resp) ->
-                                   {
-                                       resp.setAcceptedSubProtocol(AMQP_WEBSOCKET_SUBPROTOCOL);
-                                       return new AmqpWebSocket();
-                                   });
+                {
+                    resp.setAcceptedSubProtocol(AMQP_WEBSOCKET_SUBPROTOCOL);
+                    return new AmqpWebSocket();
+                });
             }
 
             @Override
@@ -249,7 +248,7 @@
 
     }
 
-    private SslContextFactory createSslContextFactory(final AmqpPort<?> port)
+    private SslContextFactory.Server createSslContextFactory(final AmqpPort<?> port)
     {
         SslContextFactory.Server sslContextFactory = new SslContextFactory.Server()
         {
@@ -311,10 +310,12 @@
         {
             try
             {
-                _sslContextFactory.reload(f -> {
-                    f.setSslContext(_port.getSSLContext());
-                    f.setNeedClientAuth(_port.getNeedClientAuth());
-                    f.setWantClientAuth(_port.getWantClientAuth());
+                _sslContextFactory.reload(f ->
+                {
+                    final SslContextFactory.Server server = (SslContextFactory.Server) f;
+                    server.setSslContext(_port.getSSLContext());
+                    server.setNeedClientAuth(_port.getNeedClientAuth());
+                    server.setWantClientAuth(_port.getWantClientAuth());
                 });
                 return true;
             }
