diff --git a/http/cometd/pom.xml b/http/cometd/pom.xml
index 6c220fd..0c6e435 100644
--- a/http/cometd/pom.xml
+++ b/http/cometd/pom.xml
@@ -38,7 +38,7 @@
     </scm>
 
     <properties>
-        <felix.java.version>7</felix.java.version>
+        <felix.java.version>8</felix.java.version>
     </properties>
 
     <build>
diff --git a/http/cometd/src/main/java/org/apache/felix/http/cometd/internal/CometdServiceImpl.java b/http/cometd/src/main/java/org/apache/felix/http/cometd/internal/CometdServiceImpl.java
index c163e69..7462f41 100644
--- a/http/cometd/src/main/java/org/apache/felix/http/cometd/internal/CometdServiceImpl.java
+++ b/http/cometd/src/main/java/org/apache/felix/http/cometd/internal/CometdServiceImpl.java
@@ -24,7 +24,7 @@
 import org.apache.felix.http.base.internal.logger.SystemLogger;
 import org.apache.felix.http.cometd.CometdService;
 import org.cometd.bayeux.server.BayeuxServer;
-import org.cometd.server.CometdServlet;
+import org.cometd.server.CometDServlet;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -46,14 +46,14 @@
     private ServiceRegistration configServiceReg;
     private ServiceTracker httpServiceTracker;
     private ServiceRegistration cometdServiceReg;
-    private CometdServlet continuationCometdServlet;
+    private CometDServlet continuationCometdServlet;
 
     public CometdServiceImpl(BundleContext context)
     {
         this.context = context;
         this.config = new CometdConfig(this.context);
     }
-    
+
     public void start()
         throws Exception
     {
@@ -77,6 +77,7 @@
         }
     }
 
+    @Override
     public void updated(Dictionary props)
     {
         this.config.update(props);
@@ -89,6 +90,7 @@
         }
     }
 
+    @Override
     public Object addingService(ServiceReference reference)
     {
         Object service = this.context.getService(reference);
@@ -96,12 +98,14 @@
         return service;
     }
 
+    @Override
     public void modifiedService(ServiceReference reference, Object service)
     {
         this.unregister((HttpService)service);
         this.register((HttpService)service);
     }
 
