diff --git a/apps/fpcagent/BUCK b/apps/fpcagent/BUCK
index c4f1565..b9dfc95 100644
--- a/apps/fpcagent/BUCK
+++ b/apps/fpcagent/BUCK
@@ -14,11 +14,10 @@
     '//models/fpcagent:onos-models-fpcagent',
     '//models/common:onos-models-common',
     ':jetty-servlet',
-    ':jetty-annotations',
-    ':jetty-server-new',
-    ':jetty-io-new',
-    ':jetty-http-new',
-    ':jetty-util-new',
+    ':jetty-server',
+    ':jetty-io',
+    ':jetty-http',
+    ':jetty-util',
     '//lib:javax.servlet-api',
     ':zeromq',
     ':json',
@@ -35,10 +34,11 @@
     '//lib:httpcore-osgi',
     '//lib:org.apache.httpcomponents.httpasyncclient-osgi',
     '//lib:javax.servlet-api',
-    ':jetty-server-new',
-    ':jetty-io-new',
-    ':jetty-http-new',
-    ':jetty-util-new',
+    ':jetty-servlet',
+    ':jetty-server',
+    ':jetty-io',
+    ':jetty-http',
+    ':jetty-util',
 ]
 
 EXCLUDED_BUNDLES = [
@@ -90,11 +90,20 @@
 )
 
 remote_jar (
-  name = 'jetty-annotations',
-  out = 'jetty-annotations-8.1.19.v20160209.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-annotations:jar:8.1.19.v20160209',
-  sha1 = '649592e66a01b01956c19b80d87c03c8052413ee',
-  maven_coords = 'org.eclipse.jetty:jetty-annotations:8.1.19.v20160209',
+  name = 'jetty-util',
+  out = 'jetty-util-8.1.19.v20160209.jar',
+  url = 'mvn:org.eclipse.jetty:jetty-util:jar:8.1.19.v20160209',
+  sha1 = 'c88071e72998e6355d719d35ff001d9c327a971a',
+  maven_coords = 'org.eclipse.jetty:jetty-util:8.1.19.v20160209',
+  visibility = [ 'PUBLIC' ],
+)
+
+remote_jar (
+  name = 'jetty-server',
+  out = 'jetty-server-8.1.19.v20160209.jar',
+  url = 'mvn:org.eclipse.jetty:jetty-server:jar:8.1.19.v20160209',
+  sha1 = 'e4100696c994e26148fd0b62c8a866a606be1540',
+  maven_coords = 'org.eclipse.jetty:jetty-server:8.1.19.v20160209',
   visibility = [ 'PUBLIC' ],
 )
 
@@ -108,37 +117,20 @@
 )
 
 remote_jar (
-  name = 'jetty-server-new',
-  out = 'jetty-server-9.4.8.v20171121.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-server:jar:9.4.8.v20171121',
-  sha1 = '34614bd9a29de57ef28ca31f1f2b49a412af196d',
-  maven_coords = 'org.eclipse.jetty:jetty-server:9.4.8.v20171121',
+  name = 'jetty-http',
+  out = 'jetty-http-8.1.19.v20160209.jar',
+  url = 'mvn:org.eclipse.jetty:jetty-http:jar:8.1.19.v20160209',
+  sha1 = 'f08c189eab9a45810644ec35440f1a0c8aa0c4e0',
+  maven_coords = 'org.eclipse.jetty:jetty-http:8.1.19.v20160209',
   visibility = [ 'PUBLIC' ],
 )
 
 remote_jar (
-  name = 'jetty-io-new',
-  out = 'jetty-io-9.4.8.v20171121.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-io:jar:9.4.8.v20171121',
-  sha1 = 'd3fe2dfa62f52ee91ff07cb359f63387e0e30b40',
-  maven_coords = 'org.eclipse.jetty:jetty-io:9.4.8.v20171121',
+  name = 'jetty-io',
+  out = 'jetty-io-8.1.19.v20160209.jar',
+  url = 'mvn:org.eclipse.jetty:jetty-io:jar:8.1.19.v20160209',
+  sha1 = 'c35e77e419169b4c8ad5fa3429865f2c8541e972',
+  maven_coords = 'org.eclipse.jetty:jetty-io:8.1.19.v20160209',
   visibility = [ 'PUBLIC' ],
 )
 
