diff --git a/http/api/pom.xml b/http/api/pom.xml
index 2f94873..e1c2519 100644
--- a/http/api/pom.xml
+++ b/http/api/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Api</name>
     <artifactId>org.apache.felix.http.api</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <scm>
@@ -45,7 +45,7 @@
                 <configuration>
                     <instructions>
                         <Export-Package>
-                            org.apache.felix.http.api;version=2.0.4
+                            org.apache.felix.http.api;version=${http.api.version}
                         </Export-Package>
                     </instructions>
                 </configuration>
diff --git a/http/base/pom.xml b/http/base/pom.xml
index eb38d42..8a5115e 100644
--- a/http/base/pom.xml
+++ b/http/base/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Base</name>
     <artifactId>org.apache.felix.http.base</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <scm>
@@ -65,7 +65,6 @@
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
-            <version>4.2.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -74,9 +73,9 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.api</artifactId>
-            <version>2.2.0</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/http/bridge/pom.xml b/http/bridge/pom.xml
index 7601355..84e907f 100644
--- a/http/bridge/pom.xml
+++ b/http/bridge/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Bridge</name>
     <artifactId>org.apache.felix.http.bridge</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <scm>
@@ -48,8 +48,8 @@
                             org.apache.felix.http.bridge.internal.BridgeActivator
                         </Bundle-Activator>
                         <Export-Package>
-                            org.apache.felix.http.api;version=2.0.4,
-                            org.osgi.service.http;version=1.2.0
+                            org.apache.felix.http.api;version=${http.api.version},
+                            org.osgi.service.http;version=${http.service.version}
                         </Export-Package>
                         <Private-Package>
                             org.apache.felix.http.base.*,
