diff --git a/apps/fpcagent/BUCK b/apps/fpcagent/BUCK
index c4f1565..ef4f0b0 100644
--- a/apps/fpcagent/BUCK
+++ b/apps/fpcagent/BUCK
@@ -13,20 +13,17 @@
     '//apps/restconf/api:onos-apps-restconf-api',
     '//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',
+    '//lib:jetty-servlet',
+    '//lib:jetty-server',
+    '//lib:jetty-io',
+    '//lib:jetty-http',
+    '//lib:jetty-util',
     '//lib:javax.servlet-api',
     ':zeromq',
     ':json',
 ]
 
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
+PROVIDED_DEPS = [
 ]
 
 BUNDLES = [
@@ -34,11 +31,12 @@
     '//lib:httpclient-osgi',
     '//lib:httpcore-osgi',
     '//lib:org.apache.httpcomponents.httpasyncclient-osgi',
+    '//lib:jetty-servlet',
+    '//lib:jetty-server',
+    '//lib:jetty-io',
+    '//lib:jetty-http',
+    '//lib:jetty-util',
     '//lib:javax.servlet-api',
-    ':jetty-server-new',
-    ':jetty-io-new',
-    ':jetty-http-new',
-    ':jetty-util-new',
 ]
 
 EXCLUDED_BUNDLES = [
@@ -55,9 +53,9 @@
     'org.onosproject.protocols.restconfserver',
 ]
 
-osgi_jar_with_tests(
+osgi_jar(
     deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
+    provided_deps = PROVIDED_DEPS,
 )
 
 onos_app(
@@ -89,56 +87,3 @@
   visibility = [ 'PUBLIC' ],
 )
 
-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',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jetty-servlet',
-  out = 'jetty-servlet-8.1.19.v20160209.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-servlet:jar:8.1.19.v20160209',
-  sha1 = '6872c3fc289de8f26a43b101741b33af36590cb4',
-  maven_coords = 'org.eclipse.jetty:jetty-servlet:8.1.19.v20160209',
-  visibility = [ 'PUBLIC' ],
-)
-
-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',
-  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',
-  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/EventClient.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/EventClient.java
deleted file mode 100644
index 88b0201..0000000
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/EventClient.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright © 2016 - 2017 Copyright (c) Sprint, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.onosproject.fpcagent.util.eventStream;
-
-import org.apache.commons.lang.exception.ExceptionUtils;
-import org.apache.http.HttpResponse;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.apache.http.nio.IOControl;
-import org.apache.http.nio.client.methods.AsyncCharConsumer;
-import org.apache.http.nio.client.methods.HttpAsyncMethods;
-import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
-import org.apache.http.protocol.HttpContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.nio.CharBuffer;
-import java.util.AbstractMap;
-import java.util.ArrayList;
-
-/**
- * A HTTP client that sends a request to a FPC Client to initiate the request stream.
- */
-public class EventClient {
-    private static final Logger log = LoggerFactory.getLogger(EventClient.class);
-
-    private static final CloseableHttpAsyncClient client = HttpAsyncClients.createDefault();
-    private static ArrayList<String> clientUriList = new ArrayList<String>();
-    protected String clientUri;
-
-    /**
-     * Send HttpRequest to Client
-     *
-     * @param uri - FPC Client Uri
-     */
-    public void connectToClient(String uri) {
-        this.clientUri = uri;
-	log.info("here connectToClient");
-        try {
-            client.start();
-            HttpAsyncRequestProducer get = HttpAsyncMethods.createGet(this.clientUri);
-            client.execute(get, new MyResponseConsumer(this.clientUri), null);
-        } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-        }
-    }
-
-    /**
-     * A character consumer to read incoming characters on the request stream
-     */
-    static class MyResponseConsumer extends AsyncCharConsumer<Boolean> {
-        private String clientUri;
-
-        /**
-         * Constructor
-         *
-         * @param clientUri - URI of the FPC Client
-         */
-        public MyResponseConsumer(String clientUri) {
-            this.clientUri = clientUri;
-        }
-
-        @Override
-        protected void onResponseReceived(final HttpResponse response) {
-        }
-
-        @Override
-        protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) {
-            char[] charArray = new char[buf.remaining()];
-            System.arraycopy(buf.array(), 0, charArray, 0, buf.remaining());
-            CharBuffer charBuffer = CharBuffer.wrap(charArray);
-            ParseStream.getInstance().send(new AbstractMap.SimpleEntry<>(clientUri, charBuffer));
-        }
-
-        @Override
-        protected void releaseResources() {
-        }
-
-        @Override
-        protected Boolean buildResult(final HttpContext context) {
-            return Boolean.TRUE;
-        }
-
-    }
-}
-
-
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
deleted file mode 100644
index ddb7426..0000000
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/EventServer.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright © 2016 - 2017 Copyright (c) Sprint, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.onosproject.fpcagent.util.eventStream;
-
-import org.apache.commons.lang.exception.ExceptionUtils;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-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;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * A Http Servlet to server response streams
- */
-public class EventServer extends HttpServlet {
-    private static final Logger log = LoggerFactory.getLogger(EventServer.class);
-    private static ArrayList<String> clientUriList = new ArrayList<String>();
-
-    /**
-     * Method for stream initialization
-     *
-     * @param clientUri - Client Uri
-     * @param request   - The servlet request object
-     * @param response  - The servlet Response Object
-     */
-    private void init(String clientUri, HttpServletRequest request, HttpServletResponse response) {
-        log.info("Response Stream Inititated");
-        try {
-            HttpSession session = request.getSession();
-            session.setMaxInactiveInterval(72 * 60 * 60);
-            EventClient client = new EventClient();
-            client.connectToClient(clientUri);
-            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> responseStreams = (ConcurrentHashMap<String, AsyncContext>) servletContext.getAttribute("responseStreams");
-            responseStreams.put(clientUri, asyncContext);
-        } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-        }
-    }
-
-    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
-	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)
-                    jsonStringBuilder.append(line);
-            } catch (Exception e) {
-	        log.error(ExceptionUtils.getFullStackTrace(e));
-            }
-
-            try {
-                if (jsonStringBuilder.length() > 0) {
-                    JSONObject jsonObj = new JSONObject(jsonStringBuilder.toString());
-                    clientUri = jsonObj.getString("client-uri");
-                    if (!clientUriList.contains(clientUri)) {
-                        init(clientUri, request, response);
-                    }
-                    jsonStringBuilder.setLength(0);
-                }
-            } catch (JSONException e) {
-                log.error(ExceptionUtils.getFullStackTrace(e));
-            }
-        } catch (Exception e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-        }
-
-    }
-}
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..e6d11d1 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
@@ -10,6 +10,7 @@
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -20,7 +21,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 +35,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(ResponseServer.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..ccbd364 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,66 @@
 /**
  * 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(ResponseServer.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(); }
+    public NotificationServer() {
+        super();
+        log.info("Notification Server Initialized");
+    }
 
-		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));
-		}
-	}
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            response.setContentType("text/html");
+            response.setStatus(HttpServletResponse.SC_OK);
+            response.getWriter().println("<h1>Hello World</h1>");
+            response.getWriter().println("session=" + request.getSession(true).getId());
+        } catch (IOException e) {
+            log.error(ExceptionUtils.getFullStackTrace(e));
+        }
+    }
+
+    @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));
+        }
+    }
 }