-remote_jar (
-  name = 'jetty-http-new',
-  out = 'jetty-http-9.4.8.v20171121.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-http:jar:9.4.8.v20171121',
-  sha1 = '9879d6c4e37400bf43f0cd4b3c6e34a3ba409864',
-  maven_coords = 'org.eclipse.jetty:jetty-http:9.4.8.v20171121',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jetty-util-new',
-  out = 'jetty-util-9.4.8.v20171121.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-util:jar:9.4.8.v20171121',
-  sha1 = 'd6ec1a1613c7fa72aa6bf5d8c204750afbc3df3b',
-  maven_coords = 'org.eclipse.jetty:jetty-util:9.4.8.v20171121',
-  visibility = [ 'PUBLIC' ],
-)
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/EventServer.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/EventServer.java
index ddb7426..32b64cd 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/EventServer.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/EventServer.java
@@ -8,6 +8,7 @@
 package org.onosproject.fpcagent.util.eventStream;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
+import org.eclipse.jetty.servlet.DefaultServlet;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.slf4j.Logger;
@@ -15,7 +16,6 @@
 
 import javax.servlet.AsyncContext;
 import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
@@ -28,7 +28,7 @@
 /**
  * A Http Servlet to server response streams
  */
-public class EventServer extends HttpServlet {
+public class EventServer extends DefaultServlet {
     private static final Logger log = LoggerFactory.getLogger(EventServer.class);
     private static ArrayList<String> clientUriList = new ArrayList<String>();
 
@@ -65,18 +65,20 @@
         }
     }
 