+    @Override
     public void removedService(ServiceReference reference, Object service)
     {
         this.unregister((HttpService)service);
@@ -109,7 +113,7 @@
 
     private void register(HttpService httpService) {
         if (this.continuationCometdServlet == null) {
-            this.continuationCometdServlet = new CometdServlet();
+            this.continuationCometdServlet = new CometDServlet();
         }
         try {
           Dictionary dictionary = new Hashtable();
@@ -131,6 +135,7 @@
         }
     }
 
+    @Override
     public BayeuxServer getBayeuxServer() {
         return this.continuationCometdServlet.getBayeux();
     }
diff --git a/http/itest/pom.xml b/http/itest/pom.xml
index b9050f7..34a8c4b 100644
--- a/http/itest/pom.xml
+++ b/http/itest/pom.xml
@@ -31,7 +31,7 @@
 	</scm>
 
 	<properties>
-	    <felix.java.version>7</felix.java.version>
+	    <felix.java.version>8</felix.java.version>
 		<pax.exam.version>4.4.0</pax.exam.version>
 		<pax.url.aether.version>2.4.1</pax.url.aether.version>
 		<http.servlet.api.version>1.1.3-SNAPSHOT</http.servlet.api.version>
diff --git a/http/jetty/pom.xml b/http/jetty/pom.xml
index 16987b8..73a0781 100644
--- a/http/jetty/pom.xml
+++ b/http/jetty/pom.xml
@@ -38,7 +38,7 @@
     </scm>
     
     <properties>
-        <felix.java.version>7</felix.java.version>
+        <felix.java.version>8</felix.java.version>
     	<!-- jetty.version is moved to http-parent POM -->
     </properties>
 
diff --git a/http/parent/pom.xml b/http/parent/pom.xml
index 1132a9c..ea8a0ce 100755
--- a/http/parent/pom.xml
+++ b/http/parent/pom.xml
@@ -38,8 +38,8 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    	<jetty.version>9.2.14.v20151106</jetty.version>
-    	<cometd.version>2.8.0</cometd.version>
+    	<jetty.version>9.3.6.v20151106</jetty.version>
+    	<cometd.version>3.0.8</cometd.version>
     	<servlet.version>3.1.0</servlet.version>
         <!--
             Java API and class file compliance. This property supports
diff --git a/http/samples/cometd/pom.xml b/http/samples/cometd/pom.xml
index 823721b..ce7709a 100644
--- a/http/samples/cometd/pom.xml
+++ b/http/samples/cometd/pom.xml
@@ -37,6 +37,10 @@
         <url>http://svn.apache.org/viewvc/felix/trunk/http/samples/cometd/</url>
     </scm>
 
+    <properties>
+        <felix.java.version>8</felix.java.version>
+    </properties>
+
     <build>
         <plugins>
             <plugin>
diff --git a/http/samples/cometd/src/main/java/org/apache/felix/http/samples/cometd/TimeServlet.java b/http/samples/cometd/src/main/java/org/apache/felix/http/samples/cometd/TimeServlet.java
index 4876f2e..d9b81dd 100644
--- a/http/samples/cometd/src/main/java/org/apache/felix/http/samples/cometd/TimeServlet.java
+++ b/http/samples/cometd/src/main/java/org/apache/felix/http/samples/cometd/TimeServlet.java
@@ -31,6 +31,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.cometd.bayeux.MarkedReference;
 import org.cometd.bayeux.server.BayeuxServer;
 import org.cometd.bayeux.server.ConfigurableServerChannel;
 import org.cometd.bayeux.server.LocalSession;
@@ -58,81 +59,81 @@
         "    <script type='text/javascript' src='/js/dojo/dojo.js'></script>\n" +
         "    <script type='text/javascript'>\n" +
         "      dojo.require('dojox.cometd');\n" +
-        "dojo.addOnLoad(function()\n" + 
-        "{\n" + 
-        "    var cometd = dojox.cometd;\n" + 
-        "\n" + 
-        "    function _connectionEstablished()\n" + 
-        "    {\n" + 
-        "        dojo.byId('body').innerHTML += '<div>CometD Connection Established</div>';\n" + 
-        "    }\n" + 
-        "\n" + 
-        "    function _connectionBroken()\n" + 
-        "    {\n" + 
-        "        dojo.byId('body').innerHTML += '<div>CometD Connection Broken</div>';\n" + 
-        "    }\n" + 
-        "\n" + 
-        "    function _connectionClosed()\n" + 
-        "    {\n" + 
-        "        dojo.byId('body').innerHTML += '<div>CometD Connection Closed</div>';\n" + 
-        "    }\n" + 
-        "\n" + 
-        "    // Function that manages the connection status with the Bayeux server\n" + 
-        "    var _connected = false;\n" + 
-        "    function _metaConnect(message)\n" + 
-        "    {\n" + 
-        "        if (cometd.isDisconnected())\n" + 
-        "        {\n" + 
-        "            _connected = false;\n" + 
-        "            _connectionClosed();\n" + 
-        "            return;\n" + 
-        "        }\n" + 
-        "\n" + 
-        "        var wasConnected = _connected;\n" + 
-        "        _connected = message.successful === true;\n" + 
-        "        if (!wasConnected && _connected)\n" + 
-        "        {\n" + 
-        "            _connectionEstablished();\n" + 
-        "        }\n" + 
-        "        else if (wasConnected && !_connected)\n" + 
-        "        {\n" + 
-        "            _connectionBroken();\n" + 
-        "        }\n" + 
-        "    }\n" + 
-        "\n" + 
-        "    // Function invoked when first contacting the server and\n" + 
-        "    // when the server has lost the state of this client\n" + 
-        "    function _metaHandshake(handshake)\n" + 
-        "    {\n" + 
-        "        if (handshake.successful === true)\n" + 
-        "        {\n" + 
-        "            cometd.batch(function()\n" + 
-        "            {\n" + 
-        "                cometd.subscribe('/System/Time', function(message)\n" + 
-        "                {\n" + 
-        "                    dojo.byId('systemTime').innerHTML = '<div>' + message.data + '</div>';\n" + 
-        "                });\n" + 
-        "            });\n" + 
-        "        }\n" + 
-        "    }\n" + 
-        "\n" + 
-        "    // Disconnect when the page unloads\n" + 
-        "    dojo.addOnUnload(function()\n" + 
-        "    {\n" + 
-        "        cometd.disconnect(true);\n" + 
-        "    });\n" + 
-        "\n" + 
-        "    var cometURL = \"http://localhost:8080/system/cometd\";\n" + 
-        "    cometd.configure({\n" + 
-        "        url: cometURL,\n" + 
-        "        logLevel: 'debug'\n" + 
-        "    });\n" + 
-        "\n" + 
-        "    cometd.addListener('/meta/handshake', _metaHandshake);\n" + 
-        "    cometd.addListener('/meta/connect', _metaConnect);\n" + 
-        "\n" + 
-        "    cometd.handshake();\n" + 
-        "});\n" + 
+        "dojo.addOnLoad(function()\n" +
+        "{\n" +
+        "    var cometd = dojox.cometd;\n" +
+        "\n" +
+        "    function _connectionEstablished()\n" +
+        "    {\n" +
+        "        dojo.byId('body').innerHTML += '<div>CometD Connection Established</div>';\n" +
+        "    }\n" +
+        "\n" +
+        "    function _connectionBroken()\n" +
+        "    {\n" +
+        "        dojo.byId('body').innerHTML += '<div>CometD Connection Broken</div>';\n" +
+        "    }\n" +
+        "\n" +
+        "    function _connectionClosed()\n" +
+        "    {\n" +
+        "        dojo.byId('body').innerHTML += '<div>CometD Connection Closed</div>';\n" +
+        "    }\n" +
+        "\n" +
+        "    // Function that manages the connection status with the Bayeux server\n" +
+        "    var _connected = false;\n" +
+        "    function _metaConnect(message)\n" +
+        "    {\n" +
+        "        if (cometd.isDisconnected())\n" +
+        "        {\n" +
+        "            _connected = false;\n" +
+        "            _connectionClosed();\n" +
+        "            return;\n" +
+        "        }\n" +
+        "\n" +
+        "        var wasConnected = _connected;\n" +
+        "        _connected = message.successful === true;\n" +
+        "        if (!wasConnected && _connected)\n" +
+        "        {\n" +
+        "            _connectionEstablished();\n" +
+        "        }\n" +
+        "        else if (wasConnected && !_connected)\n" +
+        "        {\n" +
+        "            _connectionBroken();\n" +
+        "        }\n" +
+        "    }\n" +
+        "\n" +
+        "    // Function invoked when first contacting the server and\n" +
+        "    // when the server has lost the state of this client\n" +
+        "    function _metaHandshake(handshake)\n" +
+        "    {\n" +
+        "        if (handshake.successful === true)\n" +
+        "        {\n" +
+        "            cometd.batch(function()\n" +
+        "            {\n" +
+        "                cometd.subscribe('/System/Time', function(message)\n" +
+        "                {\n" +
+        "                    dojo.byId('systemTime').innerHTML = '<div>' + message.data + '</div>';\n" +
+        "                });\n" +
+        "            });\n" +
+        "        }\n" +
+        "    }\n" +
+        "\n" +
+        "    // Disconnect when the page unloads\n" +
+        "    dojo.addOnUnload(function()\n" +
+        "    {\n" +
+        "        cometd.disconnect(true);\n" +
+        "    });\n" +
+        "\n" +
+        "    var cometURL = \"http://localhost:8080/system/cometd\";\n" +
+        "    cometd.configure({\n" +
+        "        url: cometURL,\n" +
+        "        logLevel: 'debug'\n" +
+        "    });\n" +
+        "\n" +
+        "    cometd.addListener('/meta/handshake', _metaHandshake);\n" +
+        "    cometd.addListener('/meta/connect', _metaConnect);\n" +
+        "\n" +
+        "    cometd.handshake();\n" +
+        "});\n" +
         "    </script>\n" +
         "  </head>\n" +
         "  <body>\n" +
@@ -145,14 +146,13 @@
         this.bayeuxServer = bayeuxServer;
         this.channels = new ArrayList<ServerChannel>();
         for (SystemTopics topic : SystemTopics.values()) {
-        	boolean created = bayeuxServer.createIfAbsent("/System/" + topic, new ServerChannel.Initializer() {
-				public void configureChannel(ConfigurableServerChannel channel) {
+        	MarkedReference<ServerChannel> created = bayeuxServer.createChannelIfAbsent("/System/" + topic, new ConfigurableServerChannel.Initializer() {
+				@Override
+                public void configureChannel(ConfigurableServerChannel channel) {
 					channel.setPersistent(true);
 				}
         	});
-        	if (created) {
-        		this.channels.add(topic.ordinal(), this.bayeuxServer.getChannel("/System/" + topic));
-        	}
+    		this.channels.add(topic.ordinal(), created.getReference());
         }
         this.logDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
 		this.updateTimer = new Timer("System.Time.ClientNotifier");
@@ -196,6 +196,7 @@
         extends TimerTask
     {
 
+        @Override
         public void run() {
             for (SystemTopics topic : SystemTopics.values()) {
                 String topicData;
@@ -209,7 +210,7 @@
                 ServerMessage.Mutable message = bayeuxServer.newMessage();
                 message.setChannel(channels.get(topic.ordinal()).getId());
                 message.setData(topicData);
-                channels.get(topic.ordinal()).publish(session, topicData, null);
+                channels.get(topic.ordinal()).publish(session, message);
             }
         }
     }
