fixed checkstyle, added CP notifications for P4
diff --git a/apps/fpcagent/BUCK b/apps/fpcagent/BUCK
index ef4f0b0..5ab31d7 100644
--- a/apps/fpcagent/BUCK
+++ b/apps/fpcagent/BUCK
@@ -13,12 +13,12 @@
     '//apps/restconf/api:onos-apps-restconf-api',
     '//models/fpcagent:onos-models-fpcagent',
     '//models/common:onos-models-common',
-    '//lib:jetty-servlet',
-    '//lib:jetty-server',
-    '//lib:jetty-io',
-    '//lib:jetty-http',
-    '//lib:jetty-util',
-    '//lib:javax.servlet-api',
+    ':jetty-servlet-custom',
+    ':jetty-server-custom',
+    ':jetty-io-custom',
+    ':jetty-http-custom',
+    ':jetty-util-custom',
+    ':javax.servlet-api-custom',
     ':zeromq',
     ':json',
 ]
@@ -31,12 +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-servlet-custom',
+    ':jetty-server-custom',
+    ':jetty-io-custom',
+    ':jetty-http-custom',
+    ':jetty-util-custom',
+    ':javax.servlet-api-custom',
 ]
 
 EXCLUDED_BUNDLES = [
@@ -87,3 +87,56 @@
   visibility = [ 'PUBLIC' ],
 )
 
+remote_jar (
+  name = 'javax.servlet-api-custom',
+  out = 'javax.servlet-api-3.0.1.jar',
+  url = 'mvn:javax.servlet:javax.servlet-api:jar:3.0.1',
+  sha1 = '6bf0ebb7efd993e222fc1112377b5e92a13b38dd',
+  maven_coords = 'javax.servlet:javax.servlet-api:3.0.1',
+  visibility = [ 'PUBLIC' ],
+)
+
+remote_jar (
+  name = 'jetty-util-custom',
+  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-custom',
+  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' ],
+)
+
+remote_jar (
+  name = 'jetty-servlet-custom',
+  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-http-custom',
+  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-custom',
+  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' ],
+)
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcConfig.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcConfig.java
index a47d4a9..1478421 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcConfig.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcConfig.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.onosproject.fpcagent;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java
index 98aa2ad..f576930 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java
@@ -17,7 +17,12 @@
 package org.onosproject.fpcagent;
 
 import com.google.common.collect.Sets;
-import org.apache.felix.scr.annotations.*;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
 import org.onosproject.config.DynamicConfigEvent;
 import org.onosproject.config.DynamicConfigListener;
 import org.onosproject.config.DynamicConfigService;
@@ -26,15 +31,19 @@
 import org.onosproject.core.IdGenerator;
 import org.onosproject.fpcagent.protocols.DpnNgicCommunicator;
 import org.onosproject.fpcagent.protocols.DpnP4Communicator;
-import org.onosproject.fpcagent.providers.DpnDeviceListener;
-import org.onosproject.fpcagent.providers.DpnProviderService;
+import org.onosproject.fpcagent.providers.ZmqDpnDeviceListener;
+import org.onosproject.fpcagent.providers.ZmqDpnProviderService;
 import org.onosproject.fpcagent.util.ConfigHelper;
-import org.onosproject.fpcagent.util.eventStream.JettyServer;
-import org.onosproject.fpcagent.util.eventStream.NBEventWorkerManager;
-import org.onosproject.fpcagent.util.eventStream.ParseStream;
-import org.onosproject.fpcagent.workers.ZMQSBPublisherManager;
-import org.onosproject.fpcagent.workers.ZMQSBSubscriberManager;
-import org.onosproject.net.config.*;
+import org.onosproject.fpcagent.util.eventstream.JettyServer;
+import org.onosproject.fpcagent.util.eventstream.NbEventWorkerManager;
+import org.onosproject.fpcagent.util.eventstream.ParseStream;
+import org.onosproject.fpcagent.workers.ZmqSbPublisherManager;
+import org.onosproject.fpcagent.workers.ZmqSbSubscriberManager;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.flow.FlowRuleService;
 import org.onosproject.restconf.api.RestconfService;
@@ -87,7 +96,7 @@
     private CoreService coreService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private DpnProviderService dpnProviderService;
+    private ZmqDpnProviderService zmqDpnProviderService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     private RestconfService restconfService;
@@ -99,7 +108,7 @@
     private IdGenerator notificationIds;
     private FpcConfig fpcConfig;
     private boolean started = false;
-    private HashSet<DpnDeviceListener> listeners = Sets.newHashSet();
+    private HashSet<ZmqDpnDeviceListener> listeners = Sets.newHashSet();
 
     /* Config */
     private ConfigFactory<ApplicationId, FpcConfig> fpcConfigConfigFactory =
@@ -122,7 +131,7 @@
 
         JettyServer.createInstance().open();
         ParseStream.createInstance().open();
-        NBEventWorkerManager.createInstance(20, restconfService).open();
+        NbEventWorkerManager.createInstance(20, restconfService).open();
         DpnNgicCommunicator.createInstance();
         DpnP4Communicator.createInstance(applicationId, flowRuleService);
 
@@ -136,12 +145,12 @@
         registry.unregisterConfigFactory(fpcConfigConfigFactory);
 
         if (started) {
-            ZMQSBSubscriberManager.getInstance().close();
-            ZMQSBPublisherManager.getInstance().close();
+            ZmqSbSubscriberManager.getInstance().close();
+            ZmqSbPublisherManager.getInstance().close();
             started = false;
         }
 
-        NBEventWorkerManager.getInstance().close();
+        NbEventWorkerManager.getInstance().close();
         ParseStream.getInstance().close();
         JettyServer.getInstance().close();
 
