diff --git a/http/jetty/pom.xml b/http/jetty/pom.xml
index 828b318..735868e 100644
--- a/http/jetty/pom.xml
+++ b/http/jetty/pom.xml
@@ -38,7 +38,7 @@
     </scm>
     
     <properties>
-    	<jetty.version>7.6.12.v20130726</jetty.version>
+    	<jetty.version>9.0.5.v20130815</jetty.version>
     </properties>
 
     <build>
diff --git a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyConfig.java b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyConfig.java
index cbac529..bcc5162 100644
--- a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyConfig.java
+++ b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyConfig.java
@@ -60,7 +60,7 @@
 
     /** Felix specific property to control whether to enable HTTPS. */
     private static final String FELIX_HTTPS_ENABLE = "org.apache.felix.https.enable";
-    private static final String OSCAR_HTTPS_ENABLE   = "org.ungoverned.osgi.bundle.https.enable";
+    private static final String OSCAR_HTTPS_ENABLE = "org.ungoverned.osgi.bundle.https.enable";
 
     /** Felix specific property to control whether to enable HTTP. */
     private static final String FELIX_HTTP_ENABLE = "org.apache.felix.http.enable";
@@ -75,10 +75,10 @@
     private static final String FELIX_HTTPS_CLIENT_CERT = "org.apache.felix.https.clientcertificate";
 
     /** Felix specific property to control whether Jetty uses NIO or not for HTTP. Valid values are "true", "false". Default is true */
-    public static final String  FELIX_HTTP_NIO = "org.apache.felix.http.nio";
+    public static final String FELIX_HTTP_NIO = "org.apache.felix.http.nio";
 
     /** Felix specific property to control whether Jetty uses NIO or not for HTTPS. Valid values are "true", "false". Default is the value of org.apache.felix.http.nio */
-    public static final String  FELIX_HTTPS_NIO = "org.apache.felix.https.nio";
+    public static final String FELIX_HTTPS_NIO = "org.apache.felix.https.nio";
 
     /** Felix specific property to configure the session timeout in minutes (same session-timout in web.xml). Default is servlet container specific */
     public static final String FELIX_SESSION_TIMEOUT = "org.apache.felix.http.session.timeout";
@@ -146,8 +146,7 @@
     }
 
     /**
-     * Returns <code>true</code> if HTTP is configured to be used (
-     * {@link #FELIX_HTTP_ENABLE}) and
+     * Returns <code>true</code> if HTTP is configured to be used ( {@link #FELIX_HTTP_ENABLE}) and
      * the configured HTTP port ({@link #HTTP_PORT}) is higher than zero.
      */
     public boolean isUseHttp()
@@ -155,14 +154,14 @@
         return this.useHttp && getHttpPort() > 0;
     }
 
+    @Deprecated
     public boolean isUseHttpNio()
     {
         return this.useHttpNio;
     }
 
     /**
-     * Returns <code>true</code> if HTTPS is configured to be used (
-     * {@link #FELIX_HTTPS_ENABLE}) and
+     * Returns <code>true</code> if HTTPS is configured to be used ( {@link #FELIX_HTTPS_ENABLE}) and
      * the configured HTTP port ({@link #HTTPS_PORT}) is higher than zero.
      */
     public boolean isUseHttps()
@@ -170,6 +169,7 @@
         return this.useHttps && getHttpsPort() > 0;
     }
 