+    @Override
     protected void doPost(HttpServletRequest request, HttpServletResponse response) {
-	log.info("here doPost");
+        log.info("here doPost");
         try {
             String clientUri = null;
             StringBuffer jsonStringBuilder = new StringBuffer();
             String line = null;
             try {
                 BufferedReader br = request.getReader();
-                while ((line = br.readLine()) != null)
+                while ((line = br.readLine()) != null) {
                     jsonStringBuilder.append(line);
+                }
             } catch (Exception e) {
-	        log.error(ExceptionUtils.getFullStackTrace(e));
+                log.error(ExceptionUtils.getFullStackTrace(e));
             }
 
             try {
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/JettyServer.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/JettyServer.java
index 03c610e..cf4e0ae 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/JettyServer.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/JettyServer.java
@@ -9,7 +9,9 @@
 
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlet.DefaultServlet;
 import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -20,7 +22,7 @@
  * SSE Server implementation
  */
 public class JettyServer implements AutoCloseable {
-	private static final Logger log = LoggerFactory.getLogger(JettyServer.class);
+    private static final Logger log = LoggerFactory.getLogger(JettyServer.class);
     private static JettyServer _instance;
     private Server server;
 
@@ -34,38 +36,40 @@
     public static JettyServer getInstance() {
         return _instance;
     }
-	/**
-	 * Method used to initialize and start the SSE server
-	 */
-	public void open() {
-		ExecutorService executorService = Executors.newSingleThreadExecutor();
-		executorService.submit(() -> {
-			ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
-			context.setContextPath("/");
 
-		        server = new Server(8070);
-//			log.info("a");
-			server.setHandler(context);
+    /**
+     * Method used to initialize and start the SSE server
+     */
+    public void open() {
+        ExecutorService executorService = Executors.newSingleThreadExecutor();
+        executorService.submit(() -> {
+            try {
+                server = new Server(8070);
+                ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+                context.setContextPath("/");
 
-//			log.info("a");
-			context.addServlet(EventServer.class, "/response");
-			context.addServlet(NotificationServer.class, "/notification");
-			
-//			log.info("a");
-			context.addEventListener(new ConfigureService());
-			context.addEventListener(new NotificationService());
+                context.addServlet(new ServletHolder(EventServer.class), "/response");
+                context.addServlet(new ServletHolder(NotificationServer.class), "/notification");
 
-			try {
-				server.start();
-				log.info("Jetty-Server Started");
-				server.join();
-			} catch (Exception e) {
-				log.error(ExceptionUtils.getFullStackTrace(e));
-			} finally {
-				server.destroy();
-			}
-		});
-	}
+                server.setHandler(context);
+
+                context.addEventListener(new ConfigureService());
+                context.addEventListener(new NotificationService());
+
+                try {
+                    server.start();
+                    log.info("Jetty-Server Started");
+                    server.join();
+                } catch (Exception e) {
+                    log.error(ExceptionUtils.getFullStackTrace(e));
+                } finally {
+                    server.destroy();
+                }
+            } catch (Exception e) {
+                log.error(ExceptionUtils.getFullStackTrace(e));
+            }
+        });
+    }
 
     @Override
     public void close() {
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/NotificationServer.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/NotificationServer.java
index e859cbf..8c150e4 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/NotificationServer.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/NotificationServer.java
@@ -8,6 +8,7 @@
 package org.onosproject.fpcagent.util.eventStream;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
+import org.eclipse.jetty.servlet.DefaultServlet;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.slf4j.Logger;
@@ -15,7 +16,6 @@
 
 import javax.servlet.AsyncContext;
 import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
@@ -27,45 +27,49 @@
 /**
  * A HTTP servlet that handles requests for notification streams
  */
-public class NotificationServer extends HttpServlet {
-	private static final Logger log = LoggerFactory.getLogger(EventServer.class);
+public class NotificationServer extends DefaultServlet {
+    private static final Logger log = LoggerFactory.getLogger(EventServer.class);
 
-	protected void doPost( HttpServletRequest request, HttpServletResponse response){
-		log.info("Notification stream Inititated");
-		String clientId = null;
-		StringBuffer jsonStringBuilder = new StringBuffer();
-		String line = null;
-		try {
-			BufferedReader br = request.getReader();
-			while ((line = br.readLine()) != null)
-				jsonStringBuilder.append(line);
-		} catch (Exception e) { e.printStackTrace(); }
+    @Override
+    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
+        log.info("Notification stream Inititated");
+        String clientId = null;
+        StringBuffer jsonStringBuilder = new StringBuffer();
+        String line = null;
+        try {
+            BufferedReader br = request.getReader();
+            while ((line = br.readLine()) != null) {
+                jsonStringBuilder.append(line);
+            }
+        } catch (Exception e) {
+            log.error(ExceptionUtils.getFullStackTrace(e));
+        }
 
-		try {
-			if(jsonStringBuilder.length() > 0){
-				JSONObject jsonObj =  new JSONObject(jsonStringBuilder.toString());
-				clientId = jsonObj.getString("client-id");
-				jsonStringBuilder.setLength(0);
-				HttpSession session = request.getSession();
-				session.setMaxInactiveInterval(72*60*60);
-				response.setHeader("Content-Type", "text/event-stream");
-				response.setHeader("Cache-Control", "no-cache, no-store");
-				response.setHeader("Connection", "keep-alive");
-				AsyncContext asyncContext = request.startAsync(request,response);
-				asyncContext.setTimeout(72*60*60*1000);
-				asyncContext.getResponse().setBufferSize(1200);
-				try {
-					asyncContext.getResponse().flushBuffer();
-				} catch (IOException e) {
-					log.error(ExceptionUtils.getFullStackTrace(e));
-				}
-				ServletContext servletContext = request.getServletContext();
-				Map<String,AsyncContext> notificationStreams = (ConcurrentHashMap<String,AsyncContext>) servletContext.getAttribute("notificationStreams");
-				notificationStreams.put(clientId,asyncContext);
-				log.info("Client Id received in the notification stream request: "+clientId);
-			}
-		} catch (JSONException e) {
-			log.error(ExceptionUtils.getFullStackTrace(e));
-		}
-	}
+        try {
+            if (jsonStringBuilder.length() > 0) {
+                JSONObject jsonObj = new JSONObject(jsonStringBuilder.toString());
+                clientId = jsonObj.getString("client-id");
+                jsonStringBuilder.setLength(0);
+                HttpSession session = request.getSession();
+                session.setMaxInactiveInterval(72 * 60 * 60);
+                response.setHeader("Content-Type", "text/event-stream");
+                response.setHeader("Cache-Control", "no-cache, no-store");
+                response.setHeader("Connection", "keep-alive");
+                AsyncContext asyncContext = request.startAsync(request, response);
+                asyncContext.setTimeout(72 * 60 * 60 * 1000);
+                asyncContext.getResponse().setBufferSize(1200);
+                try {
+                    asyncContext.getResponse().flushBuffer();
+                } catch (IOException e) {
+                    log.error(ExceptionUtils.getFullStackTrace(e));
+                }
+                ServletContext servletContext = request.getServletContext();
+                Map<String, AsyncContext> notificationStreams = (ConcurrentHashMap<String, AsyncContext>) servletContext.getAttribute("notificationStreams");
+                notificationStreams.put(clientId, asyncContext);
+                log.info("Client Id received in the notification stream request: " + clientId);
+            }
+        } catch (JSONException e) {
+            log.error(ExceptionUtils.getFullStackTrace(e));
+        }
+    }
 }