@@ -155,32 +164,32 @@
         fpcConfig.getConfig().ifPresent(
                 helper -> {
                     started = true;
-                    ZMQSBSubscriberManager.createInstance(
+                    ZmqSbSubscriberManager.createInstance(
                             helper.dpnSubscriberUri(),
                             helper.nodeId(),
                             helper.networkId(),
-                            dpnProviderService.getListener(),
+                            zmqDpnProviderService.getListener(),
                             notificationIds
                     );
 
-                    ZMQSBPublisherManager.createInstance(
+                    ZmqSbPublisherManager.createInstance(
                             helper.dpnPublisherUri(),
                             helper.dpnClientThreads()
                     );
 
-                    ZMQSBPublisherManager.getInstance().open();
-                    ZMQSBSubscriberManager.getInstance().open();
+                    ZmqSbPublisherManager.getInstance().open();
+                    ZmqSbSubscriberManager.getInstance().open();
                 }
         );
     }
 
     @Override
-    public void addListener(DpnDeviceListener listener) {
+    public void addListener(ZmqDpnDeviceListener listener) {
         listeners.add(listener);
     }
 
     @Override
-    public void removeListener(DpnDeviceListener listener) {
+    public void removeListener(ZmqDpnDeviceListener listener) {
         listeners.remove(listener);
     }
 
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
index 2eb0b6a..f8b80fd 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
@@ -19,7 +19,12 @@
 import com.google.common.collect.Sets;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
-import org.apache.felix.scr.annotations.*;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.Ip4Prefix;
 import org.onosproject.config.DynamicConfigService;
@@ -45,7 +50,14 @@
 import org.onosproject.yang.gen.v1.fpc.rev20150105.fpc.registerclient.DefaultRegisterClientInput;
 import org.onosproject.yang.gen.v1.fpc.rev20150105.fpc.registerclient.DefaultRegisterClientOutput;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.IetfDmmFpcagentService;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.*;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.ClientIdentifier;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.DefaultFpcAgentInfo;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.DefaultTenants;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.DefaultYangAutoPrefixNotify;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.ErrorTypeId;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.NotificationId;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.OpIdentifier;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.Result;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.configure.DefaultConfigureInput;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.configure.DefaultConfigureOutput;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.configurebundles.DefaultConfigureBundlesInput;
@@ -82,7 +94,15 @@
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.mobilityinfo.mobprofileparameters.ThreegppTunnel;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.targetsvalue.Targets;
 import org.onosproject.yang.gen.v1.ietfdmmthreegpp.rev20160803.ietfdmmthreegpp.threegppinstr.Bits;
-import org.onosproject.yang.model.*;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.RpcInput;
+import org.onosproject.yang.model.RpcOutput;
+import org.onosproject.yang.model.RpcRegistry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -93,16 +113,20 @@
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Optional;
-import java.util.concurrent.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 import static org.onosproject.fpcagent.util.Converter.convertContext;
 import static org.onosproject.fpcagent.util.FpcUtil.*;
 
-//import org.onosproject.fpcagent.workers.HTTPNotifier;
-
 @Component(immediate = true)
 @Service
-public class FpcRpcManager implements FpcRpcService, IetfDmmFpcagentService, org.onosproject.yang.gen.v1.fpc.rev20150105.FpcService {
+public class FpcRpcManager implements FpcRpcService,
+        IetfDmmFpcagentService,
+        org.onosproject.yang.gen.v1.fpc.rev20150105.FpcService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -147,8 +171,8 @@
     protected void deactivate() {
         deviceService.removeListener(listener);
         rpcRegistry.unregisterRpcService(this);
-        clientInfo.clear();
-        tenantInfo.clear();
+        CLIENT_INFO.clear();
+        TENANT_INFO.clear();
         log.info("FPC RPC Service Stopped");
     }
 
@@ -162,7 +186,7 @@
         // Create the Default Tenant and added to the Tenants structure.
         final DefaultTenants tenants = new DefaultTenants();
         final DefaultTenant tenant = new DefaultTenant();
-        tenant.tenantId(defaultIdentity);
+        tenant.tenantId(DEFAULT_IDENTITY);
         tenant.fpcTopology(new DefaultFpcTopology());
         tenant.fpcPolicy(new DefaultFpcPolicy());
         tenant.fpcMobility(new DefaultFpcMobility());
@@ -226,8 +250,12 @@
                 if (controlProtocol.isAssignableFrom(ZmqDpnControlProtocol.class)) {
                     dpnCommunicationService = DpnNgicCommunicator.getInstance();
                 } else if (controlProtocol.isAssignableFrom(P4DpnControlProtocol.class)) {
-                    dpnCommunicationService = DpnP4Communicator.getInstance();
-                    DpnP4Communicator.getInstance().setDeviceId(DeviceId.deviceId(optionalDpn.get().dpnId().toString()));
+                    DpnP4Communicator instance = DpnP4Communicator.getInstance();
+                    dpnCommunicationService = instance;
+                    instance.setDeviceId(
+                            DeviceId.deviceId(optionalDpn.get().dpnId().toString())
+                    );
+                    instance.setClientId(clientInfo.clientId());
                 } else {
                     throw new RuntimeException("Control Protocol is not supported.");
                 }
@@ -244,8 +272,8 @@
                 }
 
                 // get DPN Topic from Node/Network pair
-                byte topic_id = getTopicFromNode(key.get());
-                if (topic_id == -1 && dpnCommunicationService instanceof ZmqDpnControlProtocol) {
+                byte topicId = getTopicFromNode(key.get());
+                if (topicId == -1 && dpnCommunicationService instanceof ZmqDpnControlProtocol) {
                     throw new RuntimeException("Could not find Topic ID");
                 }
 
@@ -264,35 +292,35 @@
 
                 log.debug("handling configure create event {} for {}", commands, dpn.dpnId());
 
-                Ip4Address s1u_enodeb_ipv4 = Ip4Address.valueOf(context.ul().tunnelLocalAddress().toString()),
-                        s1u_sgw_ipv4 = Ip4Address.valueOf(context.ul().tunnelRemoteAddress().toString());
+                Ip4Address s1UEnodebIpv4 = Ip4Address.valueOf(context.ul().tunnelLocalAddress().toString()),
+                        s1USgwIpv4 = Ip4Address.valueOf(context.ul().tunnelRemoteAddress().toString());
 
-                long client_id = clientInfo.clientId().fpcIdentity().union().int64(),
-                        session_id = context.contextId().fpcIdentity().union().int64(),
-                        s1u_sgw_gtpu_teid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters()
+                long clientId = clientInfo.clientId().fpcIdentity().union().int64(),
+                        sessionId = context.contextId().fpcIdentity().union().int64(),
+                        s1USgwGtpuTeid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters()
                                 .mobprofileParameters()).tunnelIdentifier(),
-                        s1u_enb_gtpu_teid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters()
+                        s1UEnbGtpuTeid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters()
                                 .mobprofileParameters()).tunnelIdentifier();
 
-                BigInteger op_id = operationId.uint64(),
+                BigInteger opId = operationId.uint64(),
                         imsi = context.imsi().uint64();
 
-                short default_ebi = context.ebi().uint8();
+                short defaultEbi = context.ebi().uint8();
 
                 // TODO try to make sense out of this...
                 if (commands.contains("session")) {
                     DefaultContexts convertContext = convertContext(context);
                     tasks.add(Executors.callable(() -> {
-                        dpnCommunicationService.create_session(
-                                topic_id,
+                        dpnCommunicationService.createSession(
+                                topicId,
                                 imsi,
-                                default_ebi,
+                                defaultEbi,
                                 Ip4Prefix.valueOf(context.delegatingIpPrefixes().get(0).toString()).address(),
-                                s1u_sgw_gtpu_teid,
-                                s1u_sgw_ipv4,
-                                session_id,
-                                client_id,
-                                op_id
+                                s1USgwGtpuTeid,
+                                s1USgwIpv4,
+                                sessionId,
+                                clientId,
+                                opId
                         );
 
                         ModelObjectId modelObjectId = tenantBuilder(tenantId)
@@ -305,14 +333,14 @@
                     // FIXME why downlink is in session while uplink is not?
                     if (commands.contains("downlink")) {
                         tasks.add(Executors.callable(() -> {
-                            dpnCommunicationService.modify_bearer(
-                                    topic_id,
-                                    s1u_sgw_ipv4,
-                                    s1u_enb_gtpu_teid,
-                                    s1u_enodeb_ipv4,
-                                    session_id,
-                                    client_id,
-                                    op_id
+                            dpnCommunicationService.modifyBearer(
+                                    topicId,
+                                    s1USgwIpv4,
+                                    s1UEnbGtpuTeid,
+                                    s1UEnodebIpv4,
+                                    sessionId,
+                                    clientId,
+                                    opId
                             );
 
                             ModelObjectId modelObjectId = tenantBuilder(tenantId)
@@ -331,8 +359,7 @@
         }
 
         // execute all tasks.
-        ExecutorService executor = Executors.newWorkStealingPool();
-        executor.invokeAll(tasks).forEach(
+        Executors.newWorkStealingPool().invokeAll(tasks).forEach(
                 future -> {
                     try {
                         future.get();
@@ -391,8 +418,12 @@
                 if (controlProtocol.isAssignableFrom(ZmqDpnControlProtocol.class)) {
                     dpnCommunicationService = DpnNgicCommunicator.getInstance();
                 } else if (controlProtocol.isAssignableFrom(P4DpnControlProtocol.class)) {
-                    dpnCommunicationService = DpnP4Communicator.getInstance();
-                    DpnP4Communicator.getInstance().setDeviceId(DeviceId.deviceId(optionalDpn.get().dpnId().toString()));
+                    DpnP4Communicator instance = DpnP4Communicator.getInstance();
+                    dpnCommunicationService = instance;
+                    instance.setDeviceId(
+                            DeviceId.deviceId(optionalDpn.get().dpnId().toString())
+                    );
+                    instance.setClientId(clientInfo.clientId());
                 } else {
                     throw new RuntimeException("Control Protocol is not supported.");
                 }
@@ -410,8 +441,8 @@
                 }
 
                 // get DPN Topic from Node/Network pair
-                byte topic_id = getTopicFromNode(key.get());
-                if (topic_id == -1 && dpnCommunicationService instanceof ZmqDpnControlProtocol) {
+                byte topicId = getTopicFromNode(key.get());
+                if (topicId == -1 && dpnCommunicationService instanceof ZmqDpnControlProtocol) {
                     throw new RuntimeException("Could not find Topic ID");
                 }
 
@@ -424,10 +455,11 @@
 
                 log.debug("handling configure update event {} for {}", commands, dpn.dpnId());
 
-                Ip4Address s1u_enodeb_ipv4 = Ip4Address.valueOf(context.ul().tunnelLocalAddress().toString()),
-                        s1u_sgw_ipv4 = Ip4Address.valueOf(context.ul().tunnelRemoteAddress().toString());
+                Ip4Address s1UEnodebIpv4 = Ip4Address.valueOf(context.ul().tunnelLocalAddress().toString()),
+                        s1USgwIpv4 = Ip4Address.valueOf(context.ul().tunnelRemoteAddress().toString());
 
-                long s1u_enb_gtpu_teid = ((ThreegppTunnel) context.dl().mobilityTunnelParameters().mobprofileParameters()).tunnelIdentifier(),
+                long s1UEnbGtpuTeid = ((ThreegppTunnel) context.dl().mobilityTunnelParameters()
+                        .mobprofileParameters()).tunnelIdentifier(),
                         cId = clientInfo.clientId().fpcIdentity().union().int64(),
                         contextId = context.contextId().fpcIdentity().union().int64();
 
@@ -437,11 +469,11 @@
                 if (commands.contains("downlink")) {
                     if (context.dl().lifetime() >= 0L) {
                         tasks.add(Executors.callable(() -> {
-                            dpnCommunicationService.modify_bearer(
-                                    topic_id,
-                                    s1u_sgw_ipv4,
-                                    s1u_enb_gtpu_teid,
-                                    s1u_enodeb_ipv4,
+                            dpnCommunicationService.modifyBearer(
+                                    topicId,
+                                    s1USgwIpv4,
+                                    s1UEnbGtpuTeid,
+                                    s1UEnodebIpv4,
                                     contextId,
                                     cId,
                                     opId
@@ -461,11 +493,11 @@
                 if (commands.contains("uplink")) {
                     if (context.ul().lifetime() >= 0L) {
                         tasks.add(Executors.callable(() -> {
-                            dpnCommunicationService.modify_bearer(
-                                    topic_id,
-                                    s1u_sgw_ipv4,
-                                    s1u_enb_gtpu_teid,
-                                    s1u_enodeb_ipv4,
+                            dpnCommunicationService.modifyBearer(
+                                    topicId,
+                                    s1USgwIpv4,
+                                    s1UEnbGtpuTeid,
+                                    s1UEnodebIpv4,
                                     contextId,
                                     cId,
                                     opId
@@ -486,8 +518,7 @@
         }
 
         // execute all tasks.
-        ExecutorService executor = Executors.newWorkStealingPool();
-        executor.invokeAll(tasks).forEach(
+        Executors.newWorkStealingPool().invokeAll(tasks).forEach(
                 future -> {
                     try {
                         future.get();
@@ -525,7 +556,8 @@
 
             // find context that this target is about.
             FpcContextId fpcContextId = FpcContextId.of(FpcIdentity.fromString(trgt));
-            Optional<DefaultContexts> defaultContexts = CacheManager.getInstance(tenantId).contextsCache.get(fpcContextId);
+            Optional<DefaultContexts> defaultContexts = CacheManager.getInstance(tenantId)
+                    .contextsCache.get(fpcContextId);
             if (!defaultContexts.isPresent()) {
                 throw new RuntimeException("Context doesn't exist. Please issue create operation..");
             }
@@ -546,8 +578,12 @@
                 if (controlProtocol.isAssignableFrom(ZmqDpnControlProtocol.class)) {
                     dpnCommunicationService = DpnNgicCommunicator.getInstance();
                 } else if (controlProtocol.isAssignableFrom(P4DpnControlProtocol.class)) {
-                    dpnCommunicationService = DpnP4Communicator.getInstance();
-                    DpnP4Communicator.getInstance().setDeviceId(DeviceId.deviceId(optionalDpn.get().dpnId().toString()));
+                    DpnP4Communicator instance = DpnP4Communicator.getInstance();
+                    dpnCommunicationService = instance;
+                    instance.setDeviceId(
+                            DeviceId.deviceId(optionalDpn.get().dpnId().toString())
+                    );
+                    instance.setClientId(clientInfo.clientId());
                 } else {
                     throw new RuntimeException("Control Protocol is not supported.");
                 }
@@ -560,8 +596,8 @@
                 }
 
                 // find DPN Topic from Node/Network ID pair.
-                byte topic_id = getTopicFromNode(key.get());
-                if (topic_id == -1 && dpnCommunicationService instanceof ZmqDpnControlProtocol) {
+                byte topicId = getTopicFromNode(key.get());
+                if (topicId == -1 && dpnCommunicationService instanceof ZmqDpnControlProtocol) {
                     throw new RuntimeException("Could not find Topic ID");
                 }
 
@@ -569,20 +605,21 @@
                     throw new RuntimeException("mobprofileParameters are not instance of ThreegppTunnel");
                 }
 
-                Long teid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters().mobprofileParameters()).tunnelIdentifier();
-                long client_id = clientInfo.clientId().fpcIdentity().union().int64();
-                BigInteger op_id = operationId.uint64();
+                Long teid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters()
+                        .mobprofileParameters()).tunnelIdentifier();
+                long clientId = clientInfo.clientId().fpcIdentity().union().int64();
+                BigInteger opId = operationId.uint64();
 
                 // TODO figure out what is going on.
                 if (targetStr.endsWith("ul") || targetStr.endsWith("dl")) {
                     // TODO delete bearer
                 } else {
                     tasks.add(Executors.callable(() -> {
-                        dpnCommunicationService.delete_session(
-                                topic_id,
+                        dpnCommunicationService.deleteSession(
+                                topicId,
                                 context.contextId().fpcIdentity().union().int64(),
-                                client_id,
-                                op_id
+                                clientId,
+                                opId
                         );
 
                         ContextsKeys contextsKeys = new ContextsKeys();
@@ -601,8 +638,7 @@
         }
 
         // execute all tasks
-        ExecutorService executor = Executors.newWorkStealingPool();
-        executor.invokeAll(tasks).forEach(
+        Executors.newWorkStealingPool().invokeAll(tasks).forEach(
                 future -> {
                     try {
                         future.get();
@@ -738,11 +774,17 @@
                         case REMOVE:
                             configureDpnOutput = configureDpnRemove(input);
                             break;
+                        default:
+                            break;
                     }
                 }
             } catch (Exception e) {
                 status = RpcOutput.Status.RPC_FAILURE;
-                org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.resultbodydpn.resulttype.DefaultErr defaultErr = new org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.resultbodydpn.resulttype.DefaultErr();
+                org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent
+                        .resultbodydpn.resulttype.DefaultErr defaultErr =
+                        new org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent
+                                .resultbodydpn.resulttype.DefaultErr();
+
                 defaultErr.errorInfo(ExceptionUtils.getFullStackTrace(e));
                 defaultErr.errorTypeId(ErrorTypeId.of(0));
                 configureDpnOutput.resultType(defaultErr);
@@ -768,21 +810,21 @@
             try {
                 for (ModelObject modelObject : getModelObjects(rpcInput.data(), configure)) {
                     DefaultConfigureInput input = (DefaultConfigureInput) modelObject;
-                    if (!clientInfo.containsKey(input.clientId())) {
+                    if (!CLIENT_INFO.containsKey(input.clientId())) {
                         throw new RuntimeException("Client Identifier is not registered.");
                     }
                     switch (input.opType()) {
                         case CREATE:
                             configureOutput = configureCreate(
                                     (CreateOrUpdate) input.opBody(),
-                                    clientInfo.get(input.clientId()),
+                                    CLIENT_INFO.get(input.clientId()),
                                     input.opId()
                             );
                             break;
                         case UPDATE:
                             configureOutput = configureUpdate(
                                     (CreateOrUpdate) input.opBody(),
-                                    clientInfo.get(input.clientId()),
+                                    CLIENT_INFO.get(input.clientId()),
                                     input.opId()
                             );
                             break;
@@ -791,10 +833,12 @@
                         case DELETE:
                             configureOutput = configureDelete(
                                     (DeleteOrQuery) input.opBody(),
-                                    clientInfo.get(input.clientId()),
+                                    CLIENT_INFO.get(input.clientId()),
                                     input.opId()
                             );
                             break;
+                        default:
+                            break;
                     }
                     configureOutput.opId(input.opId());
                 }
@@ -827,23 +871,24 @@
             try {
                 for (ModelObject modelObject : getModelObjects(rpcInput.data(), configureBundles)) {
                     DefaultConfigureBundlesInput input = (DefaultConfigureBundlesInput) modelObject;
-                    if (!clientInfo.containsKey(input.clientId())) {
+                    if (!CLIENT_INFO.containsKey(input.clientId())) {
                         throw new RuntimeException("Client Identifier is not registered.");
                     }
-                    for (org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.configurebundles.configurebundlesinput.Bundles bundle : input.bundles()) {
+                    for (org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent
+                            .configurebundles.configurebundlesinput.Bundles bundle : input.bundles()) {
                         DefaultConfigureOutput configureOutput = new DefaultConfigureOutput();
                         switch (bundle.opType()) {
                             case CREATE:
                                 configureOutput = configureCreate(
                                         (CreateOrUpdate) bundle.opBody(),
-                                        clientInfo.get(input.clientId()),
+                                        CLIENT_INFO.get(input.clientId()),
                                         bundle.opId()
                                 );
                                 break;
                             case UPDATE:
                                 configureOutput = configureUpdate(
                                         (CreateOrUpdate) bundle.opBody(),
-                                        clientInfo.get(input.clientId()),
+                                        CLIENT_INFO.get(input.clientId()),
                                         bundle.opId()
                                 );
                                 break;
@@ -852,10 +897,12 @@
                             case DELETE:
                                 configureOutput = configureDelete(
                                         (DeleteOrQuery) bundle.opBody(),
-                                        clientInfo.get(input.clientId()),
+                                        CLIENT_INFO.get(input.clientId()),
                                         bundle.opId()
                                 );
                                 break;
+                            default:
+                                break;
                         }
                         Bundles result = new DefaultBundles();
                         result.opId(bundle.opId());
@@ -921,15 +968,15 @@
             try {
                 for (ModelObject modelObject : getModelObjects(rpcInput.data(), registerClient)) {
                     DefaultRegisterClientInput input = (DefaultRegisterClientInput) modelObject;
-                    if (clientInfo.containsKey(input.clientId())) {
+                    if (CLIENT_INFO.containsKey(input.clientId())) {
                         throw new RuntimeException("Client already registered.");
                     }
                     // keep information for each client. this can be moved to the DC Store and use Cache.
-                    clientInfo.put(input.clientId(), input);
+                    CLIENT_INFO.put(input.clientId(), input);
                     // keep clients for each tenant
-                    HashSet<ClientIdentifier> hashSet = tenantInfo.getOrDefault(input.tenantId(), Sets.newHashSet());
+                    HashSet<ClientIdentifier> hashSet = TENANT_INFO.getOrDefault(input.tenantId(), Sets.newHashSet());
                     hashSet.add(input.clientId());
-                    tenantInfo.put(input.tenantId(), hashSet);
+                    TENANT_INFO.put(input.tenantId(), hashSet);
                     registerClientOutput.clientId(input.clientId());
                     registerClientOutput.supportedFeatures(input.supportedFeatures());
                     registerClientOutput.endpointUri(input.endpointUri());
@@ -976,10 +1023,10 @@
             try {
                 for (ModelObject modelObject : getModelObjects(rpcInput.data(), registerClient)) {
                     DefaultRegisterClientInput input = (DefaultRegisterClientInput) modelObject;
-                    if (!clientInfo.containsKey(input.clientId())) {
+                    if (!CLIENT_INFO.containsKey(input.clientId())) {
                         throw new RuntimeException("Client does not exist.");
                     }
-                    clientInfo.remove(input.clientId());
+                    CLIENT_INFO.remove(input.clientId());
                     deregisterClientOutput.clientId(input.clientId());
 
                     cpProviderService.getListener().deviceRemoved(input.clientId().toString());
@@ -1018,7 +1065,7 @@
         @Override
         public void event(DeviceEvent event) {
             if (event.subject().manufacturer().equals("fpc")) {
-                tenantInfo.forEach(
+                TENANT_INFO.forEach(
                         (tenantId, clients) -> {
                             String nodeNetwork = event.subject().annotations().value("node/network");
                             try {
@@ -1063,8 +1110,8 @@
             }
 //            else if (event.subject().manufacturer().equals("cp")) {
 //                String clientId = event.subject().annotations().value("client-id");
-//                if (clientInfo.keySet().contains(ClientIdentifier.fromString(clientId))) {
-//                    DefaultRegisterClientInput clientInput = clientInfo.get(ClientIdentifier.fromString(clientId));
+//                if (CLIENT_INFO.keySet().contains(ClientIdentifier.fromString(clientId))) {
+//                    DefaultRegisterClientInput clientInput = CLIENT_INFO.get(ClientIdentifier.fromString(clientId));
 //
 //                    Optional<DefaultTenant> defaultTenant = getTenant(clientInput.tenantId());
 //                    if (defaultTenant.isPresent()) {
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcService.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcService.java
index 4a29287..fc237b1 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcService.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcService.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.onosproject.fpcagent;
 
 import com.google.common.annotations.Beta;
@@ -8,8 +24,6 @@
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.configuredpn.DefaultConfigureDpnOutput;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.opinput.opbody.CreateOrUpdate;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.opinput.opbody.DeleteOrQuery;
-import org.onosproject.yang.model.RpcInput;
-import org.onosproject.yang.model.RpcOutput;
 
 /**
  * Main service that handles RPC events and DC Store modifications.
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcService.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcService.java
index 6adc0bc..7bb120d 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcService.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcService.java
@@ -1,15 +1,31 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.onosproject.fpcagent;
 
-import org.onosproject.fpcagent.providers.DpnDeviceListener;
+import org.onosproject.fpcagent.providers.ZmqDpnDeviceListener;
 import org.onosproject.fpcagent.util.ConfigHelper;
 
 import java.util.Optional;
 
 public interface FpcService {
 
-    void addListener(DpnDeviceListener listener);
+    void addListener(ZmqDpnDeviceListener listener);
 
-    void removeListener(DpnDeviceListener listener);
+    void removeListener(ZmqDpnDeviceListener listener);
 
     Optional<ConfigHelper> getConfig();
 }
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnCommunicationService.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnCommunicationService.java
index c44a18b..88eab75 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnCommunicationService.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnCommunicationService.java
@@ -28,82 +28,82 @@
     /**
      * Creates Mobility Session.
      *
-     * @param topic_id     - DPN Topic ID
+     * @param topicId     - DPN Topic ID
      * @param imsi         - IMSI identifier
-     * @param default_ebi  - EBI
-     * @param ue_ipv4      - UE IPv4 Address
-     * @param s1u_sgw_teid - SGW Tunnel Identifier
-     * @param s1u_sgw_ipv4 - SGW IPv4
-     * @param session_id   - Context Identifier
-     * @param client_id    - Client Identifier
-     * @param op_id        - Operation Identifier
+     * @param defaultEbi  - EBI
+     * @param ueIpv4      - UE IPv4 Address
+     * @param s1USgwTeid - SGW Tunnel Identifier
+     * @param s1USgwIpv4 - SGW IPv4
+     * @param sessionId   - Context Identifier
+     * @param clientId    - Client Identifier
+     * @param opId        - Operation Identifier
      */
-    void create_session(
-            byte topic_id,
+    void createSession(
+            byte topicId,
             BigInteger imsi,
-            Short default_ebi,
-            Ip4Address ue_ipv4,
-            Long s1u_sgw_teid,
-            Ip4Address s1u_sgw_ipv4,
-            Long session_id,
-            Long client_id,
-            BigInteger op_id
+            Short defaultEbi,
+            Ip4Address ueIpv4,
+            Long s1USgwTeid,
+            Ip4Address s1USgwIpv4,
+            Long sessionId,
+            Long clientId,
+            BigInteger opId
     );
 
     /**
      * Modifies Bearer.
      *
-     * @param topic_id        - DPN Topic ID
-     * @param s1u_sgw_ipv4    - SGW IPv4 Address
-     * @param s1u_enodeb_teid - ENodeB Tunnel Identifier
-     * @param s1u_enodeb_ipv4 - ENodeB IPv4 Address
-     * @param session_id      - Context Identifier
-     * @param client_id       - Client Identifier
-     * @param op_id           - Operation Identifier
+     * @param topicId        - DPN Topic ID
+     * @param s1USgwIpv4    - SGW IPv4 Address
+     * @param s1UEnodebTeid - ENodeB Tunnel Identifier
+     * @param s1UEnodebIpv4 - ENodeB IPv4 Address
+     * @param sessionId      - Context Identifier
+     * @param clientId       - Client Identifier
+     * @param opId           - Operation Identifier
      */
-    void modify_bearer(
-            byte topic_id,
-            Ip4Address s1u_sgw_ipv4,
-            Long s1u_enodeb_teid,
-            Ip4Address s1u_enodeb_ipv4,
-            Long session_id,
-            Long client_id,
-            BigInteger op_id
+    void modifyBearer(
+            byte topicId,
+            Ip4Address s1USgwIpv4,
+            Long s1UEnodebTeid,
+            Ip4Address s1UEnodebIpv4,
+            Long sessionId,
+            Long clientId,
+            BigInteger opId
     );
 
     /**
      * Deletes Mobility Session.
      *
-     * @param topic_id   - DPN Topic ID
-     * @param session_id - Context Identifier
-     * @param client_id  - Client Identifier
-     * @param op_id      - Operation Identifier
+     * @param topicId   - DPN Topic ID
+     * @param sessionId - Context Identifier
+     * @param clientId  - Client Identifier
+     * @param opId      - Operation Identifier
      */
-    void delete_session(
-            byte topic_id,
-            Long session_id,
-            Long client_id,
-            BigInteger op_id
+    void deleteSession(
+            byte topicId,
+            Long sessionId,
+            Long clientId,
+            BigInteger opId
     );
 
     /**
-     * Creates the byte buffer to send ADC rules over ZMQ
+     * Creates the byte buffer to send ADC rules over ZMQ.
      *
      * @param topic        - DPN Topic ID
-     * @param domain_name  - domain
+     * @param domainName  - domain
      * @param ip           - ipaddress/ipprefix (i.e. 127.0.0.1/32)
      * @param drop         - Drop if 1
-     * @param rating_group - Rating Group
-     * @param service_ID   - Service ID
-     * @param sponsor_ID   - Sponsor ID
+     * @param ratingGroup - Rating Group
+     * @param serviceId   - Service ID
+     * @param sponsorId   - Sponsor ID
      */
-    void send_ADC_rules(
+    void sendAdcRules(
             Short topic,
-            String domain_name,
+            String domainName,
             String ip,
             Short drop,
-            Long rating_group,
-            Long service_ID,
-            String sponsor_ID
+            Long ratingGroup,
+            Long serviceId,
+            String sponsorId
     );
 }
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnNgicCommunicator.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnNgicCommunicator.java
index ba697ed..d35b65f 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnNgicCommunicator.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnNgicCommunicator.java
@@ -21,8 +21,8 @@
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.Ip4Prefix;
 import org.onosproject.fpcagent.util.CacheManager;
-import org.onosproject.fpcagent.workers.ZMQSBPublisherManager;
-import org.onosproject.fpcagent.workers.ZMQSBSubscriberManager;
+import org.onosproject.fpcagent.workers.ZmqSbPublisherManager;
+import org.onosproject.fpcagent.workers.ZmqSbSubscriberManager;
 import org.onosproject.yang.gen.v1.fpc.rev20150105.fpc.ZmqDpnControlProtocol;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpctopology.DefaultDpns;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcDpnId;
@@ -40,7 +40,7 @@
 /**
  * DPDK DPN API over ZeroMQ for NGIC.
  */
-public class DpnNgicCommunicator extends ZmqDpnControlProtocol implements DpnCommunicationService {
+public final class DpnNgicCommunicator extends ZmqDpnControlProtocol implements DpnCommunicationService {
     protected static final Logger log = LoggerFactory.getLogger(DpnNgicCommunicator.class);
 
     private static DpnNgicCommunicator _instance;
@@ -49,7 +49,7 @@
     }
 
     public static DpnNgicCommunicator createInstance() {
-        if(_instance == null) {
+        if (_instance == null) {
             _instance = new DpnNgicCommunicator();
         }
         return _instance;
@@ -60,94 +60,120 @@
     }
 
     /**
-     * Broadcasts the GOODBYE message to all the DPNs
+     * Broadcasts the GOODBYE message to all the DPNs.
+     *
+     * @param nodeId node identifier
+     * @param networkId network identifier
      */
-    public static void send_goodbye_dpns(String nodeId, String networkId) {
+    public static void sendGoodbyeDpns(String nodeId, String networkId) {
         ByteBuffer bb = ByteBuffer.allocate(10 + nodeId.length() + networkId.length());
         bb.put(ReservedTopics.BROADCAST_DPNS.getType())
-                .put(s11MsgType.CONTROLLER_STATUS_INDICATION.getType())
-                .put(ZMQSBSubscriberManager.getInstance().getControllerTopic())
+                .put(S11MsgType.CONTROLLER_STATUS_INDICATION.getType())
+                .put(ZmqSbSubscriberManager.getInstance().getControllerTopic())
                 .put(ControllerStatusIndication.GOODBYE.getType())
-                .put(toUint32(ZMQSBSubscriberManager.getInstance().getControllerSourceId()))
+                .put(toUint32(ZmqSbSubscriberManager.getInstance().getControllerSourceId()))
                 .put(toUint8((short) nodeId.length()))
                 .put(nodeId.getBytes())
                 .put(toUint8((short) networkId.length()))
                 .put(networkId.getBytes());
 
-        log.info("send_goodbye_dpns: {}", bb.array());
-        ZMQSBPublisherManager.getInstance().send(bb);
+        log.info("sendGoodbyeDpns: {}", bb.array());
+        ZmqSbPublisherManager.getInstance().send(bb);
     }
 
     /**
-     * Broadcasts the HELLO message to all the DPNs
+     * Broadcasts the HELLO message to all the DPNs.
+     *
+     * @param nodeId node identifier
+     * @param networkId network identifier
      */
-    public static void send_hello_dpns(String nodeId, String networkId) {
+    public static void sendHelloDpns(String nodeId, String networkId) {
         ByteBuffer bb = ByteBuffer.allocate(10 + nodeId.length() + networkId.length());
         bb.put(ReservedTopics.BROADCAST_DPNS.getType())
-                .put(s11MsgType.CONTROLLER_STATUS_INDICATION.getType())
-                .put(ZMQSBSubscriberManager.getInstance().getControllerTopic())
+                .put(S11MsgType.CONTROLLER_STATUS_INDICATION.getType())
+                .put(ZmqSbSubscriberManager.getInstance().getControllerTopic())
                 .put(ControllerStatusIndication.HELLO.getType())
-                .put(toUint32(ZMQSBSubscriberManager.getInstance().getControllerSourceId()))
+                .put(toUint32(ZmqSbSubscriberManager.getInstance().getControllerSourceId()))
                 .put(toUint8((short) nodeId.length()))
                 .put(nodeId.getBytes())
                 .put(toUint8((short) networkId.length()))
                 .put(networkId.getBytes());
 
-        log.info("send_hello_dpns: {}", bb.array());
-        ZMQSBPublisherManager.getInstance().send(bb);
+        log.info("sendHelloDpns: {}", bb.array());
+        ZmqSbPublisherManager.getInstance().send(bb);
     }
 
-    public static void send_assign_conflict(String nodeId, String networkId) {
+    /**
+     * Broadcasts a conflict on node and network identifiers.
+     *
+     * @param nodeId node identifier
+     * @param networkId network identifier
+     */
+    public static void sendAssignConflict(String nodeId, String networkId) {
         ByteBuffer bb = ByteBuffer.allocate(9 + nodeId.length() + networkId.length());
         bb.put(ReservedTopics.BROADCAST_ALL.getType())
-                .put(s11MsgType.ASSIGN_CONFLICT.getType())
-                .put(ZMQSBSubscriberManager.getInstance().getControllerTopic())
-                .put(toUint32(ZMQSBSubscriberManager.getInstance().getControllerSourceId()))
+                .put(S11MsgType.ASSIGN_CONFLICT.getType())
+                .put(ZmqSbSubscriberManager.getInstance().getControllerTopic())
+                .put(toUint32(ZmqSbSubscriberManager.getInstance().getControllerSourceId()))
                 .put(toUint8((short) nodeId.length()))
                 .put(nodeId.getBytes())
                 .put(toUint8((short) networkId.length()))
                 .put(networkId.getBytes());
 
-        log.info("send_assign_conflict: {}", bb.array());
-        ZMQSBPublisherManager.getInstance().send(bb);
+        log.info("sendAssignConflict: {}", bb.array());
+        ZmqSbPublisherManager.getInstance().send(bb);
     }
 
-    public static void send_assign_topic(String nodeId, String networkId, byte topic) {
+    /**
+     * Broadcasts a topic to be assigned for the specific node and network.
+     *
+     * @param nodeId node identifier
+     * @param networkId network identifier
+     * @param topic assigned topic
+     */
+    public static void sendAssignTopic(String nodeId, String networkId, byte topic) {
         ByteBuffer bb = ByteBuffer.allocate(9 + nodeId.length() + networkId.length());
         bb.put(ReservedTopics.BROADCAST_ALL.getType())
-                .put(s11MsgType.ASSIGN_TOPIC.getType())
+                .put(S11MsgType.ASSIGN_TOPIC.getType())
                 .put(topic)
-                .put(toUint32(ZMQSBSubscriberManager.getInstance().getControllerSourceId()))
+                .put(toUint32(ZmqSbSubscriberManager.getInstance().getControllerSourceId()))
                 .put(toUint8((short) nodeId.length()))
                 .put(nodeId.getBytes())
                 .put(toUint8((short) networkId.length()))
                 .put(networkId.getBytes());
 
-        log.info("send_assign_topic: {}", bb.array());
-        ZMQSBPublisherManager.getInstance().send(bb);
+        log.info("sendAssignTopic: {}", bb.array());
+        ZmqSbPublisherManager.getInstance().send(bb);
     }
 
-    public static void send_status_ack(String nodeId, String networkId, byte topic) {
+    /**
+     * Sends acknowledgment for the DPN status.
+     *
+     * @param nodeId node identifier
+     * @param networkId network identifier
+     * @param topic node's topic
+     */
+    public static void sendStatusAck(String nodeId, String networkId, byte topic) {
         ByteBuffer bb = ByteBuffer.allocate(9 + nodeId.length() + networkId.length())
                 .put(topic)
-                .put(s11MsgType.DPN_STATUS_ACK.getType())
-                .put(ZMQSBSubscriberManager.getInstance().getControllerTopic())
-                .put(toUint32(ZMQSBSubscriberManager.getInstance().getControllerSourceId()))
+                .put(S11MsgType.DPN_STATUS_ACK.getType())
+                .put(ZmqSbSubscriberManager.getInstance().getControllerTopic())
+                .put(toUint32(ZmqSbSubscriberManager.getInstance().getControllerSourceId()))
                 .put(toUint8((short) nodeId.length()))
                 .put(nodeId.getBytes())
                 .put(toUint8((short) networkId.length()))
                 .put(networkId.getBytes());
 
-        log.info("send_status_ack: {}", bb.array());
-        ZMQSBPublisherManager.getInstance().send(bb);
+        log.info("sendStatusAck: {}", bb.array());
+        ZmqSbPublisherManager.getInstance().send(bb);
     }
 
     /**
-     * Parses the JSON returned from the Control Plane and sends the ACK to the DPN
+     * Parses the JSON returned from the Control Plane and sends the ACK to the DPN.
      *
      * @param body - The JSON body returned by the Control Plane in the DDN ACK
      */
-    public static void send_ddn_ack(JSONObject body) {
+    public static void sendDdnAck(JSONObject body) {
         try {
             ByteBuffer bb = ByteBuffer.allocate(14);
             byte topic = -1;
@@ -167,7 +193,7 @@
                 throw new RuntimeException("DPN specified in DDN not found.");
             }
 
-            bb.put(topic).put(s11MsgType.DDN_ACK.getType());
+            bb.put(topic).put(S11MsgType.DDN_ACK.getType());
 
             if (body.has("dl-buffering-duration")) {
                 bb.put(toUint8((short) body.getInt("dl-buffering-duration")));
@@ -175,11 +201,11 @@
             if (body.has("dl-buffering-suggested-count")) {
                 bb.put(toUint16((int) body.getInt("dl-buffering-suggested-count")));
             }
-            bb.put(ZMQSBSubscriberManager.getInstance().getControllerTopic())
+            bb.put(ZmqSbSubscriberManager.getInstance().getControllerTopic())
                     .put(toUint32(Long.parseLong(body.getString("client-id"))))
                     .put(toUint32(body.getLong("op-id")));
 
-            ZMQSBPublisherManager.getInstance().send(bb);
+            ZmqSbPublisherManager.getInstance().send(bb);
         } catch (Exception e) {
             log.error("{}", ExceptionUtils.getFullStackTrace(e));
         }
@@ -187,20 +213,21 @@
     }
 
     @Override
-    public void create_session(
-            byte topic_id,
+    public void createSession(
+            byte topicId,
             BigInteger imsi,
-            Short default_ebi,
-            Ip4Address ue_ipv4,
-            Long s1u_sgw_teid,
-            Ip4Address s1u_sgw_ipv4,
-            Long session_id,
-            Long client_id,
-            BigInteger op_id
+            Short defaultEbi,
+            Ip4Address ueIpv4,
+            Long s1USgwTeid,
+            Ip4Address s1USgwIpv4,
+            Long sessionId,
+            Long clientId,
+            BigInteger opId
     ) {
-        /* NGIC Create Session expected buffer:
+        /*
+            NGIC Create Session expected buffer:
             uint8_t topic_id;
-	        uint8_t type;
+            uint8_t type;
             struct create_session_t {
                 uint64_t imsi;
                 uint8_t  default_ebi;
@@ -214,155 +241,159 @@
             } create_session_msg;
          */
         ByteBuffer bb = ByteBuffer.allocate(41)
-                .put(topic_id)
-                .put(s11MsgType.CREATE_SESSION.getType())
+                .put(topicId)
+                .put(S11MsgType.CREATE_SESSION.getType())
                 .put(toUint64(imsi))
-                .put(toUint8(default_ebi))
-                .put(toUint32(ue_ipv4.toInt()))
-                .put(toUint32(s1u_sgw_teid))
-                .put(toUint32(s1u_sgw_ipv4.toInt()))
-                .put(toUint64(BigInteger.valueOf(session_id)))
-                .put(ZMQSBSubscriberManager.getInstance().getControllerTopic())
-                .put(toUint32(client_id))
-                .put(toUint32(op_id.longValue()));
+                .put(toUint8(defaultEbi))
+                .put(toUint32(ueIpv4.toInt()))
+                .put(toUint32(s1USgwTeid))
+                .put(toUint32(s1USgwIpv4.toInt()))
+                .put(toUint64(BigInteger.valueOf(sessionId)))
+                .put(ZmqSbSubscriberManager.getInstance().getControllerTopic())
+                .put(toUint32(clientId))
+                .put(toUint32(opId.longValue()));
 
-        log.info("create_session(topic_id={}, imsi={}, default_ebi={}, " +
+        log.info("createSession(topic_id={}, imsi={}, default_ebi={}, " +
                         "ue_ipv4={}, s1u_sgw_teid={}, s1u_sgw_ipv4={}, " +
                         "session_id={}, client_id={}, op_id={})",
-                topic_id, imsi, default_ebi, ue_ipv4, s1u_sgw_teid,
-                s1u_sgw_ipv4, session_id, client_id, op_id);
+                topicId, imsi, defaultEbi, ueIpv4, s1USgwTeid,
+                s1USgwIpv4, sessionId, clientId, opId);
 
-        ZMQSBPublisherManager.getInstance().send(bb);
+        ZmqSbPublisherManager.getInstance().send(bb);
     }
 
     @Override
-    public void modify_bearer(
-            byte topic_id,
-            Ip4Address s1u_sgw_ipv4,
-            Long s1u_enodeb_teid,
-            Ip4Address s1u_enodeb_ipv4,
-            Long session_id,
-            Long client_id,
-            BigInteger op_id
+    public void modifyBearer(
+            byte topicId,
+            Ip4Address s1USgwIpv4,
+            Long s1UEnodebTeid,
+            Ip4Address s1UEnodebIpv4,
+            Long sessionId,
+            Long clientId,
+            BigInteger opId
     ) {
         /*
-           NGIC Modify Session expected buffer:
-           	uint8_t topic_id;
-	        uint8_t type;
-	        struct modify_bearer_t {
-			    uint32_t s1u_sgw_ipv4;
-			    uint32_t s1u_enodeb_teid;
-			    uint32_t s1u_enodeb_ipv4;
-			    uint64_t session_id;
-			    uint8_t  controller_topic;
-			    uint32_t client_id;
-			    uint32_t op_id;
-		    } modify_bearer_msg;
+            NGIC Modify Session expected buffer:
+            uint8_t topic_id;
+            uint8_t type;
+            struct modify_bearer_t {
+                uint32_t s1u_sgw_ipv4;
+                uint32_t s1u_enodeb_teid;
+                uint32_t s1u_enodeb_ipv4;
+                uint64_t session_id;
+                uint8_t  controller_topic;
+                uint32_t client_id;
+                uint32_t op_id;
+            } modify_bearer_msg;
          */
         ByteBuffer bb = ByteBuffer.allocate(32)
-                .put(topic_id)
-                .put(s11MsgType.UPDATE_MODIFY_BEARER.getType())
-                .put(toUint32(s1u_sgw_ipv4.toInt()))
-                .put(toUint32(s1u_enodeb_teid))
-                .put(toUint32(s1u_enodeb_ipv4.toInt()))
-                .put(toUint64(BigInteger.valueOf(session_id)))
-                .put(ZMQSBSubscriberManager.getInstance().getControllerTopic())
-                .put(toUint32(client_id))
-                .put(toUint32(op_id.longValue()));
+                .put(topicId)
+                .put(S11MsgType.UPDATE_MODIFY_BEARER.getType())
+                .put(toUint32(s1USgwIpv4.toInt()))
+                .put(toUint32(s1UEnodebTeid))
+                .put(toUint32(s1UEnodebIpv4.toInt()))
+                .put(toUint64(BigInteger.valueOf(sessionId)))
+                .put(ZmqSbSubscriberManager.getInstance().getControllerTopic())
+                .put(toUint32(clientId))
+                .put(toUint32(opId.longValue()));
 
-        log.info("modify_bearer(topic_id={}, s1u_sgw_ipv4={}, " +
+        log.info("modifyBearer(topic_id={}, s1u_sgw_ipv4={}, " +
                         "s1u_enodeb_teid={}, s1u_enodeb_ipv4={}, " +
                         "session_id={}, client_id={}, op_id={})",
-                topic_id, s1u_sgw_ipv4, s1u_enodeb_teid, s1u_enodeb_ipv4,
-                session_id, client_id, op_id);
+                topicId, s1USgwIpv4, s1UEnodebTeid, s1UEnodebIpv4,
+                sessionId, clientId, opId);
 
-        ZMQSBPublisherManager.getInstance().send(bb);
+        ZmqSbPublisherManager.getInstance().send(bb);
     }
 
     @Override
-    public void delete_session(
-            byte topic_id,
-            Long session_id,
-            Long client_id,
-            BigInteger op_id
+    public void deleteSession(
+            byte topicId,
+            Long sessionId,
+            Long clientId,
+            BigInteger opId
     ) {
         /*
             NGIC Delete Session expected buffer:
             uint8_t topic_id;
-	        uint8_t type;
+            uint8_t type;
             struct delete_session_t {
-			    uint64_t session_id;
-			    uint8_t  controller_topic;
-			    uint32_t client_id;
-			    uint32_t op_id;
-		    } delete_session_msg;
+                uint64_t session_id;
+                uint8_t  controller_topic;
+                uint32_t client_id;
+                uint32_t op_id;
+            } delete_session_msg;
          */
         ByteBuffer bb = ByteBuffer.allocate(19)
-                .put(topic_id)
-                .put(s11MsgType.DELETE_SESSION.getType())
-                .put(toUint64(BigInteger.valueOf(session_id)))
-                .put(ZMQSBSubscriberManager.getInstance().getControllerTopic())
-                .put(toUint32(client_id))
-                .put(toUint32(op_id.longValue()));
+                .put(topicId)
+                .put(S11MsgType.DELETE_SESSION.getType())
+                .put(toUint64(BigInteger.valueOf(sessionId)))
+                .put(ZmqSbSubscriberManager.getInstance().getControllerTopic())
+                .put(toUint32(clientId))
+                .put(toUint32(opId.longValue()));
 
-        log.info("delete_session(topic_id={}, session_id={}, client_id={}, " +
+        log.info("deleteSession(topic_id={}, session_id={}, client_id={}, " +
                         "op_id={})",
-                topic_id, session_id, client_id, op_id);
-        
-        ZMQSBPublisherManager.getInstance().send(bb);
+                topicId, sessionId, clientId, opId);
+
+        ZmqSbPublisherManager.getInstance().send(bb);
     }
 
     @Override
-    public void send_ADC_rules(
+    public void sendAdcRules(
             Short topic,
-            String domain_name,
+            String domainName,
             String ip,
             Short drop,
-            Long rating_group,
-            Long service_ID, String sponsor_ID
+            Long ratingGroup,
+            Long serviceId, String sponsorId
     ) {
         // TODO take a look for this function. Not tested.
-        Ip4Prefix ip_prefix = null;
+        Ip4Prefix ip4Prefix = null;
         if (ip != null) {
-            ip_prefix = Ip4Prefix.valueOf(ip);
+            ip4Prefix = Ip4Prefix.valueOf(ip);
         }
-        Short selector_type = (short) (domain_name != null ? 0 : ip_prefix != null ? 2 : ip_prefix.address() != null ? 1 : 255);
-        if (selector_type == 255) {
+        Short selectorType = (short) (domainName != null ? 0 : ip4Prefix != null ?
+                2 : ip4Prefix.address() != null ? 1 : 255);
+        if (selectorType == 255) {
             log.warn("Domain/IP not found, failed to send rules");
             return;
         }
         ByteBuffer bb = ByteBuffer.allocate(200);
         bb.put(toUint8(topic))
-                .put(s11MsgType.ADC_RULE.getType())
-                .put(toUint8(selector_type));
-        if (selector_type == 0) {
-            bb.put(toUint8((short) domain_name.length()))
-                    .put(domain_name.getBytes());
+                .put(S11MsgType.ADC_RULE.getType())
+                .put(toUint8(selectorType));
+        if (selectorType == 0) {
+            bb.put(toUint8((short) domainName.length()))
+                    .put(domainName.getBytes());
         }
-        if ((selector_type == 1) || (selector_type == 2)) {
-            int ip_address_long = ip_prefix.address().toInt();
-            bb.put(toUint32(ip_address_long));
+        if ((selectorType == 1) || (selectorType == 2)) {
+            int ipAddressLong = ip4Prefix.address().toInt();
+            bb.put(toUint32(ipAddressLong));
         }
-        if (selector_type == 2) {
-            bb.put(toUint16(ip_prefix.prefixLength()));
+        if (selectorType == 2) {
+            bb.put(toUint16(ip4Prefix.prefixLength()));
         }
-        if (drop != null)
+        if (drop != null) {
             bb.put(toUint8(drop));
-        if (rating_group != null)
-            bb.put(toUint32(rating_group));
-        if (service_ID != null)
-            bb.put(toUint32(service_ID));
-        if (sponsor_ID != null && (short) sponsor_ID.length() > 0) {
-            bb.put(toUint8((short) sponsor_ID.length()))
-                    .put(sponsor_ID.getBytes());
         }
-        bb.put(ZMQSBSubscriberManager.getInstance().getControllerTopic());
+        if (ratingGroup != null) {
+            bb.put(toUint32(ratingGroup));
+        }
+        if (serviceId != null) {
+            bb.put(toUint32(serviceId));
+        }
+        if (sponsorId != null && (short) sponsorId.length() > 0) {
+            bb.put(toUint8((short) sponsorId.length()))
+                    .put(sponsorId.getBytes());
+        }
+        bb.put(ZmqSbSubscriberManager.getInstance().getControllerTopic());
 
-        log.info("send_ADC_rules: {}", bb.array());
-        ZMQSBPublisherManager.getInstance().send(bb);
+        log.info("sendAdcRules: {}", bb.array());
+        ZmqSbPublisherManager.getInstance().send(bb);
     }
 
-    public enum s11MsgType {
+    public enum S11MsgType {
         CREATE_SESSION(1) {
             @Override
             public String toString() {
@@ -486,12 +517,12 @@
 
         private byte type;
 
-        s11MsgType(int type) {
+        S11MsgType(int type) {
             this.type = (byte) type;
         }
 
-        public static s11MsgType getEnum(byte name) {
-            Optional<s11MsgType> any = Arrays.stream(s11MsgType.values())
+        public static S11MsgType getEnum(byte name) {
+            Optional<S11MsgType> any = Arrays.stream(S11MsgType.values())
                     .filter(typeStr -> typeStr.type == name)
                     .findAny();
             if (any.isPresent()) {
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnP4Communicator.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnP4Communicator.java
index 6a26e60..83afb22 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnP4Communicator.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/DpnP4Communicator.java
@@ -35,6 +35,8 @@
 import org.onosproject.net.pi.runtime.PiAction;
 import org.onosproject.net.pi.runtime.PiActionParam;
 import org.onosproject.yang.gen.v1.fpc.rev20150105.fpc.P4DpnControlProtocol;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.ClientIdentifier;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.OpIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,55 +50,58 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.util.ImmutableByteSequence.copyFrom;
+import static org.onosproject.fpcagent.util.FpcUtil.createConfigResultNotification;
+import static org.onosproject.fpcagent.util.FpcUtil.sendNotification;
 
-public class DpnP4Communicator
+public final class DpnP4Communicator
         extends P4DpnControlProtocol
         implements DpnCommunicationService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static PiTableId TBL_ID_UE_FILTER = PiTableId
+    private static final PiTableId TBL_ID_UE_FILTER = PiTableId
             .of("spgw_ingress.ue_filter_table");
-    private static PiTableId TBL_ID_S1U_FILTER = PiTableId
+    private static final PiTableId TBL_ID_S1U_FILTER = PiTableId
             .of("spgw_ingress.s1u_filter_table");
-    private static PiTableId TBL_ID_DL_SESS_LOOKUP = PiTableId
+    private static final PiTableId TBL_ID_DL_SESS_LOOKUP = PiTableId
             .of("spgw_ingress.dl_sess_lookup");
 
-    private static PiMatchFieldId MF_ID_IPV4_DST = PiMatchFieldId
+    private static final PiMatchFieldId MF_ID_IPV4_DST = PiMatchFieldId
             .of("ipv4.dst_addr");
-    private static PiMatchFieldId MF_ID_GTPU_IPV4_DST = PiMatchFieldId
+    private static final PiMatchFieldId MF_ID_GTPU_IPV4_DST = PiMatchFieldId
             .of("gtpu_ipv4.dst_addr");
 
-    private static PiActionId ACT_ID_SET_DL_SESS_INFO = PiActionId
+    private static final PiActionId ACT_ID_SET_DL_SESS_INFO = PiActionId
             .of("spgw_ingress.set_dl_sess_info");
-    private static PiActionParamId ACT_PARAM_ID_DL_TEID = PiActionParamId
+    private static final PiActionParamId ACT_PARAM_ID_DL_TEID = PiActionParamId
             .of("dl_sess_teid");
-    private static PiActionParamId ACT_PARAM_ID_DL_ENB_ADDR = PiActionParamId
+    private static final PiActionParamId ACT_PARAM_ID_DL_ENB_ADDR = PiActionParamId
             .of("dl_sess_enb_addr");
-    private static PiActionParamId ACT_PARAM_ID_DL_S1U_ADDR = PiActionParamId
+    private static final PiActionParamId ACT_PARAM_ID_DL_S1U_ADDR = PiActionParamId
             .of("dl_sess_s1u_addr");
 
-    private static PiAction NO_ACTION = PiAction.builder()
+    private static final PiAction NO_ACTION = PiAction.builder()
             .withId(PiActionId.of("NoAction"))
             .build();
 
-    private static byte DIR_UPLINK = (byte) 0;
-    private static byte DIR_DOWNLINK = (byte) 1;
+    private static final byte DIR_UPLINK = (byte) 0;
+    private static final byte DIR_DOWNLINK = (byte) 1;
 
-    private static ConcurrentMap<Long, Ip4Address> SESS_ID_TO_UE_ADDR =
+    private static final ConcurrentMap<Long, Ip4Address> SESS_ID_TO_UE_ADDR =
             Maps.newConcurrentMap();
-    private static ConcurrentMap<Long, Ip4Address> SESS_ID_TO_S1U_ADDR =
+    private static final ConcurrentMap<Long, Ip4Address> SESS_ID_TO_S1U_ADDR =
             Maps.newConcurrentMap();
-    private static ConcurrentMap<Long, Set<FlowRule>> SESS_ID_TO_FLOWS =
+    private static final ConcurrentMap<Long, Set<FlowRule>> SESS_ID_TO_FLOWS =
             Maps.newConcurrentMap();
 
     // FIXME: should use a cache with timeout
-    private static Map<Long, Lock> SESS_LOCKS = Maps.newConcurrentMap();
+    private static final Map<Long, Lock> SESS_LOCKS = Maps.newConcurrentMap();
 
     private static DpnP4Communicator _instance;
 
     private ApplicationId appId;
     private DeviceId deviceId;
+    private ClientIdentifier clientId;
     private FlowRuleService flowRuleService;
 
     private DpnP4Communicator(ApplicationId appId, FlowRuleService flowRuleService) {
@@ -120,6 +125,10 @@
         this.deviceId = checkNotNull(deviceId);
     }
 
+    public void setClientId(ClientIdentifier clientId) {
+        this.clientId = clientId;
+    }
+
     private boolean isNotInit() {
         if (deviceId == null) {
             log.error("Not initialized. Cannot perform operations.");
@@ -130,132 +139,147 @@
     }
 
     @Override
-    public void create_session(byte topic_id, BigInteger imsi, Short default_ebi,
-                               Ip4Address ue_ipv4, Long s1u_sgw_teid,
-                               Ip4Address s1u_sgw_ipv4, Long session_id,
-                               Long client_id, BigInteger op_id) {
+    public void createSession(byte topicId, BigInteger imsi, Short defaultEbi,
+                              Ip4Address ueIpv4, Long s1USgwTeid,
+                              Ip4Address s1USgwIpv4, Long sessionId,
+                              Long clientId, BigInteger opId) {
 
-        log.info("create_session(topic_id={}, imsi={}, default_ebi={}, " +
+        log.info("createSession(topic_id={}, imsi={}, default_ebi={}, " +
                          "ue_ipv4={}, s1u_sgw_teid={}, s1u_sgw_ipv4={}, " +
                          "session_id={}, client_id={}, op_id={})",
-                 topic_id, imsi, default_ebi, ue_ipv4, s1u_sgw_teid,
-                 s1u_sgw_ipv4, session_id, client_id, op_id);
+                topicId, imsi, defaultEbi, ueIpv4, s1USgwTeid,
+                s1USgwIpv4, sessionId, clientId, opId);
 
         if (isNotInit()) {
             return;
         }
 
-        SESS_LOCKS.putIfAbsent(session_id, new ReentrantLock());
-        SESS_LOCKS.get(session_id).lock();
+        SESS_LOCKS.putIfAbsent(sessionId, new ReentrantLock());
+        SESS_LOCKS.get(sessionId).lock();
         try {
-            if (SESS_ID_TO_FLOWS.containsKey(session_id)
-                    && !SESS_ID_TO_FLOWS.get(session_id).isEmpty()) {
+            if (SESS_ID_TO_FLOWS.containsKey(sessionId)
+                    && !SESS_ID_TO_FLOWS.get(sessionId).isEmpty()) {
                 log.warn("Creating session {}, but {} rules already exists for such session.",
-                         session_id, SESS_ID_TO_FLOWS.get(session_id).size());
-                SESS_ID_TO_FLOWS.get(session_id).forEach(f -> log.debug("{}", f));
+                        sessionId, SESS_ID_TO_FLOWS.get(sessionId).size());
+                SESS_ID_TO_FLOWS.get(sessionId).forEach(f -> log.debug("{}", f));
             }
 
             // If old session is there. We keep the old rules.
-            SESS_ID_TO_FLOWS.putIfAbsent(session_id, Sets.newHashSet());
-            SESS_ID_TO_UE_ADDR.put(session_id, ue_ipv4);
-            SESS_ID_TO_S1U_ADDR.put(session_id, s1u_sgw_ipv4);
+            SESS_ID_TO_FLOWS.putIfAbsent(sessionId, Sets.newHashSet());
+            SESS_ID_TO_UE_ADDR.put(sessionId, ueIpv4);
+            SESS_ID_TO_S1U_ADDR.put(sessionId, s1USgwIpv4);
 
-            SESS_ID_TO_FLOWS.get(session_id).add(ueFilterRule(ue_ipv4));
-            SESS_ID_TO_FLOWS.get(session_id).add(s1uFilterRule(s1u_sgw_ipv4));
+            SESS_ID_TO_FLOWS.get(sessionId).add(ueFilterRule(ueIpv4));
+            SESS_ID_TO_FLOWS.get(sessionId).add(s1uFilterRule(s1USgwIpv4));
 
-            applySessionRules(session_id);
+            applySessionRules(sessionId);
+
+            sendNotification(
+                    clientId.toString(),
+                    createConfigResultNotification(OpIdentifier.of(opId), (short) 16)
+            );
         } finally {
-            SESS_LOCKS.get(session_id).unlock();
+            SESS_LOCKS.get(sessionId).unlock();
         }
     }
 
     @Override
-    public void modify_bearer(byte topic_id, Ip4Address s1u_sgw_ipv4,
-                              Long s1u_enodeb_teid, Ip4Address s1u_enodeb_ipv4,
-                              Long session_id, Long client_id, BigInteger op_id) {
+    public void modifyBearer(byte topicId, Ip4Address s1USgwIpv4,
+                             Long s1UEnodebTeid, Ip4Address s1UEnodebIpv4,
+                             Long sessionId, Long clientId, BigInteger opId) {
 
-        log.info("modify_bearer(topic_id={}, s1u_sgw_ipv4={}, " +
+        log.info("modifyBearer(topic_id={}, s1u_sgw_ipv4={}, " +
                          "s1u_enodeb_teid={}, s1u_enodeb_ipv4={}, " +
                          "session_id={}, client_id={}, op_id={})",
-                 topic_id, s1u_sgw_ipv4, s1u_enodeb_teid, s1u_enodeb_ipv4,
-                 session_id, client_id, op_id);
+                topicId, s1USgwIpv4, s1UEnodebTeid, s1UEnodebIpv4,
+                sessionId, clientId, opId);
 
         if (isNotInit()) {
             return;
         }
 
-        SESS_LOCKS.putIfAbsent(session_id, new ReentrantLock());
-        SESS_LOCKS.get(session_id).lock();
+        SESS_LOCKS.putIfAbsent(sessionId, new ReentrantLock());
+        SESS_LOCKS.get(sessionId).lock();
         try {
-            if (!SESS_ID_TO_UE_ADDR.containsKey(session_id)) {
+            if (!SESS_ID_TO_UE_ADDR.containsKey(sessionId)) {
                 log.error("Missing sess ID in SESS_ID_TO_UE_ADDR map: {}",
-                          session_id);
+                        sessionId);
                 return;
             }
-            if (!SESS_ID_TO_S1U_ADDR.containsKey(session_id)) {
+            if (!SESS_ID_TO_S1U_ADDR.containsKey(sessionId)) {
                 log.error("Missing sess ID in SESS_ID_TO_S1U_ADDR map: {}",
-                          session_id);
+                        sessionId);
                 return;
             }
 
-            final Ip4Address ueAddr = SESS_ID_TO_UE_ADDR.get(session_id);
-            final Ip4Address s1uAddr = SESS_ID_TO_S1U_ADDR.get(session_id);
+            final Ip4Address ueAddr = SESS_ID_TO_UE_ADDR.get(sessionId);
+            final Ip4Address s1uAddr = SESS_ID_TO_S1U_ADDR.get(sessionId);
 
-            SESS_ID_TO_FLOWS.get(session_id)
-                    .add(dlSessLookupRule(ueAddr, s1u_enodeb_teid,
-                                          s1u_enodeb_ipv4, s1uAddr));
+            SESS_ID_TO_FLOWS.get(sessionId)
+                    .add(dlSessLookupRule(ueAddr, s1UEnodebTeid,
+                            s1UEnodebIpv4, s1uAddr));
 
-            applySessionRules(session_id);
+            applySessionRules(sessionId);
+
+            sendNotification(
+                    clientId.toString(),
+                    createConfigResultNotification(OpIdentifier.of(opId), (short) 16)
+            );
         } finally {
-            SESS_LOCKS.get(session_id).unlock();
+            SESS_LOCKS.get(sessionId).unlock();
         }
     }
 
     @Override
-    public void delete_session(byte topic_id, Long session_id, Long client_id,
-                               BigInteger op_id) {
+    public void deleteSession(byte topicId, Long sessionId, Long clientId,
+                              BigInteger opId) {
 
-        log.info("delete_session(topic_id={}, session_id={}, client_id={}, " +
+        log.info("deleteSession(topic_id={}, session_id={}, client_id={}, " +
                          "op_id={})",
-                 topic_id, session_id, client_id, op_id);
+                topicId, sessionId, clientId, opId);
 
         if (isNotInit()) {
             return;
         }
 
-        SESS_LOCKS.putIfAbsent(session_id, new ReentrantLock());
-        SESS_LOCKS.get(session_id).lock();
+        SESS_LOCKS.putIfAbsent(sessionId, new ReentrantLock());
+        SESS_LOCKS.get(sessionId).lock();
         try {
-            SESS_ID_TO_S1U_ADDR.remove(session_id);
-            SESS_ID_TO_UE_ADDR.remove(session_id);
+            SESS_ID_TO_S1U_ADDR.remove(sessionId);
+            SESS_ID_TO_UE_ADDR.remove(sessionId);
 
-            if (!SESS_ID_TO_FLOWS.containsKey(session_id)
-                    || SESS_ID_TO_FLOWS.get(session_id).isEmpty()) {
+            if (!SESS_ID_TO_FLOWS.containsKey(sessionId)
+                    || SESS_ID_TO_FLOWS.get(sessionId).isEmpty()) {
                 log.warn("Deleting session {}, but no rules exist for this session",
-                         session_id);
+                        sessionId);
             } else {
-                removeSessionRules(session_id);
+                removeSessionRules(sessionId);
+
+                sendNotification(
+                        clientId.toString(),
+                        createConfigResultNotification(OpIdentifier.of(opId), (short) 16)
+                );
             }
         } finally {
-            SESS_LOCKS.get(session_id).unlock();
+            SESS_LOCKS.get(sessionId).unlock();
         }
     }
 
     @Override
-    public void send_ADC_rules(Short topic, String domain_name, String ip,
-                               Short drop, Long rating_group, Long service_ID,
-                               String sponsor_ID) {
+    public void sendAdcRules(Short topic, String domainName, String ip,
+                             Short drop, Long ratingGroup, Long serviceId,
+                             String sponsorId) {
 
-        log.info("send_ADC_rules(topic={}, domain_name={}, ip={}, drop={}, " +
+        log.info("sendAdcRules(topic={}, domain_name={}, ip={}, drop={}, " +
                          "rating_group={}, service_ID={}, sponsor_ID={})",
-                 topic, domain_name, ip, drop, rating_group, service_ID,
-                 sponsor_ID);
+                 topic, domainName, ip, drop, ratingGroup, serviceId,
+                sponsorId);
 
         if (isNotInit()) {
             return;
         }
 
-        log.warn("send_ADC_rules() UNIMPLEMENTED!");
+        log.warn("sendAdcRules() UNIMPLEMENTED!");
     }
 
     private FlowRule ueFilterRule(Ip4Address ueAddr) {
@@ -353,5 +377,7 @@
         final FlowRuleOperations.Builder opsBuilder = FlowRuleOperations.builder();
         rules.forEach(opsBuilder::remove);
         flowRuleService.apply(opsBuilder.build());
+
+
     }
 }
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/package-info.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/package-info.java
index 21c1413..d6b5429 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/package-info.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/protocols/package-info.java
@@ -14,4 +14,7 @@
  * limitations under the License.
  */
 
+/**
+ * Supported protocols for Southbound Interface.
+ */
 package org.onosproject.fpcagent.protocols;
\ No newline at end of file
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/CpProvider.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/CpProvider.java
index 0d77d14..23618c0 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/CpProvider.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/CpProvider.java
@@ -16,9 +16,20 @@
 
 package org.onosproject.fpcagent.providers;
 
-import org.apache.felix.scr.annotations.*;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.ChassisId;
-import org.onosproject.net.*;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.MastershipRole;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.SparseAnnotations;
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DeviceDescription;
 import org.onosproject.net.device.DeviceProviderRegistry;
@@ -100,7 +111,8 @@
                     .set(AnnotationKeys.MANAGEMENT_ADDRESS, address)
                     .set("client-id", id)
                     .build();
-            DeviceDescription descriptionBase = new DefaultDeviceDescription(deviceId.uri(), type, "cp", "0.1", "0.1", id, chassisId),
+            DeviceDescription descriptionBase = new DefaultDeviceDescription(
+                    deviceId.uri(), type, "cp", "0.1", "0.1", id, chassisId),
                     description = new DefaultDeviceDescription(descriptionBase, annotations);
 
             providerService.deviceConnected(deviceId, description);
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnDeviceListener.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnDeviceListener.java
similarity index 94%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnDeviceListener.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnDeviceListener.java
index 8d099f0..c13bf06 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnDeviceListener.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnDeviceListener.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.fpcagent.providers;
 
-public interface DpnDeviceListener {
+public interface ZmqDpnDeviceListener {
     void deviceAdded(String id, byte topic);
 
     void deviceRemoved(String id);
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnProvider.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProvider.java
similarity index 74%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnProvider.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProvider.java
index 69bfba6..c7f2706 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnProvider.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProvider.java
@@ -16,9 +16,20 @@
 
 package org.onosproject.fpcagent.providers;
 
-import org.apache.felix.scr.annotations.*;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.ChassisId;
-import org.onosproject.net.*;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.MastershipRole;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.SparseAnnotations;
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DeviceDescription;
 import org.onosproject.net.device.DeviceProviderRegistry;
@@ -35,17 +46,17 @@
  */
 @Component(immediate = true)
 @Service
-public class DpnProvider extends AbstractProvider implements DpnProviderService {
+public class ZmqDpnProvider extends AbstractProvider implements ZmqDpnProviderService {
 
-    private static final Logger log = getLogger(DpnProvider.class);
-    private final InternalDeviceListener listener = new InternalDeviceListener();
+    private static final Logger log = getLogger(ZmqDpnProvider.class);
+    private final InternalDeviceListenerZmq listener = new InternalDeviceListenerZmq();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceProviderRegistry providerRegistry;
 
     private DeviceProviderService providerService;
 
-    public DpnProvider() {
+    public ZmqDpnProvider() {
         super(new ProviderId("fpc", "org.onosproject.providers.dpn"));
     }
 
@@ -62,7 +73,7 @@
         log.info("FPC Device Provider Stopped");
     }
 
-    public InternalDeviceListener getListener() {
+    public InternalDeviceListenerZmq getListener() {
         return listener;
     }
 
@@ -86,7 +97,7 @@
 
     }
 
-    public class InternalDeviceListener implements DpnDeviceListener {
+    public class InternalDeviceListenerZmq implements ZmqDpnDeviceListener {
 
         @Override
         public void deviceAdded(String id, byte topic) {
@@ -101,7 +112,8 @@
                     .set("topic", String.valueOf(topic))
                     .set("node/network", id)
                     .build();
-            DeviceDescription descriptionBase = new DefaultDeviceDescription(deviceId.uri(), type, "fpc", "0.1", "0.1", id, chassisId),
+            DeviceDescription descriptionBase = new DefaultDeviceDescription(
+                    deviceId.uri(), type, "fpc", "0.1", "0.1", id, chassisId),
                     description = new DefaultDeviceDescription(descriptionBase, annotations);
 
             providerService.deviceConnected(deviceId, description);
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnProviderService.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProviderService.java
similarity index 87%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnProviderService.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProviderService.java
index 515730a..cc78c6c 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnProviderService.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/ZmqDpnProviderService.java
@@ -18,8 +18,8 @@
 
 import org.onosproject.net.device.DeviceProvider;
 
-public interface DpnProviderService extends DeviceProvider {
+public interface ZmqDpnProviderService extends DeviceProvider {
 
-    DpnDeviceListener getListener();
+    ZmqDpnDeviceListener getListener();
 
 }
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/package-info.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/package-info.java
index 7f99f9d..650e2f3 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/package-info.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/package-info.java
@@ -14,4 +14,7 @@
  * limitations under the License.
  */
 
+/**
+ * Device providers for NGIC CP and DP.
+ */
 package org.onosproject.fpcagent.providers;
\ No newline at end of file
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java
index 047f15e..9d2baac 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java
@@ -39,7 +39,7 @@
 /**
  * Cache Manager.
  */
-public class CacheManager {
+public final class CacheManager {
 
     // Cacher per different Tenant
     public static ConcurrentMap<FpcIdentity, CacheManager> cacheInfo = Maps.newConcurrentMap();
@@ -121,8 +121,9 @@
                                     if (tenant.fpcTopology().dpns() != null) {
 
                                         return tenant.fpcTopology().dpns().stream()
-                                                .filter(dpns -> nodeNetwork.equals(dpns.nodeId() + "/" + dpns.networkId()))
-                                                .findFirst();
+                                                .filter(dpns -> nodeNetwork.equals(
+                                                        dpns.nodeId() + "/" + dpns.networkId())
+                                                ).findFirst();
                                     }
                                 }
                                 return Optional.empty();
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/ConfigHelper.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/ConfigHelper.java
index 20868af..6bae6b9 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/ConfigHelper.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/ConfigHelper.java
@@ -1,6 +1,27 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.onosproject.fpcagent.util;
 
-import com.fasterxml.jackson.annotation.*;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -79,7 +100,7 @@
     private Map<String, Object> additionalProperties = new HashMap<>();
 
     /**
-     * No args constructor for use in serialization
+     * No args constructor for use in serialization.
      */
     public ConfigHelper() {
     }
@@ -259,8 +280,8 @@
     }
 
 
-    public void setNodeId(String node_id) {
-        this.nodeId = node_id;
+    public void setNodeId(String nodeId) {
+        this.nodeId = nodeId;
     }
 
 
@@ -269,8 +290,8 @@
     }
 
 
-    public void setNetworkId(String network_id) {
-        this.networkId = network_id;
+    public void setNetworkId(String networkId) {
+        this.networkId = networkId;
     }
 
 
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/Converter.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/Converter.java
index fd4ba4a..c5434ab 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/Converter.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/Converter.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.onosproject.fpcagent.util;
 
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpcmobility.DefaultContexts;
@@ -17,11 +33,14 @@
 import java.util.Arrays;
 import java.util.List;
 
-public class Converter {
+public final class Converter {
     private static final Logger log = LoggerFactory.getLogger(Converter.class);
 
+    private Converter() {
+    }
+
     /**
-     * Short to Byte
+     * Short to Byte.
      *
      * @param value - Short
      * @return byte value
@@ -31,7 +50,7 @@
     }
 
     /**
-     * Short to byte array
+     * Short to byte array.
      *
      * @param value - Short
      * @return byte array
@@ -41,7 +60,7 @@
     }
 
     /**
-     * Lower two bytes of an integer to byte array
+     * Lower two bytes of an integer to byte array.
      *
      * @param value - integer value
      * @return byte array
@@ -67,13 +86,16 @@
      * @return byte array
      */
     public static byte[] toUint64(BigInteger value) {
-        return new byte[]{value.shiftRight(56).byteValue(), value.shiftRight(48).byteValue(), value.shiftRight(40).byteValue(),
-                value.shiftRight(32).byteValue(), value.shiftRight(24).byteValue(), value.shiftRight(16).byteValue(),
-                value.shiftRight(8).byteValue(), value.and(BigInteger.valueOf(0xFF)).byteValue()};
+        return new byte[]{
+                value.shiftRight(56).byteValue(), value.shiftRight(48).byteValue(),
+                value.shiftRight(40).byteValue(), value.shiftRight(32).byteValue(),
+                value.shiftRight(24).byteValue(), value.shiftRight(16).byteValue(),
+                value.shiftRight(8).byteValue(), value.and(BigInteger.valueOf(0xFF)).byteValue()
+        };
     }
 
     /**
-     * Decodes a 32 bit value
+     * Decodes a 32 bit value.
      *
      * @param source - byte array
      * @param offset - offset in the array where the 8 bytes begins
@@ -84,7 +106,7 @@
     }
 
     /**
-     * Converts a byte array to BigInteger
+     * Converts a byte array to BigInteger.
      *
      * @param source - byte array
      * @param offset - offset in the array where the 8 bytes begins
@@ -95,7 +117,7 @@
     }
 
     /**
-     * Converts an integer to a long (used for larger unsigned integers)
+     * Converts an integer to a long (used for larger unsigned integers).
      *
      * @param source - message buffer (byte array)
      * @param offset - offset in the array where the 4 bytes begins
@@ -109,7 +131,8 @@
         return value;
     }
 
-    public static DefaultContexts convertContext(org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.payload.Contexts contexts) {
+    public static DefaultContexts convertContext(org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803
+                                                         .ietfdmmfpcagent.payload.Contexts contexts) {
         DefaultContexts ctx = new DefaultContexts();
         FpcContextId fpcContextId = contexts.contextId();
         List<IpPrefix> ipPrefixes = contexts.delegatingIpPrefixes();
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java
index 18a38c9..3180aa7 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/FpcUtil.java
@@ -23,20 +23,39 @@
 import org.onosproject.config.DynamicConfigService;
 import org.onosproject.config.Filter;
 import org.onosproject.core.IdGenerator;
-import org.onosproject.fpcagent.util.eventStream.ConfigureService;
+import org.onosproject.fpcagent.util.eventstream.ConfigureService;
 import org.onosproject.net.Device;
 import org.onosproject.net.device.DeviceStore;
 import org.onosproject.restconf.utils.RestconfUtils;
 import org.onosproject.yang.gen.v1.fpc.rev20150105.fpc.registerclient.DefaultRegisterClientInput;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.ClientIdentifier;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.DefaultConfigResultNotification;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.DefaultTenants;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.NotificationId;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.OpIdentifier;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.Result;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.configresultnotification
+        .value.DefaultConfigResult;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.opstatusvalue.OpStatusEnum;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.result.ResultEnum;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.resultbody.resulttype.DefaultEmptyCase;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.DefaultTenant;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.TenantKeys;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcIdentity;
-import org.onosproject.yang.model.*;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.DefaultResourceData;
+import org.onosproject.yang.model.InnerModelObject;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.math.BigInteger;
 import java.util.AbstractMap;
 import java.util.HashSet;
 import java.util.List;
@@ -48,16 +67,16 @@
 /**
  * Helper class which stores all the static variables.
  */
-public class FpcUtil {
+public final class FpcUtil {
     public static final String FPC_APP_ID = "org.onosproject.fpcagent";
-    public static final FpcIdentity defaultIdentity = FpcIdentity.fromString("default");
-    public static final ConcurrentMap<ClientIdentifier, DefaultRegisterClientInput> clientInfo = Maps.newConcurrentMap();
-    public static final ConcurrentMap<FpcIdentity, HashSet<ClientIdentifier>> tenantInfo = Maps.newConcurrentMap();
+    public static final FpcIdentity DEFAULT_IDENTITY;
+    public static final ConcurrentMap<ClientIdentifier, DefaultRegisterClientInput> CLIENT_INFO;
+    public static final ConcurrentMap<FpcIdentity, HashSet<ClientIdentifier>> TENANT_INFO;
     private static final Logger log = LoggerFactory.getLogger(FpcUtil.class);
     // Services
-    public static DynamicConfigService dynamicConfigService = null;
-    public static ModelConverter modelConverter = null;
-    public static DeviceStore deviceStore = null;
+    public static DynamicConfigService dynamicConfigService;
+    public static ModelConverter modelConverter;
+    public static DeviceStore deviceStore;
     // Resource IDs
     public static ResourceId configureDpn;
     public static ResourceId configure;
@@ -70,6 +89,15 @@
     // Notification IDs generator
     public static IdGenerator notificationIds;
 
+    static {
+        DEFAULT_IDENTITY = FpcIdentity.fromString("default");
+        CLIENT_INFO = Maps.newConcurrentMap();
+        TENANT_INFO = Maps.newConcurrentMap();
+    }
+
+    private FpcUtil() {
+    }
+
     /**
      * Returns resource id from model converter.
      *
@@ -84,8 +112,7 @@
     }
 
     /**
-     * Returns the resource id, after constructing model object id and
-     * converting it.
+     * Returns the resource id, after constructing model object id and converting it.
      */
     public static void getResourceId() {
         ModelObjectId moduleId = ModelObjectId.builder().build();
@@ -148,20 +175,20 @@
         }
     }
 
-    /**
-     * Returns the resource ID of the parent data node pointed by {@code path}.
-     *
-     * @param path resource ID of the given data node
-     * @return resource ID of the parent data node
-     */
-    public static ResourceId parentOf(ResourceId path) throws Exception {
-        try {
-            return path.copyBuilder().removeLastKey().build();
-        } catch (CloneNotSupportedException e) {
-            log.error("Could not copy {}", path, e);
-            throw new RuntimeException("Could not copy " + path, e);
-        }
-    }
+//    /**
+//     * Returns the resource ID of the parent data node pointed by {@code path}.
+//     *
+//     * @param path resource ID of the given data node
+//     * @return resource ID of the parent data node
+//     */
+//    public static ResourceId parentOf(ResourceId path) throws Exception {
+//        try {
+//            return path.copyBuilder().removeLastKey().build();
+//        } catch (CloneNotSupportedException e) {
+//            log.error("Could not copy {}", path, e);
+//            throw new RuntimeException("Could not copy " + path, e);
+//        }
+//    }
 
     /**
      * Get model object for specific tenant.
@@ -195,7 +222,7 @@
     }
 
     /**
-     * Gets the mapping for node id / network id to ZMQ Topic
+     * Gets the mapping for node id / network id to ZMQ Topic.
      *
      * @param key - Concatenation of node id + / + network id
      * @return ZMQ Topic
@@ -297,6 +324,35 @@
         );
     }
 
+    /**
+     * Creates a Config Result Notification for SPGW-C.
+     *
+     * @param opId operation identifier
+     * @param cause cause id
+     * @return config result notification model
+     */
+    public static ModelObject createConfigResultNotification(OpIdentifier opId, short cause) {
+        DefaultConfigResultNotification notify = new DefaultConfigResultNotification();
+
+        notify.notificationId(NotificationId.of(notificationIds.getNewId()));
+        notify.timestamp(BigInteger.valueOf(System.currentTimeMillis()));
+        DefaultConfigResult result = new DefaultConfigResult();
+        result.causeValue(cause);
+        result.opId(opId);
+        result.opStatus(OpStatusEnum.OK);
+        result.result(Result.of(ResultEnum.OK));
+        result.resultType(new DefaultEmptyCase());
+        notify.value(result);
+
+        return notify;
+    }
+
+    /**
+     * Sends to specified CP the notification object.
+     *
+     * @param clientId client identifier (CP)
+     * @param notify notification object
+     */
     public static void sendNotification(String clientId, ModelObject notify) {
         try {
             ResourceData dataNode = modelConverter.createDataNode(
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ConfigureService.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/ConfigureService.java
similarity index 85%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ConfigureService.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/ConfigureService.java
index b9aa3a5..70f3b46 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ConfigureService.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/ConfigureService.java
@@ -1,11 +1,20 @@
 /*
- * Copyright © 2016 - 2017 Copyright (c) Sprint, Inc. and others.  All rights reserved.
+ * Copyright 2017-present Open Networking Foundation
  *
- * 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
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
-package org.onosproject.fpcagent.util.eventStream;
+
+package org.onosproject.fpcagent.util.eventstream;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.slf4j.Logger;
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
similarity index 74%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/JettyServer.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/JettyServer.java
index 5b243f6..a06dc47 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
@@ -1,11 +1,20 @@
 /*
- * Copyright © 2016 - 2017 Copyright (c) Sprint, Inc. and others.  All rights reserved.
+ * Copyright 2017-present Open Networking Foundation
  *
- * 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
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
-package org.onosproject.fpcagent.util.eventStream;
+
+package org.onosproject.fpcagent.util.eventstream;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.eclipse.jetty.server.Server;
@@ -18,7 +27,7 @@
 import java.util.concurrent.Executors;
 
 /**
- * SSE Server implementation
+ * SSE Server implementation.
  */
 public class JettyServer implements AutoCloseable {
     private static final Logger log = LoggerFactory.getLogger(JettyServer.class);
@@ -37,7 +46,7 @@
     }
 
     /**
-     * Method used to initialize and start the SSE server
+     * Method used to initialize and start the SSE server.
      */
     public void open() {
         ExecutorService executorService = Executors.newSingleThreadExecutor();
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/NBEventWorkerManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/NbEventWorkerManager.java
similarity index 66%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/NBEventWorkerManager.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/NbEventWorkerManager.java
index 879f989..2fbc782 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/NBEventWorkerManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/NbEventWorkerManager.java
@@ -1,11 +1,20 @@
 /*
- * Copyright © 2016 - 2017 Copyright (c) Sprint, Inc. and others.  All rights reserved.
+ * Copyright 2017-present Open Networking Foundation
  *
- * 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
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
-package org.onosproject.fpcagent.util.eventStream;
+
+package org.onosproject.fpcagent.util.eventstream;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -21,36 +30,45 @@
 import java.util.AbstractMap;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.concurrent.*;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
 
 /**
- * Implements a Worker to process event-data pairs sent by the FPC Client
+ * Implements a Worker to process event-data pairs sent by the FPC Client.
  */
-public class NBEventWorkerManager implements AutoCloseable {
-    private static final Logger log = LoggerFactory.getLogger(NBEventWorkerManager.class);
-    private static NBEventWorkerManager _instance = null;
+public class NbEventWorkerManager implements AutoCloseable {
+    private static final Logger log = LoggerFactory.getLogger(NbEventWorkerManager.class);
+    private static NbEventWorkerManager _instance = null;
 
-    public static Map<Integer, String> clientIdToUri = new ConcurrentHashMap<Integer, String>();
+    public static final Map<Integer, String> CLIENT_ID_TO_URI;
 
     private final BlockingQueue<Entry<String, Entry<String, String>>> blockingQueue;
     private final int poolSize;
     private boolean run;
     private final RestconfService restconfService;
 
-    protected NBEventWorkerManager(int poolSize, RestconfService restconfService) {
+    static {
+        CLIENT_ID_TO_URI = new ConcurrentHashMap<>();
+    }
+
+    protected NbEventWorkerManager(int poolSize, RestconfService restconfService) {
         this.poolSize = poolSize;
         this.restconfService = restconfService;
         this.blockingQueue = new LinkedBlockingQueue<>();
     }
 
-    public static NBEventWorkerManager createInstance(int poolSize, RestconfService restconfService) {
+    public static NbEventWorkerManager createInstance(int poolSize, RestconfService restconfService) {
         if (_instance == null) {
-            _instance = new NBEventWorkerManager(poolSize, restconfService);
+            _instance = new NbEventWorkerManager(poolSize, restconfService);
         }
         return _instance;
     }
 
-    public static NBEventWorkerManager getInstance() {
+    public static NbEventWorkerManager getInstance() {
         return _instance;
     }
 
@@ -81,11 +99,13 @@
                                 node,
                                 contents.getKey()
                         );
-                        String replace = output.get().output().toString().replace("ietf-dmm-fpcagent:output", "fpc:output");
+                        String replace = output.get().output().toString()
+                                .replace("ietf-dmm-fpcagent:output", "fpc:output");
                         ConfigureService.responseQueue.add(
                                 new AbstractMap.SimpleEntry(
                                         contents.getKey(),
-                                        "event:application/json;/onos/restconf/operations/ietf-dmm-fpcagent:configure\ndata:" + replace + "\r\n"
+                                        "event:application/json;/onos/restconf/" +
+                                                "operations/ietf-dmm-fpcagent:configure\ndata:" + replace + "\r\n"
                                 )
                         );
                     } else if (contents.getValue().getKey().contains("fpc:register-client")) {
@@ -98,7 +118,8 @@
                         ConfigureService.responseQueue.add(
                                 new AbstractMap.SimpleEntry(
                                         contents.getKey(),
-                                        "event:application/json;/onos/restconf/operations/fpc:register-client\ndata:" + output.get().output().toString() + "\r\n"
+                                        "event:application/json;/onos/restconf/operations/fpc:register-client\ndata:" +
+                                                output.get().output().toString() + "\r\n"
                                 )
                         );
                     } else if (contents.getValue().getKey().contains("fpc:deregister-client")) {
@@ -118,31 +139,35 @@
     }
 
     /**
-     * Add a FPC client URI to FPC client id mapping
+     * Add a FPC client URI to FPC client id mapping.
      *
      * @param registerClientOutput - Output of the register_cleint rpc
      * @param uri                  - FPC Client URI
      */
     private void addClientIdToUriMapping(String registerClientOutput, String uri) {
         try {
-            JSONObject registerJSON = new JSONObject(registerClientOutput);
-//            log.info("registerJSON: {}", registerJSON);
-            clientIdToUri.put(Integer.parseInt(registerJSON.getJSONObject("fpc:output").getString("client-id")), uri);
+            JSONObject registerjson = new JSONObject(registerClientOutput);
+//            log.info("registerjson: {}", registerjson);
+            CLIENT_ID_TO_URI.put(
+                    Integer.parseInt(registerjson.getJSONObject("fpc:output").getString("client-id")), uri
+            );
         } catch (JSONException e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
         }
     }
 
     /**
-     * Remove a FPC client URI to FPCClient Id mapping
+     * Remove a FPC client URI to FPCClient Id mapping.
      *
      * @param deregisterClientInput - Input String of deregister_client rpc
      */
     private void removeClientIdToUriMapping(String deregisterClientInput) {
         try {
-            JSONObject deregisterJSON = new JSONObject(deregisterClientInput);
-//            log.info("deregisterJSON: {}", deregisterJSON);
-            clientIdToUri.remove(Integer.parseInt(deregisterJSON.getJSONObject("input").getString("client-id")));
+            JSONObject deregisterjson = new JSONObject(deregisterClientInput);
+//            log.info("deregisterjson: {}", deregisterjson);
+            CLIENT_ID_TO_URI.remove(
+                    Integer.parseInt(deregisterjson.getJSONObject("input").getString("client-id"))
+            );
         } catch (JSONException e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
         }
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
similarity index 76%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/NotificationServer.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/NotificationServer.java
index 28ba759..80151dd 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
@@ -1,11 +1,20 @@
 /*
- * Copyright © 2016 - 2017 Copyright (c) Sprint, Inc. and others.  All rights reserved.
+ * Copyright 2017-present Open Networking Foundation
  *
- * 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
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
-package org.onosproject.fpcagent.util.eventStream;
+
+package org.onosproject.fpcagent.util.eventstream;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.eclipse.jetty.servlet.DefaultServlet;
@@ -25,7 +34,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * A HTTP servlet that handles requests for notification streams
+ * A HTTP servlet that handles requests for notification streams.
  */
 public class NotificationServer extends DefaultServlet {
     private static final Logger log = LoggerFactory.getLogger(ResponseServer.class);
@@ -64,7 +73,8 @@
                     log.error(ExceptionUtils.getFullStackTrace(e));
                 }
                 ServletContext servletContext = request.getServletContext();
-                Map<String, AsyncContext> notificationStreams = (ConcurrentHashMap<String, AsyncContext>) servletContext.getAttribute("notificationStreams");
+                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);
             }
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ParseStream.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/ParseStream.java
similarity index 83%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ParseStream.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/ParseStream.java
index 52eeb07..18634e0 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ParseStream.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/ParseStream.java
@@ -1,11 +1,20 @@
 /*
- * Copyright © 2016 - 2017 Copyright (c) Sprint, Inc. and others.  All rights reserved.
+ * Copyright 2017-present Open Networking Foundation
  *
- * 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
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
-package org.onosproject.fpcagent.util.eventStream;
+
+package org.onosproject.fpcagent.util.eventstream;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.slf4j.Logger;
@@ -20,9 +29,9 @@
 import java.util.concurrent.LinkedBlockingQueue;
 
 /**
- * A class that parses the request stream and enqueues creates event-data pairs for processing
+ * A class that parses the request stream and enqueues creates event-data pairs for processing.
  */
-public class ParseStream implements AutoCloseable {
+public final class ParseStream implements AutoCloseable {
     private static final Logger log = LoggerFactory.getLogger(ParseStream.class);
     private BlockingQueue<Map.Entry<String, CharBuffer>> blockingQueue;
     private CharBuffer charBuf;
@@ -108,7 +117,7 @@
                             } else if (line.startsWith("data")) {
                                 data = line.split(":", 2)[1];
                                 if (event != null && data != null) {
-                                    NBEventWorkerManager.getInstance()
+                                    NbEventWorkerManager.getInstance()
                                             .send(
                                                     new AbstractMap.SimpleEntry<>(
                                                             entry.getKey(),
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/RequestServer.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/RequestServer.java
similarity index 68%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/RequestServer.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/RequestServer.java
index 9715053..ecf045e 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/RequestServer.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/RequestServer.java
@@ -1,11 +1,20 @@
 /*
- * Copyright © 2016 - 2017 Copyright (c) Sprint, Inc. and others.  All rights reserved.
+ * Copyright 2017-present Open Networking Foundation
  *
- * 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
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
-package org.onosproject.fpcagent.util.eventStream;
+
+package org.onosproject.fpcagent.util.eventstream;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.http.HttpResponse;
@@ -23,38 +32,38 @@
 import java.util.AbstractMap;
 
 /**
- * A HTTP client that sends a request to a FPC Client to initiate the request stream.
+ * A HTTP ASYNC_CLIENT that sends a request to a FPC Client to initiate the request stream.
  */
 public class RequestServer {
     private static final Logger log = LoggerFactory.getLogger(RequestServer.class);
 
-    private static final CloseableHttpAsyncClient client = HttpAsyncClients.createDefault();
+    private static final CloseableHttpAsyncClient ASYNC_CLIENT = HttpAsyncClients.createDefault();
     protected String clientUri;
 
     /**
-     * Send HttpRequest to Client
+     * Send HttpRequest to Client.
      *
      * @param uri - FPC Client Uri
      */
     public void connectToClient(String uri) {
         this.clientUri = uri;
         try {
-            client.start();
+            ASYNC_CLIENT.start();
             HttpAsyncRequestProducer get = HttpAsyncMethods.createGet(this.clientUri);
-            client.execute(get, new RequestStreamConsumer(this.clientUri), null);
+            ASYNC_CLIENT.execute(get, new RequestStreamConsumer(this.clientUri), null);
         } catch (Exception e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
         }
     }
 
     /**
-     * A character consumer to read incoming characters on the request stream
+     * A character consumer to read incoming characters on the request stream.
      */
     static class RequestStreamConsumer extends AsyncCharConsumer<Boolean> {
         private String clientUri;
 
         /**
-         * Constructor
+         * Constructor.
          *
          * @param clientUri - URI of the FPC Client
          */
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
similarity index 75%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventStream/ResponseServer.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/ResponseServer.java
index 2218f1b..6490f9b 100644
--- 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
@@ -1,11 +1,20 @@
 /*
- * Copyright © 2016 - 2017 Copyright (c) Sprint, Inc. and others.  All rights reserved.
+ * Copyright 2017-present Open Networking Foundation
  *
- * 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
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
-package org.onosproject.fpcagent.util.eventStream;
+
+package org.onosproject.fpcagent.util.eventstream;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.eclipse.jetty.servlet.DefaultServlet;
@@ -26,14 +35,14 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * A Http Servlet to server response streams
+ * 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<>();
+    private static final ArrayList<String> CLIENT_URI_LIST = new ArrayList<>();
 
     /**
-     * Method for stream initialization
+     * Method for stream initialization.
      *
      * @param clientUri - Client Uri
      * @param request   - The servlet request object
@@ -58,7 +67,8 @@
                 log.error(ExceptionUtils.getFullStackTrace(e));
             }
             ServletContext servletContext = request.getServletContext();
-            Map<String, AsyncContext> responseStreams = (ConcurrentHashMap<String, AsyncContext>) servletContext.getAttribute("responseStreams");
+            Map<String, AsyncContext> responseStreams =
+                    (ConcurrentHashMap<String, AsyncContext>) servletContext.getAttribute("responseStreams");
             responseStreams.put(clientUri, asyncContext);
         } catch (Exception e) {
             log.error(ExceptionUtils.getFullStackTrace(e));
@@ -84,7 +94,7 @@
                 if (jsonStringBuilder.length() > 0) {
                     JSONObject jsonObj = new JSONObject(jsonStringBuilder.toString());
                     clientUri = jsonObj.getString("client-uri");
-                    if (!clientUriList.contains(clientUri)) {
+                    if (!CLIENT_URI_LIST.contains(clientUri)) {
                         init(clientUri, request, response);
                     }
                     jsonStringBuilder.setLength(0);
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnDeviceListener.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/package-info.java
similarity index 78%
copy from apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnDeviceListener.java
copy to apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/package-info.java
index 8d099f0..d7a9648 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/providers/DpnDeviceListener.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/eventstream/package-info.java
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.fpcagent.providers;
-
-public interface DpnDeviceListener {
-    void deviceAdded(String id, byte topic);
-
-    void deviceRemoved(String id);
-}
+/**
+ * SSE implementation.
+ */
+package org.onosproject.fpcagent.util.eventstream;
\ No newline at end of file
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/package-info.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/package-info.java
index b4b4877..7389ff3 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/package-info.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/package-info.java
@@ -14,4 +14,7 @@
  * limitations under the License.
  */
 
+/**
+ * Utility classes.
+ */
 package org.onosproject.fpcagent.util;
\ No newline at end of file
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZMQSBPublisherManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZMQSBPublisherManager.java
deleted file mode 100644
index 541d7f5..0000000
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZMQSBPublisherManager.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.onosproject.fpcagent.workers;
-
-import org.apache.commons.lang.exception.ExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.zeromq.ZContext;
-import org.zeromq.ZMQ;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.*;
-
-public class ZMQSBPublisherManager implements AutoCloseable {
-    private static final Logger log = LoggerFactory.getLogger(ZMQSBPublisherManager.class);
-    private static ZMQSBPublisherManager _instance = null;
-    private final ZContext ctx;
-    private final String address;
-    private final BlockingQueue<ByteBuffer> blockingQueue;
-    private final int poolSize;
-    private boolean run;
-
-    protected ZMQSBPublisherManager(String address, int poolSize) {
-        this.ctx = new ZContext();
-        this.address = address;
-        this.run = true;
-        this.blockingQueue = new LinkedBlockingQueue<>();
-        this.poolSize = poolSize;
-    }
-
-    public static ZMQSBPublisherManager createInstance(String address, int poolSize) {
-        if (_instance == null) {
-            _instance = new ZMQSBPublisherManager(address, poolSize);
-        }
-        return _instance;
-    }
-
-    public static ZMQSBPublisherManager getInstance() {
-        return _instance;
-    }
-
-    public void send(ByteBuffer buf) {
-        try {
-            blockingQueue.put(buf);
-        } catch (InterruptedException e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-        }
-    }
-
-    public void open() {
-        ExecutorService executorService = Executors.newFixedThreadPool(this.poolSize);
-        executorService.submit(() -> {
-            ZMQ.Socket socket = ctx.createSocket(ZMQ.PUB);
-            socket.connect(address);
-            log.debug("Publisher at {}", address);
-            while ((!Thread.currentThread().isInterrupted()) && run) {
-                try {
-                    byte[] array = blockingQueue.take().array();
-                    socket.send(array);
-                } catch (InterruptedException e) {
-                    log.error(ExceptionUtils.getFullStackTrace(e));
-                }
-            }
-        });
-    }
-
-    @Override
-    public void close() {
-        run = false;
-    }
-}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZmqSbPublisherManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZmqSbPublisherManager.java
new file mode 100644
index 0000000..a50d665
--- /dev/null
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZmqSbPublisherManager.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.fpcagent.workers;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.zeromq.ZContext;
+import org.zeromq.ZMQ;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class ZmqSbPublisherManager implements AutoCloseable {
+    private static final Logger log = LoggerFactory.getLogger(ZmqSbPublisherManager.class);
+    private static ZmqSbPublisherManager _instance = null;
+    private final ZContext ctx;
+    private final String address;
+    private final BlockingQueue<ByteBuffer> blockingQueue;
+    private final int poolSize;
+    private boolean run;
+
+    protected ZmqSbPublisherManager(String address, int poolSize) {
+        this.ctx = new ZContext();
+        this.address = address;
+        this.run = true;
+        this.blockingQueue = new LinkedBlockingQueue<>();
+        this.poolSize = poolSize;
+    }
+
+    public static ZmqSbPublisherManager createInstance(String address, int poolSize) {
+        if (_instance == null) {
+            _instance = new ZmqSbPublisherManager(address, poolSize);
+        }
+        return _instance;
+    }
+
+    public static ZmqSbPublisherManager getInstance() {
+        return _instance;
+    }
+
+    public void send(ByteBuffer buf) {
+        try {
+            blockingQueue.put(buf);
+        } catch (InterruptedException e) {
+            log.error(ExceptionUtils.getFullStackTrace(e));
+        }
+    }
+
+    public void open() {
+        Executors.newFixedThreadPool(this.poolSize).submit(() -> {
+            ZMQ.Socket socket = ctx.createSocket(ZMQ.PUB);
+            socket.connect(address);
+            log.debug("Publisher at {}", address);
+            while ((!Thread.currentThread().isInterrupted()) && run) {
+                try {
+                    byte[] array = blockingQueue.take().array();
+                    socket.send(array);
+                } catch (InterruptedException e) {
+                    log.error(ExceptionUtils.getFullStackTrace(e));
+                }
+            }
+        });
+    }
+
+    @Override
+    public void close() {
+        run = false;
+    }
+}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZMQSBSubscriberManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZmqSbSubscriberManager.java
similarity index 67%
rename from apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZMQSBSubscriberManager.java
rename to apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZmqSbSubscriberManager.java
index 265046c..71ab3ed 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZMQSBSubscriberManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/ZmqSbSubscriberManager.java
@@ -1,19 +1,37 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.onosproject.fpcagent.workers;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.core.IdGenerator;
-import org.onosproject.fpcagent.providers.DpnDeviceListener;
+import org.onosproject.fpcagent.providers.ZmqDpnDeviceListener;
 import org.onosproject.fpcagent.util.CacheManager;
 import org.onosproject.fpcagent.util.FpcUtil;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.*;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.configresultnotification.value.DefaultConfigResult;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.opstatusvalue.OpStatusEnum;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.result.ResultEnum;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.resultbody.resulttype.DefaultEmptyCase;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.yangautoprefixnotify.value.DefaultDownlinkDataNotification;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.yangautoprefixnotify.value.DownlinkDataNotification;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.ClientIdentifier;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.DefaultYangAutoPrefixNotify;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.NotificationId;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.OpIdentifier;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.yangautoprefixnotify
+        .value.DefaultDownlinkDataNotification;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.yangautoprefixnotify
+        .value.DownlinkDataNotification;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcIdentity;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.fpcidentity.FpcIdentityUnion;
+import org.onosproject.yang.model.ModelObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.zeromq.ZContext;
@@ -30,13 +48,14 @@
 
 import static org.onosproject.fpcagent.protocols.DpnNgicCommunicator.*;
 import static org.onosproject.fpcagent.util.Converter.*;
+import static org.onosproject.fpcagent.util.FpcUtil.createConfigResultNotification;
 import static org.onosproject.fpcagent.util.FpcUtil.sendNotification;
 
-public class ZMQSBSubscriberManager implements AutoCloseable {
-    private static final Logger log = LoggerFactory.getLogger(ZMQSBSubscriberManager.class);
-    private static int MIN_TOPIC_VAL = 4;
-    private static int MAX_TOPIC_VAL = 255;
-    private static ZMQSBSubscriberManager _instance = null;
+public class ZmqSbSubscriberManager implements AutoCloseable {
+    private static final Logger log = LoggerFactory.getLogger(ZmqSbSubscriberManager.class);
+    private static final int MIN_TOPIC_VAL = 4;
+    private static final int MAX_TOPIC_VAL = 255;
+    private static ZmqSbSubscriberManager _instance = null;
     private final String address;
     private final String nodeId;
     private final String networkId;
@@ -51,27 +70,30 @@
     private Future<?> broadcastTopicWorker;
     private Future<?> generalWorker;
 
-    private DpnDeviceListener dpnDeviceListener;
+    private ZmqDpnDeviceListener zmqDpnDeviceListener;
 
-    protected ZMQSBSubscriberManager(String address, String nodeId, String networkId, DpnDeviceListener dpnDeviceListener, IdGenerator notificationIds) {
+    protected ZmqSbSubscriberManager(String address, String nodeId, String networkId,
+                                     ZmqDpnDeviceListener zmqDpnDeviceListener, IdGenerator notificationIds) {
         this.address = address;
         this.run = true;
         this.nodeId = nodeId;
         this.networkId = networkId;
         this.conflictingTopic = false;
         this.controllerSourceId = (long) ThreadLocalRandom.current().nextInt(0, 65535);
-        this.dpnDeviceListener = dpnDeviceListener;
+        this.zmqDpnDeviceListener = zmqDpnDeviceListener;
         this.notificationIds = notificationIds;
     }
 
-    public static ZMQSBSubscriberManager createInstance(String address, String nodeId, String networkId, DpnDeviceListener providerService, IdGenerator notificationIds) {
+    public static ZmqSbSubscriberManager createInstance(String address, String nodeId, String networkId,
+                                                        ZmqDpnDeviceListener providerService,
+                                                        IdGenerator notificationIds) {
         if (_instance == null) {
-            _instance = new ZMQSBSubscriberManager(address, nodeId, networkId, providerService, notificationIds);
+            _instance = new ZmqSbSubscriberManager(address, nodeId, networkId, providerService, notificationIds);
         }
         return _instance;
     }
 
-    public static ZMQSBSubscriberManager getInstance() {
+    public static ZmqSbSubscriberManager getInstance() {
         return _instance;
     }
 
@@ -85,10 +107,10 @@
 
     public void open() {
         broadcastAllWorker = Executors.newSingleThreadExecutor()
-                .submit(new ZMQSubscriberWorker(ReservedTopics.BROADCAST_ALL.getType()));
+                .submit(new ZmqSubscriberWorker(ReservedTopics.BROADCAST_ALL.getType()));
 
         broadcastControllersWorker = Executors.newSingleThreadExecutor()
-                .submit(new ZMQSubscriberWorker(ReservedTopics.BROADCAST_CONTROLLERS.getType()));
+                .submit(new ZmqSubscriberWorker(ReservedTopics.BROADCAST_CONTROLLERS.getType()));
 
         broadcastTopicWorker = Executors.newSingleThreadExecutor()
                 .submit(new AssignTopic());
@@ -96,17 +118,17 @@
 
     @Override
     public void close() {
-        send_goodbye_dpns(nodeId, networkId);
+        sendGoodbyeDpns(nodeId, networkId);
         run = false;
     }
 
     /**
-     * Interrupts the BroadcastTopicworker if there is an Assign topic Conflict
+     * Interrupts the BroadcastTopicworker if there is an Assign topic Conflict.
      *
      * @param conflict - Flag to indicate conflict
      * @param subId    - Topic Id that caused the conflict
      */
-    protected void BroadcastAllSubIdCallBack(boolean conflict, byte subId) {
+    protected void broadcastAllSubIdCallBack(boolean conflict, byte subId) {
         if (conflict && controllerTopic == subId) {
             this.conflictingTopic = true;
             broadcastTopicWorker.cancel(true);
@@ -114,33 +136,35 @@
     }
 
     /**
-     * Broadcasts an Assign Conflict message
+     * Broadcasts an Assign Conflict message.
      *
      * @param contents - byte array received over the southbound.
      */
-    protected void SendAssignConflictMessage(byte[] contents) {
+    protected void sendAssignConflictMessage(byte[] contents) {
         byte topic = contents[2];
         short nodeIdLen = contents[7];
         short networkIdLen = contents[8 + nodeIdLen];
-        String node_id = new String(Arrays.copyOfRange(contents, 8, 8 + nodeIdLen));
-        String network_id = new String(Arrays.copyOfRange(contents, 9 + nodeIdLen, 9 + nodeIdLen + networkIdLen));
+        String nodeId = new String(Arrays.copyOfRange(contents, 8, 8 + nodeIdLen));
+        String networkId = new String(
+                Arrays.copyOfRange(contents, 9 + nodeIdLen, 9 + nodeIdLen + networkIdLen)
+        );
 
-        if (controllerTopic == topic || (nodeId.equals(node_id) && networkId.equals(network_id))) {
-            send_assign_conflict(nodeId, networkId);
+        if (controllerTopic == topic || (this.nodeId.equals(nodeId) && this.networkId.equals(networkId))) {
+            sendAssignConflict(this.nodeId, this.networkId);
         }
     }
 
-    protected class ZMQSubscriberWorker implements Runnable {
+    protected class ZmqSubscriberWorker implements Runnable {
         private final byte subscribedTopic;
         private ZContext ctx;
 
-        ZMQSubscriberWorker(byte subscribedTopic) {
+        ZmqSubscriberWorker(byte subscribedTopic) {
             this.subscribedTopic = subscribedTopic;
             this.ctx = new ZContext();
         }
 
         /**
-         * Ensures the session id is an unsigned 64 bit integer
+         * Ensures the session id is an unsigned 64 bit integer.
          *
          * @param sessionId - session id received from the DPN
          * @return unsigned session id
@@ -153,13 +177,13 @@
         }
 
         /**
-         * Decodes a DownlinkDataNotification
+         * Decodes a DownlinkDataNotification.
          *
          * @param buf - message buffer
          * @param key - Concatenation of node id + / + network id
          * @return DownlinkDataNotification or null if it could not be successfully decoded
          */
-        private DownlinkDataNotification processDDN(byte[] buf, String key) {
+        private DownlinkDataNotification processDdn(byte[] buf, String key) {
             DownlinkDataNotification ddn = new DefaultDownlinkDataNotification();
             ddn.sessionId(checkSessionId(toBigInt(buf, 2)));
             ddn.notificationMessageType("Downlink-Data-Notification");
@@ -181,18 +205,21 @@
         public Map.Entry<Object, Object> decode(byte[] buf) {
 //            uint8_t topic_id;
 //            uint8_t type;
-            s11MsgType type;
-            type = s11MsgType.getEnum(buf[1]);
-            if (type.equals(s11MsgType.DDN)) {
+            S11MsgType type;
+            type = S11MsgType.getEnum(buf[1]);
+            if (type.equals(S11MsgType.DDN)) {
 //                uint64_t session_id;
 //                uint32_t client_id;
 //                uint32_t op_id;
 //                uint8_t  node_network_id_buffer[NN_ID_BUF_LEN];
                 short nodeIdLen = buf[18];
                 short networkIdLen = buf[19 + nodeIdLen];
-                String key = new String(Arrays.copyOfRange(buf, 19, 19 + nodeIdLen)) + "/" + new String(Arrays.copyOfRange(buf, 20 + nodeIdLen, 20 + nodeIdLen + networkIdLen));
-                return new AbstractMap.SimpleEntry<>(processDDN(buf, key), null);
-            } else if (type.equals(s11MsgType.DPN_STATUS_INDICATION)) {
+                String key = new String(Arrays.copyOfRange(buf, 19, 19 + nodeIdLen))
+                        + "/" + new String(
+                                Arrays.copyOfRange(buf, 20 + nodeIdLen, 20 + nodeIdLen + networkIdLen)
+                );
+                return new AbstractMap.SimpleEntry<>(processDdn(buf, key), null);
+            } else if (type.equals(S11MsgType.DPN_STATUS_INDICATION)) {
 //                uint8_t  source_topic_id;
 //                uint8_t  status;
 //                uint32_t source;
@@ -200,36 +227,30 @@
                 DpnStatusIndication status;
                 short nodeIdLen = buf[8];
                 short networkIdLen = buf[9 + nodeIdLen];
-                String deviceId = new String(Arrays.copyOfRange(buf, 9, 9 + nodeIdLen)) + "/" + new String(Arrays.copyOfRange(buf, 10 + nodeIdLen, 10 + nodeIdLen + networkIdLen));
+                String deviceId = new String(Arrays.copyOfRange(buf, 9, 9 + nodeIdLen)) + "/"
+                        + new String(Arrays.copyOfRange(buf, 10 + nodeIdLen, 10 + nodeIdLen + networkIdLen));
                 status = DpnStatusIndication.getEnum(buf[3]);
-                log.info("topic {}, status {}, source {}, node/net {}", (short) buf[2], status, fromIntToLong(buf, 4), deviceId);
+                log.info("topic {}, status {}, source {}, node/net {}", (short) buf[2], status,
+                        fromIntToLong(buf, 4), deviceId);
                 if (status.equals(DpnStatusIndication.HELLO)) {
                     log.info("Hello {} on topic {}", deviceId, buf[2]);
-                    dpnDeviceListener.deviceAdded(deviceId, buf[2]);
+                    zmqDpnDeviceListener.deviceAdded(deviceId, buf[2]);
                 } else if (status.equals(DpnStatusIndication.GOODBYE)) {
                     log.info("Bye {}", deviceId);
-                    dpnDeviceListener.deviceRemoved(deviceId);
+                    zmqDpnDeviceListener.deviceRemoved(deviceId);
                 }
                 return new AbstractMap.SimpleEntry<>(status, deviceId);
-            } else if (type.equals(s11MsgType.DPN_RESPONSE)) {
+            } else if (type.equals(S11MsgType.DPN_RESPONSE)) {
 //                uint8_t  cause;
 //                uint32_t client_id;
 //                uint32_t op_id;
-                ClientIdentifier clientId = ClientIdentifier.of(FpcIdentity.of(FpcIdentityUnion.of(fromIntToLong(buf, 3))));
+                ClientIdentifier clientId = ClientIdentifier.of(
+                        FpcIdentity.of(FpcIdentityUnion.of(fromIntToLong(buf, 3)))
+                );
                 OpIdentifier opId = OpIdentifier.of(BigInteger.valueOf(fromIntToLong(buf, 7)));
-                log.info("cause {}, clientId {}, opId {}", (short) buf[2], clientId.toString(), opId.toString());
-                DefaultConfigResultNotification notify = new DefaultConfigResultNotification();
-                notify.notificationId(NotificationId.of(notificationIds.getNewId()));
-                notify.timestamp(BigInteger.valueOf(System.currentTimeMillis()));
-                DefaultConfigResult result = new DefaultConfigResult();
-                result.causeValue(buf[2]);
-                result.opId(opId);
-                result.opStatus(OpStatusEnum.OK);
-                result.result(Result.of(ResultEnum.OK));
-                result.resultType(new DefaultEmptyCase());
-                notify.value(result);
-
-                sendNotification(clientId.toString(), notify);
+                log.info("clientId {}, opId {}, cause {}", clientId.toString(), opId.toString(), (short) buf[2]);
+                ModelObject notification = createConfigResultNotification(opId, buf[2]);
+                sendNotification(clientId.toString(), notification);
             }
             return null;
         }
@@ -243,16 +264,16 @@
             while ((!Thread.currentThread().isInterrupted()) && run) {
                 byte[] contents = subscriber.recv();
                 byte topic = contents[0];
-                s11MsgType messageType = s11MsgType.getEnum(contents[1]);
+                S11MsgType messageType = S11MsgType.getEnum(contents[1]);
                 log.info("Received {}", messageType);
                 switch (topic) {
                     case 1:
-                        if (messageType.equals(s11MsgType.ASSIGN_CONFLICT) &&
+                        if (messageType.equals(S11MsgType.ASSIGN_CONFLICT) &&
                                 toInt(contents, 3) != controllerSourceId) {
-                            BroadcastAllSubIdCallBack(true, contents[2]);
-                        } else if (messageType.equals(s11MsgType.ASSIGN_TOPIC) &&
+                            broadcastAllSubIdCallBack(true, contents[2]);
+                        } else if (messageType.equals(S11MsgType.ASSIGN_TOPIC) &&
                                 toInt(contents, 3) != controllerSourceId) {
-                            SendAssignConflictMessage(contents);
+                            sendAssignConflictMessage(contents);
                         }
                         break;
                     default:
@@ -270,7 +291,7 @@
                                 if (key.equals(DpnStatusIndication.HELLO)) {
                                     byte dpnTopic = FpcUtil.getTopicFromNode(msg.getValue().toString());
                                     if (dpnTopic != -1) {
-                                        send_status_ack(nodeId, networkId, dpnTopic);
+                                        sendStatusAck(nodeId, networkId, dpnTopic);
                                     }
                                 }
                             }
@@ -289,7 +310,7 @@
     }
 
     /**
-     * Class to broadcast a topic for the controller
+     * Class to broadcast a topic for the controller.
      */
     protected class AssignTopic implements Runnable {
         private byte topic;
@@ -301,7 +322,7 @@
         @Override
         public void run() {
             try {
-                send_assign_topic(nodeId, networkId, this.topic);
+                sendAssignTopic(nodeId, networkId, this.topic);
                 log.debug("Thread sleeping: " + Thread.currentThread().getName());
                 Thread.sleep(2000); // wait 10 sec before assigning topic
             } catch (InterruptedException e) {
@@ -316,7 +337,7 @@
                 }
             }
             controllerTopic = this.topic;
-            generalWorker = Executors.newSingleThreadExecutor().submit(new ZMQSubscriberWorker(this.topic));
+            generalWorker = Executors.newSingleThreadExecutor().submit(new ZmqSubscriberWorker(this.topic));
 
             try {
                 Thread.sleep(2000);
@@ -324,7 +345,7 @@
                 log.error(ExceptionUtils.getFullStackTrace(e));
             }
 
-            send_hello_dpns(nodeId, networkId);
+            sendHelloDpns(nodeId, networkId);
         }
 
     }
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/package-info.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/package-info.java
index f6a5857..e310b23 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/package-info.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/package-info.java
@@ -14,4 +14,7 @@
  * limitations under the License.
  */
 
+/**
+ * ZMQ Publisher and Subscriber workers.
+ */
 package org.onosproject.fpcagent.workers;
\ No newline at end of file