+    @Deprecated
     public boolean isUseHttpsNio()
     {
         return this.useHttpsNio;
@@ -277,8 +277,10 @@
         this.httpTimeout = getIntProperty(props, HTTP_TIMEOUT, 60000);
         this.keystore = getProperty(props, FELIX_KEYSTORE, this.context.getProperty(OSCAR_KEYSTORE));
         this.password = getProperty(props, FELIX_KEYSTORE_PASSWORD, this.context.getProperty(OSCAR_KEYSTORE_PASSWORD));
-        this.keyPassword = getProperty(props, FELIX_KEYSTORE_KEY_PASSWORD, this.context.getProperty(OSCAR_KEYSTORE_KEY_PASSWORD));
-        this.useHttps = getBooleanProperty(props, FELIX_HTTPS_ENABLE, getBooleanProperty(props, OSCAR_HTTPS_ENABLE, false));
+        this.keyPassword =
+            getProperty(props, FELIX_KEYSTORE_KEY_PASSWORD, this.context.getProperty(OSCAR_KEYSTORE_KEY_PASSWORD));
+        this.useHttps =
+            getBooleanProperty(props, FELIX_HTTPS_ENABLE, getBooleanProperty(props, OSCAR_HTTPS_ENABLE, false));
         this.useHttp = getBooleanProperty(props, FELIX_HTTP_ENABLE, true);
         this.truststore = getProperty(props, FELIX_TRUSTSTORE, null);
         this.trustPassword = getProperty(props, FELIX_TRUSTSTORE_PASSWORD, null);
@@ -327,7 +329,8 @@
     {
         try {
             return Integer.parseInt(getProperty(props, name, null));
-        } catch (Exception e) {
+        }
+        catch (Exception e) {
             return defValue;
         }
     }
@@ -342,7 +345,7 @@
         if (value instanceof String)
         {
             return new String[]
-                { (String) value };
+            { (String) value };
         }
         else if (value instanceof String[])
         {
@@ -428,7 +431,8 @@
     {
         try {
             return Integer.parseInt(getProperty(name, null));
-        } catch (Exception e) {
+        }
+        catch (Exception e) {
             return defValue;
         }
     }
diff --git a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyLogger.java b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyLogger.java
index 4f89666..edfcfcc 100644
--- a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyLogger.java
+++ b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyLogger.java
@@ -54,57 +54,57 @@
         this.debugEnabled = enabled;
     }
 
-	public void debug(Throwable throwable) {
-		if (this.debugEnabled) {
-			SystemLogger.debug(throwable.getMessage());
-		}
-		
-	}
+    public void debug(Throwable throwable) {
+        if (this.debugEnabled) {
+            SystemLogger.debug(throwable.getMessage());
+        }
 
-	public void debug(String msg, Object... args) {
-		if (this.debugEnabled) {
-			SystemLogger.debug(MessageFormat.format(msg, args));
-		}
-	}
+    }
 
-	public void debug(String msg, Throwable throwable) {
-		if (this.debugEnabled) {
-			SystemLogger.debug(msg + ": " + throwable.getMessage());
-		}
-	}
+    public void debug(String msg, Object... args) {
+        if (this.debugEnabled) {
+            SystemLogger.debug(MessageFormat.format(msg, args));
+        }
+    }
 
-	public String getName() {
-		return name;
-	}
+    public void debug(String msg, Throwable throwable) {
+        if (this.debugEnabled) {
+            SystemLogger.debug(msg + ": " + throwable.getMessage());
+        }
+    }
 
-	public void ignore(Throwable throwable) {
-		
-	}
+    public String getName() {
+        return name;
+    }
 
-	public void info(Throwable throwable) {
-		SystemLogger.info(throwable.getMessage());
-	}
+    public void ignore(Throwable throwable) {
 
-	public void info(String msg, Object... args) {
-		SystemLogger.info(MessageFormat.format(msg, args));
-		
-	}
+    }
 
-	public void info(String msg, Throwable throwable) {
-		SystemLogger.info(msg + ": " + throwable.getMessage());
-	}
+    public void info(Throwable throwable) {
+        SystemLogger.info(throwable.getMessage());
+    }
 
-	public void warn(Throwable throwable) {
-		SystemLogger.warning(null, throwable);
-	}
+    public void info(String msg, Object... args) {
+        SystemLogger.info(MessageFormat.format(msg, args));
 
-	public void warn(String msg, Object... args) {
-		SystemLogger.warning(MessageFormat.format(msg, args), null);
-		
-	}
+    }
 
-	public void warn(String msg, Throwable throwable) {
-		SystemLogger.warning(msg, throwable);
-	}
+    public void info(String msg, Throwable throwable) {
+        SystemLogger.info(msg + ": " + throwable.getMessage());
+    }
+
+    public void warn(Throwable throwable) {
+        SystemLogger.warning(null, throwable);
+    }
+
+    public void warn(String msg, Object... args) {
+        SystemLogger.warning(MessageFormat.format(msg, args), null);
+
+    }
+
+    public void warn(String msg, Throwable throwable) {
+        SystemLogger.warning(msg, throwable);
+    }
 
 }
