diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ResponseClient.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ResponseClient.java
new file mode 100644
index 0000000..76762d8
--- /dev/null
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ResponseClient.java
@@ -0,0 +1,92 @@
+/*
+ * 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 ResponseClient {
+    private static final Logger log = LoggerFactory.getLogger(ResponseClient.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/ResponseServer.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ResponseServer.java
new file mode 100644
index 0000000..3594d22
--- /dev/null
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ResponseServer.java
@@ -0,0 +1,118 @@
+/*
+ * 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.eclipse.jetty.servlet.DefaultServlet;
+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.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 ResponseServer extends DefaultServlet {
+    private static final Logger log = LoggerFactory.getLogger(ResponseServer.class);
+    private static ArrayList<String> clientUriList = new ArrayList<>();
+
+    public ResponseServer() {
+        super();
+        log.info("Response Server Initialized");
+    }
+
+    /**
+     * 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);
+            ResponseClient client = new ResponseClient();
+            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));
+        }
+    }
+
+    @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("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));
+        }
+
+    }
+}