@@ -82,14 +82,14 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.api</artifactId>
-            <version>${pom.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.base</artifactId>
-            <version>${pom.version}</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/http/bundle/pom.xml b/http/bundle/pom.xml
index 93e7d67..d1db2b5 100644
--- a/http/bundle/pom.xml
+++ b/http/bundle/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Bundle</name>
     <artifactId>org.apache.felix.http.bundle</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <scm>
@@ -48,13 +48,13 @@
                             org.apache.felix.http.bundle.internal.CombinedActivator
                         </Bundle-Activator>
                         <Export-Package>
-                            org.apache.felix.http.api;version=${project.version};-split-package:=merge-first,
+                            org.apache.felix.http.api;version${http.api.version};-split-package:=merge-first,
                             org.apache.felix.http.cometd;version=${project.version};-split-package:=merge-first,
-                            org.osgi.service.http;version=1.2.0;-split-package:=merge-first,
-                            org.cometd.bayeux;version=2.4.2;-split-package:=merge-first,
-                            org.cometd.bayeux.client;version=2.4.2;-split-package:=merge-first,
-                            org.cometd.bayeux.server;version=2.4.2;-split-package:=merge-first,
-                            javax.servlet.*;version=2.5;-split-package:=merge-first
+                            org.osgi.service.http;version=${http.service.version};-split-package:=merge-first,
+                            org.cometd.bayeux;version=${cometd.version};-split-package:=merge-first,
+                            org.cometd.bayeux.client;version=${cometd.version};-split-package:=merge-first,
+                            org.cometd.bayeux.server;version=${cometd.version};-split-package:=merge-first,
+                            javax.servlet.*;version=${servlet.version};-split-package:=merge-first
                         </Export-Package>
                         <Private-Package>
                             org.apache.felix.http.base.*;-split-package:=merge-first,
@@ -97,25 +97,24 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.bridge</artifactId>
-            <version>${pom.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.cometd</artifactId>
-            <version>${pom.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.jetty</artifactId>
-            <version>${pom.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.whiteboard</artifactId>
-            <version>${pom.version}</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
-
 </project>
diff --git a/http/cometd/pom.xml b/http/cometd/pom.xml
index 1f4534d..77b2548 100644
--- a/http/cometd/pom.xml
+++ b/http/cometd/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Cometd</name>
     <artifactId>org.apache.felix.http.cometd</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <scm>
@@ -49,9 +49,9 @@
                         </Bundle-Activator>
                         <Export-Package>
                             org.apache.felix.http.cometd;version=${project.version},
-                            org.cometd.bayeux;version=2.4.2,
-                            org.cometd.bayeux.client;version=2.4.2,
-                            org.cometd.client;version=2.4.2
+                            org.cometd.bayeux;version=${cometd.version},
+                            org.cometd.bayeux.client;version=${cometd.version},
+                            org.cometd.client;version=${cometd.version}
                         </Export-Package>
                         <Private-Package>
                             org.apache.felix.http.base.*,
@@ -87,27 +87,27 @@
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-util</artifactId>
-            <version>7.6.3.v20120416</version>
+            <version>${jetty.version}</version>
         </dependency>
         <dependency>
         	<groupId>org.cometd.java</groupId>
         	<artifactId>cometd-java-server</artifactId>
-        	<version>2.4.2</version>
+        	<version>${cometd.version}</version>
         </dependency>
         <dependency>
         	<groupId>org.cometd.java</groupId>
         	<artifactId>cometd-java-client</artifactId>
-        	<version>2.4.2</version>
+        	<version>${cometd.version}</version>
         </dependency>        
         <dependency>
         	<groupId>org.cometd.java</groupId>
         	<artifactId>cometd-java-common</artifactId>
-        	<version>2.4.2</version>
+        	<version>${cometd.version}</version>
         </dependency>            
         <dependency>
             <groupId>org.cometd.java</groupId>
             <artifactId>bayeux-api</artifactId>
-            <version>2.4.2</version>
+            <version>${cometd.version}</version>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
diff --git a/http/jetty/pom.xml b/http/jetty/pom.xml
index 735868e..e474cf8 100644
--- a/http/jetty/pom.xml
+++ b/http/jetty/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Jetty</name>
     <artifactId>org.apache.felix.http.jetty</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
     
     <scm>
@@ -38,7 +38,7 @@
     </scm>
     
     <properties>
-    	<jetty.version>9.0.5.v20130815</jetty.version>
+    	<!-- jetty.version is moved to http-parent POM -->
     </properties>
 
     <build>
@@ -52,9 +52,9 @@
                             org.apache.felix.http.jetty.internal.JettyActivator
                         </Bundle-Activator>
                         <Export-Package>
-                            org.apache.felix.http.api;version=2.0.4,
-                            org.osgi.service.http,
-                            javax.servlet.*;version=2.5;-split-package:=merge-first
+                            org.apache.felix.http.api;version=${http.api.version},
+                            org.osgi.service.http;version=${http.service.version},
+                            javax.servlet.*;version=${servlet.version};-split-package:=merge-first
                         </Export-Package>
                         <Private-Package>
                             org.apache.felix.http.base.*,
@@ -81,13 +81,11 @@
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
-            <version>4.2.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
-            <version>4.2.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -127,12 +125,12 @@
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.http.api</artifactId>
-            <version>2.2.0</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.http.base</artifactId>
-            <version>2.3.0-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
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 bcc5162..cbac529 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,7 +146,8 @@
     }
 
     /**
-     * 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()
@@ -154,14 +155,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()
@@ -169,7 +170,6 @@
         return this.useHttps && getHttpsPort() > 0;
     }
 
-    @Deprecated
     public boolean isUseHttpsNio()
     {
         return this.useHttpsNio;
@@ -277,10 +277,8 @@
         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);
@@ -329,8 +327,7 @@
     {
         try {
             return Integer.parseInt(getProperty(props, name, null));
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             return defValue;
         }
     }
@@ -345,7 +342,7 @@
         if (value instanceof String)
         {
             return new String[]
-            { (String) value };
+                { (String) value };
         }
         else if (value instanceof String[])
         {
@@ -431,8 +428,7 @@
     {
         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 edfcfcc..4f89666 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, 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, Throwable throwable) {
-        if (this.debugEnabled) {
-            SystemLogger.debug(msg + ": " + throwable.getMessage());
-        }
-    }
+	public String getName() {
+		return name;
+	}
 
-    public String getName() {
-        return name;
-    }
+	public void ignore(Throwable throwable) {
+		
+	}
 
-    public void ignore(Throwable throwable) {
+	public void info(Throwable throwable) {
+		SystemLogger.info(throwable.getMessage());
+	}
 
-    }
+	public void info(String msg, Object... args) {
+		SystemLogger.info(MessageFormat.format(msg, args));
+		
+	}
 
-    public void info(Throwable throwable) {
-        SystemLogger.info(throwable.getMessage());
-    }
+	public void info(String msg, Throwable throwable) {
+		SystemLogger.info(msg + ": " + throwable.getMessage());
+	}
 
-    public void info(String msg, Object... args) {
-        SystemLogger.info(MessageFormat.format(msg, args));
+	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 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);
-    }
+	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 43a2d93..4dc0a36 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,29 +34,25 @@
 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.SslConnectionFactory;
+import org.eclipse.jetty.server.bio.SocketConnector;
 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
 import org.eclipse.jetty.server.handler.StatisticsHandler;
-import org.eclipse.jetty.server.session.HashSessionManager;
+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.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;
@@ -70,9 +66,11 @@
 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";
@@ -121,8 +119,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;
@@ -177,7 +175,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 {
@@ -192,8 +190,7 @@
     {
         try {
             initializeJetty();
-        }
-        catch (Exception e) {
+        } catch (Exception e) {
             SystemLogger.error("Exception while initializing Jetty.", e);
         }
     }
@@ -225,13 +222,16 @@
     {
         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);
 
-            HashLoginService realm = new HashLoginService("OSGi HTTP Service Realm");
+            // HTTP/1.1 requires Date header if possible (it is)
+            this.server.setSendDateHeader(true);
+
             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,103 +277,139 @@
     private void initializeHttp()
         throws Exception
     {
-        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 connector = this.config.isUseHttpNio()
+                ? new SelectChannelConnector()
+                : new SocketConnector();
         connector.setPort(this.config.getHttpPort());
-
         configureConnector(connector);
-
         this.server.addConnector(connector);
     }
 
     private void initializeHttps()
         throws Exception
     {
-        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)
+        // 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())
         {
-            sslContextFactory.setKeyStorePath(this.config.getKeystore());
+            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;
         }
 
-        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 ServerConnector connector)
+    private void configureConnector(final Connector connector)
     {
-        connector.setIdleTimeout(this.config.getHttpTimeout());
+        connector.setMaxIdleTime(this.config.getHttpTimeout());
+        connector.setRequestBufferSize(this.config.getRequestBufferSize());
+        connector.setResponseBufferSize(this.config.getResponseBufferSize());
         connector.setHost(this.config.getHost());
-        connector.setHost(this.config.getHost());
+        connector.setStatsOn(this.config.isRegisterMBeans());
 
-        if (this.config.isRegisterMBeans()) {
-            connector.addBean(new ConnectorStatistics());
-        }
+        // connector.setLowResourceMaxIdleTime(ms);
+        // connector.setRequestBufferSize(requestBufferSize);
+        // connector.setResponseBufferSize(responseBufferSize);
     }
 
     private void configureSessionManager(final ServletContextHandler context)
     {
-        HashSessionManager manager = new HashSessionManager();
+        final SessionManager manager = context.getSessionHandler().getSessionManager();
 
         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()));
 
-        context.getSessionHandler().setSessionManager(manager);
+        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));
     }
 
-    private String getEndpoint(final ServerConnector listener, final InetAddress ia)
+    private String getEndpoint(final Connector listener, final InetAddress ia)
     {
         if (ia.isLoopbackAddress())
         {
@@ -381,16 +417,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;
         }
@@ -398,19 +434,19 @@
         return getEndpoint(listener, address);
     }
 
-    private String getEndpoint(final ServerConnector listener, final String hostname)
+    private String getEndpoint(final Connector listener, final String hostname)
     {
         final StringBuilder sb = new StringBuilder();
         sb.append("http");
         int defaultPort = 80;
-        if (listener.getConnectionFactory("https") instanceof SslConnectionFactory)
+        if ( listener instanceof SslConnector )
         {
             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()));
@@ -420,7 +456,7 @@
         return sb.toString();
     }
 
-    private List<String> getEndpoints(final ServerConnector connector, final List<NetworkInterface> interfaces)
+    private List<String> getEndpoints(final Connector connector, final List<NetworkInterface> interfaces)
     {
         final List<String> endpoints = new ArrayList<String>();
         for (final NetworkInterface ni : interfaces)
@@ -444,23 +480,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 ServerConnector connector = (ServerConnector) connectors[i];
+                final Connector connector = 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);
                             }
@@ -488,7 +524,7 @@
                 else
                 {
                     final String endpoint = this.getEndpoint(connector, connector.getHost());
-                    if (endpoint != null)
+                    if ( endpoint != null )
                     {
                         endpoints.add(endpoint);
                     }
@@ -506,20 +542,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;
         }
 
@@ -527,8 +563,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;
             }
@@ -544,7 +580,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() {
@@ -560,15 +596,13 @@
                         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);
                     }
@@ -580,8 +614,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();
@@ -598,13 +632,9 @@
                         }
                         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));
                     }
                 }
@@ -626,7 +656,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) {
@@ -682,7 +712,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);
             }
         }
@@ -758,8 +788,7 @@
                 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 b0e940d..be0b16e 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,6 +28,7 @@
 
 public class MBeanServerTracker extends ServiceTracker
 {
+
     private final Server server;
 
     public MBeanServerTracker(final BundleContext context, final Server server)
@@ -41,7 +42,7 @@
     {
         MBeanServer server = (MBeanServer) super.addingService(reference);
         MBeanContainer mBeanContainer = new MBeanContainer(server);
-        this.server.addBean(mBeanContainer);
+        this.server.getContainer().addEventListener(mBeanContainer);
         return mBeanContainer;
     }
 
@@ -49,7 +50,7 @@
     public void removedService(ServiceReference reference, Object service)
     {
         MBeanContainer mBeanContainer = (MBeanContainer) service;
-        this.server.removeBean(mBeanContainer);
+        this.server.getContainer().removeEventListener(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 590efac..0c50c60 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 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;
 
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+
 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 close()
+        public synchronized void release()
         {
             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.close();
+            super.release();
         }
 
         @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 1124417..b5e2cc0 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());
diff --git a/http/parent/pom.xml b/http/parent/pom.xml
index bacb215..248b6b3 100755
--- a/http/parent/pom.xml
+++ b/http/parent/pom.xml
@@ -39,6 +39,12 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    	<jetty.version>7.6.13.v20130916</jetty.version>
+    	<cometd.version>2.7.0</cometd.version>
+    	<http.service.version>1.2.0</http.service.version>
+    	<servlet.version>2.5</servlet.version>
+
+    	<http.api.version>2.0.4</http.api.version>
     </properties>
 
     <scm>
@@ -104,19 +110,19 @@
             <dependency>
                 <groupId>javax.servlet</groupId>
                 <artifactId>servlet-api</artifactId>
-                <version>2.5</version>
+                <version>${servlet.version}</version>
                 <scope>provided</scope>
             </dependency>
             <dependency>
                 <groupId>org.osgi</groupId>
                 <artifactId>org.osgi.core</artifactId>
-                <version>4.0.0</version>
+                <version>4.2.0</version>
                 <scope>provided</scope>
             </dependency>
             <dependency>
                 <groupId>org.osgi</groupId>
                 <artifactId>org.osgi.compendium</artifactId>
-                <version>4.0.0</version>
+                <version>4.2.0</version>
                 <scope>provided</scope>
             </dependency>
         </dependencies>
diff --git a/http/proxy/pom.xml b/http/proxy/pom.xml
index 48e17ad..73d5e2f 100644
--- a/http/proxy/pom.xml
+++ b/http/proxy/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Proxy</name>
     <artifactId>org.apache.felix.http.proxy</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <scm>
diff --git a/http/samples/bridge/pom.xml b/http/samples/bridge/pom.xml
index e718180..ad4f3ca 100644
--- a/http/samples/bridge/pom.xml
+++ b/http/samples/bridge/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Samples - Bridge</name>
     <artifactId>org.apache.felix.http.samples.bridge</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>war</packaging>
 
     <scm>
@@ -119,29 +119,29 @@
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.framework</artifactId>
-            <version>1.8.1</version>
+            <version>4.2.1</version>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.proxy</artifactId>
-            <version>${pom.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.bridge</artifactId>
-            <version>${pom.version}</version>
+            <version>${project.version}</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.samples.filter</artifactId>
-            <version>${pom.version}</version>            
+            <version>${project.version}</version>            
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.webconsole</artifactId>
-            <version>1.2.8</version>
+            <version>4.2.0</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
diff --git a/http/samples/cometd/pom.xml b/http/samples/cometd/pom.xml
index 105f3b9..cfb26fa 100644
--- a/http/samples/cometd/pom.xml
+++ b/http/samples/cometd/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Samples - Cometd</name>
     <artifactId>org.apache.felix.http.samples.cometd</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <scm>
@@ -93,9 +93,9 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.cometd</artifactId>
-            <version>${pom.version}</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/http/samples/filter/pom.xml b/http/samples/filter/pom.xml
index 7daddfb..86819fc 100644
--- a/http/samples/filter/pom.xml
+++ b/http/samples/filter/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Samples - Filter</name>
     <artifactId>org.apache.felix.http.samples.filter</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <scm>
@@ -89,9 +89,9 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>${pom.groupId}</groupId>
+            <groupId>${project.groupId}</groupId>
             <artifactId>org.apache.felix.http.api</artifactId>
-            <version>${pom.version}</version>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/http/samples/whiteboard/pom.xml b/http/samples/whiteboard/pom.xml
index fbd4567..b642798 100644
--- a/http/samples/whiteboard/pom.xml
+++ b/http/samples/whiteboard/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Samples - Whiteboard</name>
     <artifactId>org.apache.felix.http.samples.whiteboard</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <scm>
diff --git a/http/sslfilter/pom.xml b/http/sslfilter/pom.xml
index 0c2ef4ad..d29ad78 100644
--- a/http/sslfilter/pom.xml
+++ b/http/sslfilter/pom.xml
@@ -21,14 +21,14 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.felix</groupId>
-        <artifactId>felix-parent</artifactId>
-        <version>2.1</version>
-        <relativePath>../../pom/pom.xml</relativePath>
+        <artifactId>org.apache.felix.http.parent</artifactId>
+        <version>2-SNAPSHOT</version>
+        <relativePath>../parent/pom.xml</relativePath>
     </parent>
 
     <name>Apache Felix Http SSL Filter</name>
     <artifactId>org.apache.felix.http.sslfilter</artifactId>
-    <version>0.1.0-SNAPSHOT</version>
+    <version>0.0.2-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <scm>
@@ -36,20 +36,16 @@
         <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/http/sslfilter</developerConnection>
         <url>http://svn.apache.org/viewvc/felix/trunk/http/sslfilter/</url>
     </scm>
+    
+    <properties>
+    	<felix.http.api.version>2.2.2-SNAPSHOT</felix.http.api.version>
+    </properties>
 
     <build>
         <plugins>
             <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.5</source>
-                    <target>1.5</target>
-                </configuration>
-            </plugin>
-            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>2.3.7</version>
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
@@ -57,7 +53,7 @@
                             org.apache.felix.http.sslfilter.internal.SslFilterActivator
                         </Bundle-Activator>
                         <Import-Package>
-                            javax.servlet.*;version="2.3",
+                            javax.servlet.*;version=${servlet.version},
                             *
                         </Import-Package>
                     </instructions>
@@ -70,26 +66,22 @@
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>servlet-api</artifactId>
-            <version>2.3</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
-            <version>4.0.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
-            <version>4.1.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.http.api</artifactId>
-            <version>2.0.2</version>
-            <scope>provided</scope>
+            <version>${felix.http.api.version}</version>
         </dependency>
 
         <!-- Test Dependencies -->
diff --git a/http/whiteboard/pom.xml b/http/whiteboard/pom.xml
index 41fe74c..c52fcb0 100644
--- a/http/whiteboard/pom.xml
+++ b/http/whiteboard/pom.xml
@@ -28,7 +28,7 @@
 
     <name>Apache Felix Http Whiteboard</name>
     <artifactId>org.apache.felix.http.whiteboard</artifactId>
-    <version>2.3.0-SNAPSHOT</version>
+    <version>2.2.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <scm>
@@ -74,13 +74,13 @@
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.http.api</artifactId>
-            <version>2.2.0</version>
+            <version>${project.version}</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.http.base</artifactId>
-            <version>2.2.0</version>
+            <version>${project.version}</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