diff --git a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java
index 4dc0a36..43a2d93 100644
--- a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java
+++ b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java
@@ -34,25 +34,29 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 
+import javax.servlet.ServletContext;
+
 import org.apache.felix.http.base.internal.DispatcherServlet;
 import org.apache.felix.http.base.internal.EventDispatcher;
 import org.apache.felix.http.base.internal.HttpServiceController;
 import org.apache.felix.http.base.internal.logger.SystemLogger;
 import org.eclipse.jetty.security.HashLoginService;
 import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.ConnectorStatistics;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.server.SessionManager;
-import org.eclipse.jetty.server.bio.SocketConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
 import org.eclipse.jetty.server.handler.StatisticsHandler;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
-import org.eclipse.jetty.server.ssl.SslConnector;
-import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
-import org.eclipse.jetty.server.ssl.SslSocketConnector;
+import org.eclipse.jetty.server.session.HashSessionManager;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.eclipse.jetty.util.component.AbstractLifeCycle;
 import org.eclipse.jetty.util.component.LifeCycle;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
@@ -66,11 +70,9 @@
 import org.osgi.util.tracker.ServiceTracker;
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
-import javax.servlet.ServletContext;
-
 public final class JettyService
-        extends AbstractLifeCycle.AbstractLifeCycleListener
-        implements BundleTrackerCustomizer, ServiceTrackerCustomizer
+    extends AbstractLifeCycle.AbstractLifeCycleListener
+    implements BundleTrackerCustomizer, ServiceTrackerCustomizer
 {
     /** PID for configuration of the HTTP service. */
     private static final String PID = "org.apache.felix.http";
@@ -119,8 +121,8 @@
             new JettyManagedService(this), props);
 
         this.executor = Executors.newSingleThreadExecutor(new ThreadFactory() {
-           public Thread newThread(Runnable runnable)
-           {
+            public Thread newThread(Runnable runnable)
+            {
                 Thread t = new Thread(runnable);
                 t.setName("Jetty HTTP Service");
                 return t;
@@ -175,7 +177,7 @@
     {
         this.config.update(props);
 
-        if (this.executor != null  && !this.executor.isShutdown()) {
+        if (this.executor != null && !this.executor.isShutdown()) {
             this.executor.submit(new JettyOperation() {
                 @Override
                 protected void doExecute() throws Exception {
@@ -190,7 +192,8 @@
     {
         try {
             initializeJetty();
-        } catch (Exception e) {
+        }
+        catch (Exception e) {
             SystemLogger.error("Exception while initializing Jetty.", e);
         }
     }
@@ -222,16 +225,13 @@
     {
         if (this.config.isUseHttp() || this.config.isUseHttps())
         {
-            StringBuffer message = new StringBuffer("Started jetty ").append(Server.getVersion()).append(" at port(s)");
-            HashLoginService realm = new HashLoginService("OSGi HTTP Service Realm");
             this.server = new Server();
             this.server.addLifeCycleListener(this);
 
-            // HTTP/1.1 requires Date header if possible (it is)
-            this.server.setSendDateHeader(true);
-
+            HashLoginService realm = new HashLoginService("OSGi HTTP Service Realm");
             this.server.addBean(realm);
 
+            StringBuffer message = new StringBuffer("Started jetty ").append(Server.getVersion()).append(" at port(s)");
             if (this.config.isUseHttp())
             {
                 initializeHttp();
@@ -247,7 +247,7 @@
             this.parent = new ContextHandlerCollection();
 
             ServletContextHandler context = new ServletContextHandler(this.parent,
-                    this.config.getContextPath(), ServletContextHandler.SESSIONS);
+                this.config.getContextPath(), ServletContextHandler.SESSIONS);
 
             message.append(" on context path ").append(this.config.getContextPath());
             configureSessionManager(context);
@@ -277,139 +277,103 @@
     private void initializeHttp()
         throws Exception
     {
-        Connector connector = this.config.isUseHttpNio()
-                ? new SelectChannelConnector()
-                : new SocketConnector();
+        HttpConfiguration config = new HttpConfiguration();
+        config.setSendDateHeader(true);
+        config.setRequestHeaderSize(this.config.getRequestBufferSize());
+        config.setResponseHeaderSize(this.config.getResponseBufferSize());
+
+        ServerConnector connector = new ServerConnector(this.server, new HttpConnectionFactory(config));
         connector.setPort(this.config.getHttpPort());
+
         configureConnector(connector);
+
         this.server.addConnector(connector);
     }
 
     private void initializeHttps()
         throws Exception
     {
-        // this massive code duplication is caused by the SslSelectChannelConnector
-        // and the SslSocketConnector not have a common API to setup security
-        // stuff
-        Connector connector;
-        if (this.config.isUseHttpsNio())
+        HttpConfiguration config = new HttpConfiguration();
+        config.setSendDateHeader(true);
+        config.setSecurePort(this.config.getHttpsPort());
+        config.setSecureScheme("https");
+        config.setRequestHeaderSize(this.config.getRequestBufferSize());
+        config.setResponseHeaderSize(this.config.getResponseBufferSize());
+
+        SslContextFactory sslContextFactory = new SslContextFactory();
+
+        if (this.config.getKeystore() != null)
         {
-            SslSelectChannelConnector sslConnector = new SslSelectChannelConnector();
-
-            if (this.config.getKeystore() != null)
-            {
-                sslConnector.setKeystore(this.config.getKeystore());
-            }
-
-            if (this.config.getPassword() != null)
-            {
-                System.setProperty(SslSelectChannelConnector.PASSWORD_PROPERTY, this.config.getPassword());
-                sslConnector.setPassword(this.config.getPassword());
-            }
-
-            if (this.config.getKeyPassword() != null)
-            {
-                System.setProperty(SslSelectChannelConnector.KEYPASSWORD_PROPERTY, this.config.getKeyPassword());
-                sslConnector.setKeyPassword(this.config.getKeyPassword());
-            }
-
-            if (this.config.getTruststore() != null)
-            {
-                sslConnector.setTruststore(this.config.getTruststore());
-            }
-
-            if (this.config.getTrustPassword() != null)
-            {
-                sslConnector.setTrustPassword(this.config.getTrustPassword());
-            }
-
-            if ("wants".equals(this.config.getClientcert()))
-            {
-                sslConnector.setWantClientAuth(true);
-            }
-            else if ("needs".equals(this.config.getClientcert()))
-            {
-                sslConnector.setNeedClientAuth(true);
-            }
-
-            connector = sslConnector;
-        }
-        else
-        {
-            SslSocketConnector sslConnector = new SslSocketConnector();
-
-            if (this.config.getKeystore() != null)
-            {
-                sslConnector.setKeystore(this.config.getKeystore());
-            }
-
-            if (this.config.getPassword() != null)
-            {
-                System.setProperty(SslSelectChannelConnector.PASSWORD_PROPERTY, this.config.getPassword());
-                sslConnector.setPassword(this.config.getPassword());
-            }
-
-            if (this.config.getKeyPassword() != null)
-            {
-                System.setProperty(SslSelectChannelConnector.KEYPASSWORD_PROPERTY, this.config.getKeyPassword());
-                sslConnector.setKeyPassword(this.config.getKeyPassword());
-            }
-
-            if (this.config.getTruststore() != null)
-            {
-                sslConnector.setTruststore(this.config.getTruststore());
-            }
-
-            if (this.config.getTrustPassword() != null)
-            {
-                sslConnector.setTrustPassword(this.config.getTrustPassword());
-            }
-
-            if ("wants".equals(this.config.getClientcert()))
-            {
-                sslConnector.setWantClientAuth(true);
-            }
-            else if ("needs".equals(this.config.getClientcert()))
-            {
-                sslConnector.setNeedClientAuth(true);
-            }
-
-            connector = sslConnector;
+            sslContextFactory.setKeyStorePath(this.config.getKeystore());
         }
 
+        if (this.config.getPassword() != null)
+        {
+            sslContextFactory.setKeyManagerPassword(this.config.getPassword());
+        }
+
+        if (this.config.getKeyPassword() != null)
+        {
+            sslContextFactory.setKeyStorePassword(this.config.getKeyPassword());
+        }
+
+        if (this.config.getTruststore() != null)
+        {
+            sslContextFactory.setTrustStorePath(this.config.getTruststore());
+        }
+
+        if (this.config.getTrustPassword() != null)
+        {
+            sslContextFactory.setTrustStorePassword(this.config.getTrustPassword());
+        }
+
+        if ("wants".equals(this.config.getClientcert()))
+        {
+            sslContextFactory.setWantClientAuth(true);
+        }
+        else if ("needs".equals(this.config.getClientcert()))
+        {
+            sslContextFactory.setNeedClientAuth(true);
+        }
+
+        ServerConnector connector =
+            new ServerConnector(this.server, new SslConnectionFactory(sslContextFactory, "http/1.1"),
+                new HttpConnectionFactory(config));
         connector.setPort(this.config.getHttpsPort());
+
         configureConnector(connector);
 
         this.server.addConnector(connector);
     }
 
-    private void configureConnector(final Connector connector)
+    private void configureConnector(final ServerConnector connector)
     {
-        connector.setMaxIdleTime(this.config.getHttpTimeout());
-        connector.setRequestBufferSize(this.config.getRequestBufferSize());
-        connector.setResponseBufferSize(this.config.getResponseBufferSize());
+        connector.setIdleTimeout(this.config.getHttpTimeout());
         connector.setHost(this.config.getHost());
-        connector.setStatsOn(this.config.isRegisterMBeans());
+        connector.setHost(this.config.getHost());
 
-        // connector.setLowResourceMaxIdleTime(ms);
-        // connector.setRequestBufferSize(requestBufferSize);
-        // connector.setResponseBufferSize(responseBufferSize);
+        if (this.config.isRegisterMBeans()) {
+            connector.addBean(new ConnectorStatistics());
+        }
     }
 
     private void configureSessionManager(final ServletContextHandler context)
     {
-        final SessionManager manager = context.getSessionHandler().getSessionManager();
+        HashSessionManager manager = new HashSessionManager();
 
         manager.setMaxInactiveInterval(this.config.getSessionTimeout() * 60);
+        manager.setSessionIdPathParameterName(this.config.getProperty(
+            SessionManager.__SessionIdPathParameterNameProperty, SessionManager.__DefaultSessionIdPathParameterName));
+        manager.setSessionCookie(this.config.getProperty(SessionManager.__SessionCookieProperty,
+            SessionManager.__DefaultSessionCookie));
+        manager.setRefreshCookieAge(this.config.getIntProperty(SessionManager.__MaxAgeProperty, -1));
+// manager.setSessionDomain(this.config.getProperty(SessionManager.__SessionDomainProperty, SessionManager.__DefaultSessionDomain));
+// manager.setSessionPath(this.config.getProperty(SessionManager.__SessionPathProperty, context.getContextPath()));
 
-        manager.setSessionCookie(this.config.getProperty(SessionManager.__SessionCookieProperty, SessionManager.__DefaultSessionCookie));
-        manager.setSessionIdPathParameterName(this.config.getProperty(SessionManager.__SessionIdPathParameterNameProperty, SessionManager.__DefaultSessionIdPathParameterName));
-        manager.setSessionDomain(this.config.getProperty(SessionManager.__SessionDomainProperty, SessionManager.__DefaultSessionDomain));
-        manager.setSessionPath(this.config.getProperty(SessionManager.__SessionPathProperty, context.getContextPath()));
-        manager.setMaxCookieAge(this.config.getIntProperty(SessionManager.__MaxAgeProperty, -1));
+        context.getSessionHandler().setSessionManager(manager);
     }
 
-    private String getEndpoint(final Connector listener, final InetAddress ia)
+    private String getEndpoint(final ServerConnector listener, final InetAddress ia)
     {
         if (ia.isLoopbackAddress())
         {
@@ -417,16 +381,16 @@
         }
 
         String address = ia.getHostAddress().trim().toLowerCase();
-        if ( ia instanceof Inet6Address )
+        if (ia instanceof Inet6Address)
         {
             // skip link-local
-            if ( address.startsWith("fe80:0:0:0:") )
+            if (address.startsWith("fe80:0:0:0:"))
             {
                 return null;
             }
             address = "[" + address + "]";
         }
-        else if ( ! ( ia instanceof Inet4Address ) )
+        else if (!(ia instanceof Inet4Address))
         {
             return null;
         }
@@ -434,19 +398,19 @@
         return getEndpoint(listener, address);
     }
 
-    private String getEndpoint(final Connector listener, final String hostname)
+    private String getEndpoint(final ServerConnector listener, final String hostname)
     {
         final StringBuilder sb = new StringBuilder();
         sb.append("http");
         int defaultPort = 80;
-        if ( listener instanceof SslConnector )
+        if (listener.getConnectionFactory("https") instanceof SslConnectionFactory)
         {
             sb.append('s');
             defaultPort = 443;
         }
         sb.append("://");
         sb.append(hostname);
-        if ( listener.getPort() != defaultPort )
+        if (listener.getPort() != defaultPort)
         {
             sb.append(':');
             sb.append(String.valueOf(listener.getPort()));
@@ -456,7 +420,7 @@
         return sb.toString();
     }
 
-    private List<String> getEndpoints(final Connector connector, final List<NetworkInterface> interfaces)
+    private List<String> getEndpoints(final ServerConnector connector, final List<NetworkInterface> interfaces)
     {
         final List<String> endpoints = new ArrayList<String>();
         for (final NetworkInterface ni : interfaces)
@@ -480,23 +444,23 @@
         final List<String> endpoints = new ArrayList<String>();
 
         final Connector[] connectors = this.server.getConnectors();
-        if ( connectors != null )
+        if (connectors != null)
         {
-            for(int i=0 ; i < connectors.length; i++)
+            for (int i = 0; i < connectors.length; i++)
             {
-                final Connector connector = connectors[i];
+                final ServerConnector connector = (ServerConnector) connectors[i];
 
-                if ( connector.getHost() == null )
+                if (connector.getHost() == null)
                 {
                     try
                     {
                         final List<NetworkInterface> interfaces = new ArrayList<NetworkInterface>();
                         final List<NetworkInterface> loopBackInterfaces = new ArrayList<NetworkInterface>();
                         final Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
-                        while ( nis.hasMoreElements() )
+                        while (nis.hasMoreElements())
                         {
                             final NetworkInterface ni = nis.nextElement();
-                            if ( ni.isLoopback() )
+                            if (ni.isLoopback())
                             {
                                 loopBackInterfaces.add(ni);
                             }
@@ -524,7 +488,7 @@
                 else
                 {
                     final String endpoint = this.getEndpoint(connector, connector.getHost());
-                    if ( endpoint != null )
+                    if (endpoint != null)
                     {
                         endpoints.add(endpoint);
                     }
@@ -542,20 +506,20 @@
         Deployment deployment = this.deployments.get(contextPath);
         if (deployment != null) {
             SystemLogger.warning(String.format(
-                    "Web application bundle %s has context path %s which is already registered",
-                    bundle.getSymbolicName(), contextPath), null);
+                "Web application bundle %s has context path %s which is already registered",
+                bundle.getSymbolicName(), contextPath), null);
             postEvent(WebEvent.FAILED(bundle, this.context.getBundle(), null, contextPath,
-                    deployment.getBundle().getBundleId()));
+                deployment.getBundle().getBundleId()));
             return null;
         }
 
         // check context path belonging to Http Service implementation
         if (contextPath.equals("/")) {
             SystemLogger.warning(String.format(
-                    "Web application bundle %s has context path %s which is reserved",
-                    bundle.getSymbolicName(), contextPath), null);
+                "Web application bundle %s has context path %s which is reserved",
+                bundle.getSymbolicName(), contextPath), null);
             postEvent(WebEvent.FAILED(bundle, this.context.getBundle(), null, contextPath,
-                    this.context.getBundle().getBundleId()));
+                this.context.getBundle().getBundleId()));
             return null;
         }
 
@@ -563,8 +527,8 @@
         for (String path : this.config.getPathExclusions()) {
             if (contextPath.startsWith(path)) {
                 SystemLogger.warning(String.format(
-                        "Web application bundle %s has context path %s which clashes with excluded path prefix %s",
-                        bundle.getSymbolicName(), contextPath, path), null);
+                    "Web application bundle %s has context path %s which clashes with excluded path prefix %s",
+                    bundle.getSymbolicName(), contextPath, path), null);
                 postEvent(WebEvent.FAILED(bundle, this.context.getBundle(), null, path, null));
                 return null;
             }
@@ -580,7 +544,7 @@
 
     public void deploy(final Deployment deployment, final WebAppBundleContext context)
     {
-        if (this.executor != null  && !this.executor.isShutdown()) {
+        if (this.executor != null && !this.executor.isShutdown()) {
             this.executor.submit(new JettyOperation() {
                 @Override
                 protected void doExecute() {
@@ -596,13 +560,15 @@
                         props.put(WEB_VERSION, webAppBundle.getVersion());
                         props.put(WEB_CONTEXT_PATH, deployment.getContextPath());
                         deployment.setRegistration(webAppBundle.getBundleContext().registerService(
-                                ServletContext.class.getName(), context.getServletContext(), props));
+                            ServletContext.class.getName(), context.getServletContext(), props));
 
                         context.getServletContext().setAttribute(OSGI_BUNDLE_CONTEXT, webAppBundle.getBundleContext());
 
                         postEvent(WebEvent.DEPLOYED(webAppBundle, extenderBundle));
-                    } catch (Exception e) {
-                        SystemLogger.error(String.format("Deploying web application bundle %s failed.", webAppBundle.getSymbolicName()), e);
+                    }
+                    catch (Exception e) {
+                        SystemLogger.error(String.format("Deploying web application bundle %s failed.",
+                            webAppBundle.getSymbolicName()), e);
                         postEvent(WebEvent.FAILED(webAppBundle, extenderBundle, e, null, null));
                         deployment.setContext(null);
                     }
@@ -614,8 +580,8 @@
 
     public void undeploy(final Deployment deployment, final WebAppBundleContext context)
     {
-        if (this.executor != null  && !this.executor.isShutdown()) {
-            this.executor.submit(new JettyOperation(){
+        if (this.executor != null && !this.executor.isShutdown()) {
+            this.executor.submit(new JettyOperation() {
                 @Override
                 protected void doExecute() {
                     final Bundle webAppBundle = deployment.getBundle();
@@ -632,9 +598,13 @@
                         }
                         deployment.setRegistration(null);
                         context.stop();
-                    } catch (Exception e) {
-                        SystemLogger.error(String.format("Undeploying web application bundle %s failed.", webAppBundle.getSymbolicName()), e);
-                    } finally {
+                    }
+                    catch (Exception e) {
+                        SystemLogger.error(
+                            String.format("Undeploying web application bundle %s failed.",
+                                webAppBundle.getSymbolicName()), e);
+                    }
+                    finally {
                         postEvent(WebEvent.UNDEPLOYED(webAppBundle, extenderBundle));
                     }
                 }
@@ -656,7 +626,7 @@
     private Object detectWebAppBundle(Bundle bundle)
     {
         if (bundle.getState() == Bundle.ACTIVE || (bundle.getState() == Bundle.STARTING &&
-                "Lazy".equals(bundle.getHeaders().get(HEADER_ACTIVATION_POLICY)))) {
+            "Lazy".equals(bundle.getHeaders().get(HEADER_ACTIVATION_POLICY)))) {
 
             String contextPath = (String) bundle.getHeaders().get(HEADER_WEB_CONTEXT_PATH);
             if (contextPath != null) {
@@ -712,7 +682,7 @@
             if (deployment.getContext() == null) {
                 postEvent(WebEvent.DEPLOYING(deployment.getBundle(), this.context.getBundle()));
                 WebAppBundleContext context = new WebAppBundleContext(deployment.getContextPath(),
-                        deployment.getBundle(), this.getClass().getClassLoader());
+                    deployment.getBundle(), this.getClass().getClassLoader());
                 deploy(deployment, context);
             }
         }
@@ -788,7 +758,8 @@
                 Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
                 doExecute();
                 return null;
-            } finally {
+            }
+            finally {
                 Thread.currentThread().setContextClassLoader(cl);
             }
         }
diff --git a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java
index be0b16e..b0e940d 100644
--- a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java
+++ b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/MBeanServerTracker.java
@@ -28,7 +28,6 @@
 
 public class MBeanServerTracker extends ServiceTracker
 {
-
     private final Server server;
 
     public MBeanServerTracker(final BundleContext context, final Server server)
@@ -42,7 +41,7 @@
     {
         MBeanServer server = (MBeanServer) super.addingService(reference);
         MBeanContainer mBeanContainer = new MBeanContainer(server);
-        this.server.getContainer().addEventListener(mBeanContainer);
+        this.server.addBean(mBeanContainer);
         return mBeanContainer;
     }
 
@@ -50,7 +49,7 @@
     public void removedService(ServiceReference reference, Object service)
     {
         MBeanContainer mBeanContainer = (MBeanContainer) service;
-        this.server.getContainer().removeEventListener(mBeanContainer);
+        this.server.removeBean(mBeanContainer);
         super.removedService(reference, mBeanContainer.getMBeanServer());
     }
 }
diff --git a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/WebAppBundleContext.java b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/WebAppBundleContext.java
index 0c50c60..590efac 100644
--- a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/WebAppBundleContext.java
+++ b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/WebAppBundleContext.java
@@ -16,18 +16,18 @@
  */
 package org.apache.felix.http.jetty.internal;
 
-import org.eclipse.jetty.util.URIUtil;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.util.resource.URLResource;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.osgi.framework.Bundle;
-
 import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Enumeration;
 
+import org.eclipse.jetty.util.URIUtil;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.util.resource.URLResource;
+import org.eclipse.jetty.webapp.WebAppContext;
+import org.osgi.framework.Bundle;
+
 class WebAppBundleContext extends WebAppContext
 {
     public WebAppBundleContext(String contextPath, final Bundle bundle, final ClassLoader parent)
@@ -42,8 +42,8 @@
                 if (bundle.getState() == Bundle.ACTIVE) {
                     try {
                         return bundle.loadClass(s);
-                    } catch (ClassNotFoundException e) {
                     }
+                    catch (ClassNotFoundException e) {}
                 }
                 return super.findClass(s);
             }
@@ -61,7 +61,7 @@
             }
 
             @Override
-            @SuppressWarnings({"unchecked"})
+            @SuppressWarnings({ "unchecked" })
             protected Enumeration<URL> findResources(String name) throws IOException {
                 // Don't try to load resources from the bundle when it is not active
                 if (bundle.getState() == Bundle.ACTIVE) {
@@ -93,7 +93,7 @@
         }
 
         @Override
-        public synchronized void release()
+        public synchronized void close()
         {
             if (this._in != null) {
                 // Do not close this input stream: it would invalidate
@@ -102,7 +102,7 @@
                 // "Inflater has been closed"
                 this._in = null;
             }
-            super.release();
+            super.close();
         }
 
         @Override
diff --git a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/WebEvent.java b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/WebEvent.java
index b5e2cc0..1124417 100644
--- a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/WebEvent.java
+++ b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/WebEvent.java
@@ -16,13 +16,13 @@
  */
 package org.apache.felix.http.jetty.internal;
 
+import java.util.Dictionary;
+import java.util.Hashtable;
+
 import org.osgi.framework.Bundle;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventConstants;
 
-import java.util.Dictionary;
-import java.util.Hashtable;
-
 public abstract class WebEvent
 {
     private static final String TOPIC_WEB_EVENT = "org/osgi/service/web";
@@ -65,9 +65,9 @@
     }
 
     static Event FAILED(Bundle webAppBundle, Bundle extenderBundle, Throwable exception,
-                        String collision, Long collisionBundles)
+        String collision, Long collisionBundles)
     {
-        Dictionary<String,Object> props = createBaseProperties(webAppBundle, extenderBundle);
+        Dictionary<String, Object> props = createBaseProperties(webAppBundle, extenderBundle);
         if (exception != null) {
             props.put(EXCEPTION, exception);
         }
@@ -80,7 +80,7 @@
         return new Event(TOPIC_FAILED, props);
     }
 
-    private static Dictionary<String,Object> createBaseProperties(Bundle webAppBundle, Bundle extenderBundle)
+    private static Dictionary<String, Object> createBaseProperties(Bundle webAppBundle, Bundle extenderBundle)
     {
         Dictionary<String, Object> props = new Hashtable<String, Object>();
         props.put(EventConstants.BUNDLE_SYMBOLICNAME, webAppBundle.getSymbolicName());
