added cache
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 b9cbb9f..a47d4a9 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcConfig.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcConfig.java
@@ -3,7 +3,7 @@
 import com.fasterxml.jackson.core.JsonProcessingException;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.core.ApplicationId;
-import org.onosproject.fpcagent.helpers.ConfigHelper;
+import org.onosproject.fpcagent.util.ConfigHelper;
 import org.onosproject.net.config.Config;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
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 52fbf9d..7c15f01 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java
@@ -22,7 +22,7 @@
 import org.onosproject.config.DynamicConfigService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.fpcagent.helpers.ConfigHelper;
+import org.onosproject.fpcagent.util.ConfigHelper;
 import org.onosproject.fpcagent.workers.ZMQSBPublisherManager;
 import org.onosproject.fpcagent.workers.ZMQSBSubscriberManager;
 import org.onosproject.net.config.*;
@@ -50,7 +50,7 @@
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
-import static org.onosproject.fpcagent.FpcUtil.*;
+import static org.onosproject.fpcagent.util.FpcUtil.*;
 
 /**
  * Fpc Manager.
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 5e4e152..61aa6cf 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcService.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcService.java
@@ -1,6 +1,6 @@
 package org.onosproject.fpcagent;
 
-import org.onosproject.fpcagent.helpers.ConfigHelper;
+import org.onosproject.fpcagent.util.ConfigHelper;
 
 import java.util.Optional;
 
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcUtil.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcUtil.java
deleted file mode 100644
index 74373eb..0000000
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcUtil.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * 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.collect.Maps;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.ClientIdentifier;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.DefaultTenants;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.OpIdentifier;
-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.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.FpcDpnId;
-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.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.math.BigInteger;
-import java.util.AbstractMap;
-import java.util.Arrays;
-import java.util.Map;
-
-import static org.onosproject.fpcagent.helpers.Converter.*;
-
-/**
- * Helper class which stores all the static variables.
- */
-public class FpcUtil {
-    public static final int MAX_EVENTS = 1000;
-    public static final int MAX_BATCH_MS = 5000;
-    public static final int MAX_IDLE_MS = 1000;
-    public static final String TIMER = "dynamic-config-fpcagent-timer";
-    public static final String UNKNOWN_EVENT = "FPC Agent listener: unknown event: {}";
-    public static final String EVENT_NULL = "Event cannot be null";
-    public static final String FPC_APP_ID = "org.onosproject.fpcagent";
-    protected static final Logger log = LoggerFactory.getLogger(FpcUtil.class);
-    private static final Map<String, FpcDpnId> uplinkDpnMap = Maps.newConcurrentMap();
-    private static final Map<String, Short> nodeToTopicMap = Maps.newConcurrentMap();
-    public static ModelConverter modelConverter = null;
-    // Resource ID for Configure DPN RPC command
-    public static ResourceId configureDpn;
-    // Resource ID for Configure RPC command
-    public static ResourceId configure;
-    // Resource ID for tenants data
-    public static ResourceId tenants;
-    public static ResourceId defaultTenant;
-    public static ResourceId configureBundles;
-    public static ResourceId module;
-    public static ResourceId registerClientResourceId;
-    public static ResourceId deregisterClientResourceId;
-
-    public static FpcIdentity defaultIdentity = getFpcIdentity.apply("default");
-
-    private static byte DPN_HELLO = 0b0000_0001;
-    private static byte DPN_BYE = 0b0000_0010;
-    private static byte DOWNLINK_DATA_NOTIFICATION = 0b0000_0101;
-    private static byte DPN_STATUS_INDICATION = 0b0000_1100;
-    private static byte DPN_OVERLOAD_INDICATION = 0b0000_0101;
-    private static byte DPN_REPLY = 0b0000_0100;
-    private static String DOWNLINK_DATA_NOTIFICATION_STRING = "Downlink-Data-Notification";
-
-    /**
-     * Returns resource id from model converter.
-     *
-     * @param modelId model object id
-     * @return resource id
-     */
-    static ResourceId getResourceVal(ModelObjectId modelId) {
-        DefaultModelObjectData.Builder data = DefaultModelObjectData.builder()
-                .identifier(modelId);
-        ResourceData resData = modelConverter.createDataNode(data.build());
-        return resData.resourceId();
-    }
-
-    /**
-     * Returns the resource id, after constructing model object id and
-     * converting it.
-     */
-    static void getResourceId() {
-        ModelObjectId moduleId = ModelObjectId.builder().build();
-        module = getResourceVal(moduleId);
-
-        ModelObjectId tenantsId = ModelObjectId.builder()
-                .addChild(DefaultTenants.class)
-                .build();
-
-        tenants = getResourceVal(tenantsId);
-
-        TenantKeys tenantKeys = new TenantKeys();
-        tenantKeys.tenantId(defaultIdentity);
-
-        ModelObjectId defaultTenantId = ModelObjectId.builder()
-                .addChild(DefaultTenants.class)
-                .addChild(DefaultTenant.class, tenantKeys)
-                .build();
-
-        defaultTenant = getResourceVal(defaultTenantId);
-
-        configure = ResourceId.builder()
-                .addBranchPointSchema("/", null)
-                .addBranchPointSchema("configure", "urn:ietf:params:xml:ns:yang:fpcagent")
-                .build();
-
-        configureDpn = ResourceId.builder()
-                .addBranchPointSchema("/", null)
-                .addBranchPointSchema("configure-dpn", "urn:ietf:params:xml:ns:yang:fpcagent")
-                .build();
-
-        configureBundles = ResourceId.builder()
-                .addBranchPointSchema("/", null)
-                .addBranchPointSchema("configure-bundles", "urn:ietf:params:xml:ns:yang:fpcagent")
-                .build();
-    }
-
-    static ModelObjectId.Builder defaultTenantBuilder() {
-        TenantKeys tenantKeys = new TenantKeys();
-        tenantKeys.tenantId(defaultIdentity);
-
-        return ModelObjectId.builder()
-                .addChild(DefaultTenants.class)
-                .addChild(DefaultTenant.class, tenantKeys);
-    }
-
-    /**
-     * Returns resource id for the specific tenant ID.
-     *
-     * @param tenantId tenant id
-     * @return resource ids
-     */
-    static ResourceId getTenantResourceId(FpcIdentity tenantId) {
-        TenantKeys tenantKeys = new TenantKeys();
-        tenantKeys.tenantId(tenantId);
-
-        return getResourceVal(ModelObjectId.builder()
-                .addChild(DefaultTenants.class)
-                .addChild(DefaultTenant.class, tenantKeys)
-                .build());
-    }
-
-    /**
-     * Returns the resource data from the data node and the resource id.
-     *
-     * @param dataNode data node
-     * @param resId    resource id
-     * @return resource data
-     */
-    static ResourceData getResourceData(DataNode dataNode, ResourceId resId) {
-        if (resId != null) {
-            return DefaultResourceData.builder()
-                    .addDataNode(dataNode)
-                    .resourceId(resId)
-                    .build();
-        } else {
-            return DefaultResourceData.builder()
-                    .addDataNode(dataNode)
-                    .build();
-        }
-    }
-
-    /**
-     * Ensures the session id is an unsigned 64 bit integer
-     *
-     * @param sessionId - session id received from the DPN
-     * @return unsigned session id
-     */
-    private static BigInteger checkSessionId(BigInteger sessionId) {
-        if (sessionId.compareTo(BigInteger.ZERO) < 0) {
-            sessionId = sessionId.add(BigInteger.ONE.shiftLeft(64));
-        }
-        return sessionId;
-    }
-
-    /**
-     * 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 static DownlinkDataNotification processDDN(byte[] buf, String key) {
-        DownlinkDataNotification ddnB = new DefaultDownlinkDataNotification();
-        ddnB.sessionId(checkSessionId(toBigInt(buf, 2)));
-        ddnB.notificationMessageType(DOWNLINK_DATA_NOTIFICATION_STRING);
-        ddnB.clientId(ClientIdentifier.of(FpcIdentity.of(FpcIdentityUnion.of(fromIntToLong(buf, 10)))));
-        ddnB.opId(OpIdentifier.of(BigInteger.valueOf(fromIntToLong(buf, 14))));
-        ddnB.notificationDpnId(uplinkDpnMap.get(key));
-        return ddnB;
-    }
-
-    /**
-     * Decodes a DPN message.
-     *
-     * @param buf - message buffer
-     * @return - A pair with the DPN Id and decoded Object
-     */
-    public static Map.Entry<FpcDpnId, Object> decode(byte[] buf) {
-        if (buf[1] == DPN_REPLY) {
-            return null;
-        } else if (buf[1] == DOWNLINK_DATA_NOTIFICATION) {
-            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 uplinkDpnMap.get(key) == null ? null : new AbstractMap.SimpleEntry<>(uplinkDpnMap.get(key), processDDN(buf, key));
-        } else if (buf[1] == DPN_STATUS_INDICATION) {
-            DPNStatusIndication.Status status = null;
-
-            short nodeIdLen = buf[8];
-            short networkIdLen = buf[9 + nodeIdLen];
-            String key = new String(Arrays.copyOfRange(buf, 9, 9 + nodeIdLen)) + "/" + new String(Arrays.copyOfRange(buf, 10 + nodeIdLen, 10 + nodeIdLen + networkIdLen));
-            if (buf[3] == DPN_OVERLOAD_INDICATION) {
-                status = DPNStatusIndication.Status.OVERLOAD_INDICATION;
-            } else if (buf[3] == DPN_HELLO) {
-                status = DPNStatusIndication.Status.HELLO;
-                log.info("Hello {} on topic {}", key, buf[2]);
-                nodeToTopicMap.put(key, (short) buf[2]);
-            } else if (buf[3] == DPN_BYE) {
-                status = DPNStatusIndication.Status.BYE;
-                log.info("Bye {}", key);
-                nodeToTopicMap.remove(key);
-            }
-            return new AbstractMap.SimpleEntry<>(uplinkDpnMap.get(key), new DPNStatusIndication(status, key));
-        }
-        return null;
-    }
-
-    /**
-     * Gets the mapping for node id / network id to ZMQ Topic
-     *
-     * @param Key - Concatenation of node id + / + network id
-     * @return - ZMQ Topic
-     */
-    public static Short getTopicFromNode(String Key) {
-        return nodeToTopicMap.get(Key);
-    }
-
-    /**
-     * Provides basic status changes,
-     */
-    public static class DPNStatusIndication {
-        private final Status status;
-        private final String key; //nodeId +"/"+ networkId
-        /**
-         * Node Reference of the DPN
-         */
-        public Short nodeRef;
-
-        /**
-         * Constructor providing the DPN and its associated Status.
-         *
-         * @param status - DPN Status
-         * @param key    - Combination of node id and network id
-         */
-        public DPNStatusIndication(Status status,
-                                   String key) {
-            this.status = status;
-            this.key = key;
-        }
-
-        /**
-         * Provides DPN Status
-         *
-         * @return Status associated to the DPN.
-         */
-        public Status getStatus() {
-            return status;
-        }
-
-        /**
-         * Provides the DPN key - nodeId +"/"+ networkId
-         *
-         * @return FpcDpnId
-         */
-        public String getKey() {
-            return this.key;
-        }
-
-        /**
-         * Basic DPN Status
-         */
-        public enum Status {
-            HELLO,
-            BYE,
-            OVERLOAD_INDICATION
-        }
-    }
-}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/TenantManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/TenantManager.java
index 46d4016..9fb67ff 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/TenantManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/TenantManager.java
@@ -16,7 +16,6 @@
 
 package org.onosproject.fpcagent;
 
-import com.google.common.base.Stopwatch;
 import com.google.common.collect.Maps;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
@@ -29,8 +28,10 @@
 import org.onosproject.config.DynamicConfigListener;
 import org.onosproject.config.DynamicConfigService;
 import org.onosproject.config.Filter;
-import org.onosproject.fpcagent.helpers.DpnCommunicationService;
-import org.onosproject.fpcagent.helpers.DpnNgicCommunicator;
+import org.onosproject.fpcagent.util.CacheManager;
+import org.onosproject.fpcagent.util.DpnCommunicationService;
+import org.onosproject.fpcagent.util.DpnNgicCommunicator;
+import org.onosproject.fpcagent.util.FpcUtil;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.*;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.configure.DefaultConfigureOutput;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.instructions.instructions.instrtype.Instr3GppMob;
@@ -47,6 +48,7 @@
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.DefaultFpcTopology;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpcmobility.ContextsKeys;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpcmobility.DefaultContexts;
+import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcContextId;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcIdentity;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.fpccontext.Dpns;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.mobilityinfo.mobprofileparameters.ThreegppTunnel;
@@ -63,12 +65,13 @@
 import java.util.concurrent.Executors;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.fpcagent.FpcUtil.*;
-import static org.onosproject.fpcagent.helpers.Converter.convertContext;
+import static org.onosproject.fpcagent.util.Converter.convertContext;
+import static org.onosproject.fpcagent.util.FpcUtil.*;
 
 @Component(immediate = true)
 @Service
 public class TenantManager implements TenantService {
+
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private final Map<ClientIdentifier, DefaultTenant> clientIdMap = Maps.newHashMap();
@@ -85,8 +88,11 @@
 
     private DpnCommunicationService dpnCommunicationService;
 
+    private CacheManager cacheManager = CacheManager.getInstance();
+
     @Activate
     protected void activate() {
+        cacheManager.addManager(this);
         FpcUtil.modelConverter = modelConverter;
         getResourceId();
 
@@ -121,18 +127,6 @@
     }
 
     @Override
-    public Optional<DefaultTenant> getDefaultTenant() {
-        Filter filter = Filter.builder().build();
-        // TODO implement Cache to avoid searching store
-        DataNode dataNode = dynamicConfigService.readNode(defaultTenant, filter);
-
-        return getModelObjects(dataNode, tenants)
-                .stream()
-                .map(modelObject -> (DefaultTenant) modelObject)
-                .findFirst();
-    }
-
-    @Override
     public Optional<DefaultTenants> getTenants() {
         Filter filter = Filter.builder().build();
         DataNode dataNode = dynamicConfigService.readNode(tenants, filter);
@@ -150,16 +144,8 @@
 
         return getModelObjects(dataNode, tenants)
                 .stream()
-                .map(modelObject -> (DefaultTenants) modelObject)
-                .findFirst()
-                .flatMap(defaultTenants ->
-                        defaultTenants.tenant()
-                                .stream()
-                                .filter(defaultTenant ->
-                                        defaultTenant.tenantId().equals(tenantId))
-                                .findFirst()
-                                .map(defaultTenant -> (DefaultTenant) defaultTenant)
-                );
+                .map(modelObject -> (DefaultTenant) modelObject)
+                .findFirst();
     }
 
     @Override
@@ -225,113 +211,109 @@
                 defaultCommonSuccess.addToContexts(context);
 
                 // check if mobility exists and if the context id exists.
-                if (getDefaultTenant().map(
-                        tenant -> tenant.fpcMobility().contexts() != null && tenant.fpcMobility()
-                                .contexts()
-                                .stream()
-                                .anyMatch(contexts -> contexts.contextId().equals(context.contextId()))
-                ).orElse(false)) {
+                if (cacheManager.contextsCache.get(context.contextId()).isPresent()) {
                     // throw exception if trying to create a Context that already exists.
                     throw new IllegalStateException("Context tried to create already exists. Please issue update operation..");
                 }
 
                 for (Dpns dpn : context.dpns()) {
                     // check if dpns exists and if there is a DPN registered for the wanted identifier.
-                    if (getDefaultTenant().map(
-                            tenant -> tenant.fpcTopology().dpns() == null ||
-                                    tenant.fpcTopology().dpns().stream()
-                                            .noneMatch(dpns -> dpns.dpnId().equals(dpn.dpnId()))
-                    ).orElse(false)) {
+                    if (!cacheManager.dpnsCache.get(dpn.dpnId()).isPresent()) {
                         // throw exception if DPN ID is not registered.
                         throw new IllegalStateException("DPN ID is not registered to the topology.");
                     }
 
                     // handle only 3GPP instructions.
-                    if (context.instructions().instrType() instanceof Instr3GppMob) {
-                        // from DPN ID find the Network and Node Identifiers
-                        Optional<String> key = getDefaultTenant().flatMap(tenant ->
-                                tenant.fpcTopology()
-                                        .dpns()
-                                        .stream()
-                                        .filter(dpns -> dpns.dpnId().equals(dpn.dpnId()))
-                                        .findFirst()
-                                        .map(node -> node.nodeId() + "/" + node.networkId())
-                        );
+                    if (!(context.instructions().instrType() instanceof Instr3GppMob)) {
+                        throw new IllegalArgumentException("No 3GPP instructions where given.");
+                    }
 
-                        if (key.isPresent()) {
-                            // get DPN Topic from Node/Network pair
-                            Short topic_id = getTopicFromNode(key.get());
+                    // from DPN ID find the Network and Node Identifiers
+                    Optional<String> key = cacheManager.dpnsCache.get(dpn.dpnId())
+                            .map(node -> node.nodeId() + "/" + node.networkId());
+                    if (!key.isPresent()) {
+                        throw new IllegalArgumentException("DPN does not have node and network ID defined.");
+                    }
 
-                            if (topic_id != null) {
-                                Instr3GppMob instr3GppMob = (Instr3GppMob) context.instructions().instrType();
-                                String commands = Bits.toString(instr3GppMob.instr3GppMob().bits());
+                    // get DPN Topic from Node/Network pair
+                    Short topic_id = getTopicFromNode(key.get());
+                    if (topic_id == null) {
+                        throw new IllegalArgumentException("Could not find Topic ID");
+                    }
 
-                                Ip4Address s1u_enodeb_ipv4 = Ip4Address.valueOf(context.ul().tunnelLocalAddress().toString()),
-                                        s1u_sgw_ipv4 = Ip4Address.valueOf(context.ul().tunnelRemoteAddress().toString());
+                    // parse tunnel identifiers. throw exception if mobility profile parameters are missing.
+                    if (!(context.ul().mobilityTunnelParameters().mobprofileParameters() instanceof ThreegppTunnel)) {
+                        throw new IllegalArgumentException("mobprofileParameters are not instance of ThreegppTunnel");
 
-                                long s1u_sgw_gtpu_teid, s1u_enb_gtpu_teid,
-                                        client_id = clientId.fpcIdentity().union().int64(),
-                                        session_id = context.contextId().fpcIdentity().union().int64();
+                    }
+                    if (!(context.dl().mobilityTunnelParameters().mobprofileParameters() instanceof ThreegppTunnel)) {
+                        throw new IllegalArgumentException("mobprofileParameters are not instance of ThreegppTunnel");
+                    }
 
-                                BigInteger op_id = operationId.uint64(),
-                                        imsi = context.imsi().uint64();
+                    // Extract variables
+                    Instr3GppMob instr3GppMob = (Instr3GppMob) context.instructions().instrType();
+                    String commands = Bits.toString(instr3GppMob.instr3GppMob().bits());
 
-                                short default_ebi = context.ebi().uint8();
+                    Ip4Address s1u_enodeb_ipv4 = Ip4Address.valueOf(context.ul().tunnelLocalAddress().toString()),
+                            s1u_sgw_ipv4 = Ip4Address.valueOf(context.ul().tunnelRemoteAddress().toString());
 
-                                // parse tunnel identifiers. throw exception if mobility profile parameters are missing.
-                                if (context.ul().mobilityTunnelParameters().mobprofileParameters() instanceof ThreegppTunnel) {
-                                    s1u_sgw_gtpu_teid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters().mobprofileParameters()).tunnelIdentifier();
-                                } else {
-                                    throw new IllegalArgumentException("mobprofileParameters are not instance of ThreegppTunnel");
-                                }
-                                if (context.dl().mobilityTunnelParameters().mobprofileParameters() instanceof ThreegppTunnel) {
-                                    s1u_enb_gtpu_teid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters().mobprofileParameters()).tunnelIdentifier();
-                                } else {
-                                    throw new IllegalArgumentException("mobprofileParameters are not instance of ThreegppTunnel");
-                                }
+                    long client_id = clientId.fpcIdentity().union().int64(),
+                            session_id = context.contextId().fpcIdentity().union().int64(),
+                            s1u_sgw_gtpu_teid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters()
+                                    .mobprofileParameters()).tunnelIdentifier(),
+                            s1u_enb_gtpu_teid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters()
+                                    .mobprofileParameters()).tunnelIdentifier();
 
-                                // TODO try to make sense out of this...
-                                if (commands.contains("session")) {
-                                    tasks.add(Executors.callable(() -> {
-                                        dpnCommunicationService.create_session(
-                                                topic_id,
-                                                imsi,
-                                                default_ebi,
-                                                Ip4Prefix.valueOf(context.delegatingIpPrefixes().get(0).toString()).address(),
-                                                s1u_sgw_gtpu_teid,
-                                                s1u_sgw_ipv4,
-                                                session_id,
-                                                client_id,
-                                                op_id
-                                        );
+                    BigInteger op_id = operationId.uint64(),
+                            imsi = context.imsi().uint64();
 
-                                        ModelObjectId modelObjectId = defaultTenantBuilder()
-                                                .addChild(DefaultFpcMobility.class)
-                                                .build();
-                                        createNode(convertContext(context), modelObjectId);
-                                    }));
+                    short default_ebi = context.ebi().uint8();
 
-                                    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
-                                            );
+                    // 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,
+                                    imsi,
+                                    default_ebi,
+                                    Ip4Prefix.valueOf(context.delegatingIpPrefixes().get(0).toString()).address(),
+                                    s1u_sgw_gtpu_teid,
+                                    s1u_sgw_ipv4,
+                                    session_id,
+                                    client_id,
+                                    op_id
+                            );
 
-                                            ModelObjectId modelObjectId = defaultTenantBuilder()
-                                                    .addChild(DefaultFpcMobility.class)
-                                                    .build();
-                                            createNode(convertContext(context), modelObjectId);
-                                        }));
-                                    }
-                                } else if (commands.contains("indirect-forward")) {
-                                    // TODO - Modify API for Indirect Forwarding to/from another SGW
-                                } else if (commands.contains("uplink")) {
+                            ModelObjectId modelObjectId = defaultTenantBuilder()
+                                    .addChild(DefaultFpcMobility.class)
+                                    .build();
+                            createNode(convertContext, modelObjectId);
+                            cacheManager.contextsCache.invalidate(context.contextId());
+                        }));
+
+                        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
+                                );
+
+                                ModelObjectId modelObjectId = defaultTenantBuilder()
+                                        .addChild(DefaultFpcMobility.class)
+                                        .build();
+                                createNode(convertContext, modelObjectId);
+                                cacheManager.contextsCache.invalidate(context.contextId());
+                            }));
+                        }
+                    } else if (commands.contains("indirect-forward")) {
+                        // TODO - Modify API for Indirect Forwarding to/from another SGW
+                    } else if (commands.contains("uplink")) {
 //                                    tasks.add(Executors.callable(() -> {
 //                                        dpnCommunicationService.create_bearer_ul(
 //                                                topic_id,
@@ -346,16 +328,8 @@
 //                                                tenant -> tenant.fpcMobility().addToContexts(convertContext(context))
 //                                        );
 //                                    }));
-                                }
-                            } else {
-                                throw new IllegalArgumentException("Could not find Topic ID.");
-                            }
-                        } else {
-                            throw new IllegalArgumentException("DPN does not have node and network ID defined.");
-                        }
-                    } else {
-                        throw new IllegalArgumentException("No 3GPP instructions where given.");
                     }
+
                 }
             }
 
@@ -400,127 +374,113 @@
                 defaultCommonSuccess.addToContexts(context);
 
                 // check if contexts are populated and if they include the wanted context to update.
-                if (getDefaultTenant().map(
-                        tenant -> tenant.fpcMobility().contexts() == null ||
-                                tenant.fpcMobility()
-                                        .contexts()
-                                        .parallelStream()
-                                        .noneMatch(contexts -> contexts.contextId().equals(context.contextId()))
-                ).orElse(false)) {
+                if (!cacheManager.contextsCache.get(context.contextId()).isPresent()) {
                     // throw exception if wanted context does not exist.
                     throw new IllegalStateException("Context doesn't exist. Please issue create operation..");
                 }
 
                 for (Dpns dpn : context.dpns()) {
                     // check if dpns exists and if there is a DPN registered for the wanted identifier.
-                    if (getDefaultTenant().map(
-                            tenant -> tenant.fpcTopology().dpns() == null ||
-                                    tenant.fpcTopology().dpns()
-                                            .stream()
-                                            .noneMatch(dpns -> dpns.dpnId().equals(dpn.dpnId()))
-                    ).orElse(false)) {
+                    if (!cacheManager.dpnsCache.get(dpn.dpnId()).isPresent()) {
                         // throw exception if DPN ID is not registered.
                         throw new IllegalStateException("DPN ID is not registered to the topology.");
                     }
 
                     // handle only 3GPP instructions.
-                    if (context.instructions().instrType() instanceof Instr3GppMob) {
-                        // from DPN ID find the Network and Node Identifiers
-                        Optional<String> key = getDefaultTenant().flatMap(tenant ->
-                                tenant.fpcTopology()
-                                        .dpns()
-                                        .stream()
-                                        .filter(dpns -> dpns.dpnId().equals(dpn.dpnId()))
-                                        .findFirst().map(node -> node.nodeId() + "/" + node.networkId())
-                        );
+                    if (!(context.instructions().instrType() instanceof Instr3GppMob)) {
+                        throw new IllegalArgumentException("No 3GPP instructions where given.");
+                    }
 
-                        if (key.isPresent()) {
-                            // get DPN Topic from Node/Network pair
-                            Short topic_id = getTopicFromNode(key.get());
+                    // from DPN ID find the Network and Node Identifiers
+                    Optional<String> key = cacheManager.dpnsCache.get(dpn.dpnId())
+                            .map(node -> node.nodeId() + "/" + node.networkId());
+                    if (!key.isPresent()) {
+                        throw new IllegalArgumentException("DPN does not have node and network ID defined.");
+                    }
 
-                            if (topic_id != null) {
-                                Instr3GppMob instr3GppMob = (Instr3GppMob) context.instructions().instrType();
-                                String commands = Bits.toString(instr3GppMob.instr3GppMob().bits());
+                    // get DPN Topic from Node/Network pair
+                    Short topic_id = getTopicFromNode(key.get());
+                    if (topic_id == null) {
+                        throw new IllegalArgumentException("Could not find Topic ID");
+                    }
 
-                                Ip4Address s1u_enodeb_ipv4 = Ip4Address.valueOf(context.ul().tunnelLocalAddress().toString()),
-                                        s1u_sgw_ipv4 = Ip4Address.valueOf(context.ul().tunnelRemoteAddress().toString());
+                    if (!(context.dl().mobilityTunnelParameters().mobprofileParameters() instanceof ThreegppTunnel)) {
+                        throw new IllegalArgumentException("mobprofileParameters are not instance of ThreegppTunnel");
+                    }
 
-                                long s1u_enb_gtpu_teid,
-                                        cId = clientId.fpcIdentity().union().int64(),
-                                        contextId = context.contextId().fpcIdentity().union().int64();
+                    Instr3GppMob instr3GppMob = (Instr3GppMob) context.instructions().instrType();
+                    String commands = Bits.toString(instr3GppMob.instr3GppMob().bits());
 
-                                BigInteger opId = operationId.uint64();
+                    Ip4Address s1u_enodeb_ipv4 = Ip4Address.valueOf(context.ul().tunnelLocalAddress().toString()),
+                            s1u_sgw_ipv4 = Ip4Address.valueOf(context.ul().tunnelRemoteAddress().toString());
 
-                                if (context.dl().mobilityTunnelParameters().mobprofileParameters() instanceof ThreegppTunnel) {
-                                    s1u_enb_gtpu_teid = ((ThreegppTunnel) context.dl().mobilityTunnelParameters().mobprofileParameters()).tunnelIdentifier();
-                                } else {
-                                    throw new IllegalArgumentException("mobprofileParameters are not instance of ThreegppTunnel");
-                                }
+                    long s1u_enb_gtpu_teid = ((ThreegppTunnel) context.dl().mobilityTunnelParameters().mobprofileParameters()).tunnelIdentifier(),
+                            cId = clientId.fpcIdentity().union().int64(),
+                            contextId = context.contextId().fpcIdentity().union().int64();
 
-                                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,
-                                                    contextId,
-                                                    cId,
-                                                    opId
-                                            );
+                    BigInteger opId = operationId.uint64();
 
-                                            ModelObjectId modelObjectId = defaultTenantBuilder()
-                                                    .addChild(DefaultFpcMobility.class)
-                                                    .build();
-                                            updateNode(convertContext(context), modelObjectId);
-                                        }));
-                                    } else {
+                    DefaultContexts convertContext = convertContext(context);
+                    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,
+                                        contextId,
+                                        cId,
+                                        opId
+                                );
+
+                                ModelObjectId modelObjectId = defaultTenantBuilder()
+                                        .addChild(DefaultFpcMobility.class)
+                                        .build();
+                                updateNode(convertContext, modelObjectId);
+                                cacheManager.contextsCache.invalidate(context.contextId());
+                            }));
+                        } else {
 //                                        tasks.add(Executors.callable(() ->
 //                                                dpnCommunicationService.delete_bearer(
 //                                                        topic_id,
 //                                                        s1u_enb_gtpu_teid
 //                                                )
 //                                        ));
-                                    }
-                                }
-                                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,
-                                                    contextId,
-                                                    cId,
-                                                    opId
-                                            );
+                        }
+                    }
+                    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,
+                                        contextId,
+                                        cId,
+                                        opId
+                                );
 
-                                            ModelObjectId modelObjectId = defaultTenantBuilder()
-                                                    .addChild(DefaultFpcMobility.class)
-                                                    .build();
-                                            updateNode(convertContext(context), modelObjectId);
-                                        }));
-                                    } else {
+                                ModelObjectId modelObjectId = defaultTenantBuilder()
+                                        .addChild(DefaultFpcMobility.class)
+                                        .build();
+                                updateNode(convertContext, modelObjectId);
+                                cacheManager.contextsCache.invalidate(context.contextId());
+                            }));
+                        } else {
 //                                        tasks.add(Executors.callable(() ->
 //                                                dpnCommunicationService.delete_bearer(
 //                                                        topic_id,
 //                                                        s1u_sgw_gtpu_teid
 //                                                )
 //                                        ));
-                                    }
-                                }
-                            } else {
-                                throw new IllegalArgumentException("Could not find Topic ID");
-                            }
-                        } else {
-                            throw new IllegalArgumentException("DPN does not have node and network ID defined.");
                         }
-                    } else {
-                        throw new IllegalArgumentException("No 3GPP instructions where given.");
                     }
+
+
                 }
+
             }
 
             // execute all tasks.
@@ -569,62 +529,43 @@
                         trgt = s != null ? s : StringUtils.substringAfter(targetStr, "contexts=");
 
                 // find context that this target is about.
-                getDefaultTenant().map(
-                        tenant -> {
-                            if (tenant.fpcMobility().contexts() != null) {
-                                return tenant.fpcMobility()
-                                        .contexts()
-                                        .stream()
-                                        .filter(contexts -> contexts.contextId().toString().equals(trgt))
-                                        .findFirst()
-                                        .orElseThrow(
-                                                () -> new IllegalArgumentException("Context doesn't exist.")
-                                        );
-                            }
-                            throw new IllegalArgumentException("Contexts are empty.");
-                        }
-                ).ifPresent(
-                        context -> context.dpns().forEach(
-                                dpn -> {
-                                    // check if dpns exists and if there is a DPN registered for the wanted identifier.
-                                    if (getDefaultTenant().map(
-                                            tenant -> tenant.fpcTopology().dpns() == null ||
-                                                    tenant.fpcTopology().dpns()
-                                                            .stream()
-                                                            .noneMatch(dpns -> dpns.dpnId().equals(dpn.dpnId()))
-                                    ).orElse(false)) {
-                                        // throw exception if DPN ID is not registered.
-                                        throw new IllegalStateException("DPN ID is not registered to the topology.");
-                                    }
+                FpcContextId fpcContextId = FpcContextId.of(FpcIdentity.fromString(trgt));
+                Optional<DefaultContexts> defaultContexts = cacheManager.contextsCache.get(fpcContextId);
+                if (!defaultContexts.isPresent()) {
+                    throw new IllegalStateException("Context doesn't exist. Please issue create operation..");
+                }
 
-                                    // from DPN ID find the Network and Node Identifiers
-                                    Optional<String> key = getDefaultTenant().flatMap(tenant ->
-                                            tenant.fpcTopology()
-                                                    .dpns()
-                                                    .stream()
-                                                    .filter(dpns -> dpns.dpnId().equals(dpn.dpnId()))
-                                                    .findFirst().map(node -> node.nodeId() + "/" + node.networkId())
-                                    );
+                DefaultContexts context = defaultContexts.get();
+                for (Dpns dpn : context.dpns()) {
+                    // check if dpns exists and if there is a DPN registered for the wanted identifier.
+                    if (!cacheManager.dpnsCache.get(dpn.dpnId()).isPresent()) {
+                        // throw exception if DPN ID is not registered.
+                        throw new IllegalStateException("DPN ID is not registered to the topology.");
+                    }
 
-                                    if (key.isPresent()) {
-                                        // find DPN Topic from Node/Network ID pair.
-                                        Short topic_id = getTopicFromNode(key.get());
+                    // from DPN ID find the Network and Node Identifiers
+                    Optional<String> key = cacheManager.dpnsCache.get(dpn.dpnId())
+                            .map(node -> node.nodeId() + "/" + node.networkId());
+                    if (!key.isPresent()) {
+                        throw new IllegalArgumentException("DPN does not have node and network ID defined.");
+                    }
 
-                                        if (topic_id != null) {
+                    // find DPN Topic from Node/Network ID pair.
+                    Short topic_id = getTopicFromNode(key.get());
+                    if (topic_id == null) {
+                        throw new IllegalArgumentException("Could not find Topic ID");
+                    }
 
-                                            Long teid;
+                    if (!(context.ul().mobilityTunnelParameters().mobprofileParameters() instanceof ThreegppTunnel)) {
+                        throw new IllegalArgumentException("mobprofileParameters are not instance of ThreegppTunnel");
+                    }
 
-                                            if (context.ul().mobilityTunnelParameters().mobprofileParameters() instanceof ThreegppTunnel) {
-                                                teid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters().mobprofileParameters()).tunnelIdentifier();
-                                            } else {
-                                                throw new IllegalArgumentException("mobprofileParameters are not instance of ThreegppTunnel");
-                                            }
+                    Long teid = ((ThreegppTunnel) context.ul().mobilityTunnelParameters().mobprofileParameters()).tunnelIdentifier();
+                    long client_id = clientId.fpcIdentity().union().int64();
+                    BigInteger op_id = operationId.uint64();
 
-                                            long client_id = clientId.fpcIdentity().union().int64();
-                                            BigInteger op_id = operationId.uint64();
-
-                                            // TODO figure out what is going on.
-                                            if (targetStr.endsWith("ul") || targetStr.endsWith("dl")) {
+                    // TODO figure out what is going on.
+                    if (targetStr.endsWith("ul") || targetStr.endsWith("dl")) {
 //                                                tasks.add(Executors.callable(() -> {
 //                                                    dpnCommunicationService.delete_bearer(
 //                                                            topic_id,
@@ -634,38 +575,29 @@
 //                                                    context.dl(null);
 //                                                    context.ul(null);
 //                                                }));
-                                            } else {
-                                                tasks.add(Executors.callable(() -> {
-                                                    dpnCommunicationService.delete_session(
-                                                            topic_id,
-                                                            context.contextId().fpcIdentity().union().int64(),
-                                                            client_id,
-                                                            op_id
-                                                    );
+                    } else {
+                        tasks.add(Executors.callable(() -> {
+                            dpnCommunicationService.delete_session(
+                                    topic_id,
+                                    context.contextId().fpcIdentity().union().int64(),
+                                    client_id,
+                                    op_id
+                            );
 
-                                                    ContextsKeys contextsKeys = new ContextsKeys();
-                                                    contextsKeys.contextId(context.contextId());
+                            ContextsKeys contextsKeys = new ContextsKeys();
+                            contextsKeys.contextId(context.contextId());
 
-                                                    ResourceId resourceVal = getResourceVal(defaultTenantBuilder()
-                                                            .addChild(DefaultFpcMobility.class)
-                                                            .addChild(DefaultContexts.class, contextsKeys)
-                                                            .build());
-                                                    dynamicConfigService.deleteNode(resourceVal);
-                                                }));
-                                            }
-
-                                        } else {
-                                            throw new IllegalArgumentException("Could not find Topic ID");
-                                        }
-                                    } else {
-                                        throw new IllegalArgumentException("DPN does not have node and network ID defined.");
-                                    }
-                                }
-                        )
-                );
-
+                            ResourceId resourceVal = getResourceVal(defaultTenantBuilder()
+                                    .addChild(DefaultFpcMobility.class)
+                                    .addChild(DefaultContexts.class, contextsKeys)
+                                    .build());
+                            dynamicConfigService.deleteNode(resourceVal);
+                        }));
+                    }
+                }
             }
 
+
             // execute all tasks
             ExecutorService executor = Executors.newWorkStealingPool();
             executor.invokeAll(tasks).forEach(
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/TenantService.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/TenantService.java
index 2542858..5b4ea1a 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/TenantService.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/TenantService.java
@@ -50,13 +50,6 @@
     List<ModelObject> getModelObjects(DataNode dataNode, ResourceId appId);
 
     /**
-     * Returns the Default Tenant.
-     *
-     * @return Optional Default Tenant
-     */
-    Optional<DefaultTenant> getDefaultTenant();
-
-    /**
      * Get Tenant by its Identifier.
      *
      * @param tenantId Tenant Identifier
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/ConfigHelper.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/ConfigHelper.java
deleted file mode 100644
index 5a91d52..0000000
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/ConfigHelper.java
+++ /dev/null
@@ -1,315 +0,0 @@
-package org.onosproject.fpcagent.helpers;
-
-import com.fasterxml.jackson.annotation.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-@JsonInclude(JsonInclude.Include.NON_NULL)
-@JsonPropertyOrder({
-        "monitor-threads",
-        "scheduled-monitors-poolsize",
-        "dpn-subscriber-uri",
-        "dpn-listener-id",
-        "dpn-publisher-uri",
-        "dpn-client-threads",
-        "metricsupdate-ms",
-        "mobilityupdate-ms",
-        "activation-threads",
-        "target-read-limit",
-        "http-notifier-clients",
-        "zmq-nbi-server-poolsize",
-        "zmq-nbi-server-uri",
-        "zmq-nbi-inproc-uri",
-        "zmq-nbi-handler-poolsize",
-        "http-nio2-nb-poolsize",
-        "http-nio2-nb-port",
-        "node-id",
-        "network-id",
-        "zmq-broadcast-controllers",
-        "zmq-broadcast-dpns",
-        "zmq-broadcast-all"
-})
-public class ConfigHelper {
-    @JsonProperty("monitor-threads")
-    private Integer monitorThreads;
-    @JsonProperty("scheduled-monitors-poolsize")
-    private Integer scheduledMonitorsPoolsize;
-    @JsonProperty("dpn-subscriber-uri")
-    private String dpnSubscriberUri;
-    @JsonProperty("dpn-listener-id")
-    private Integer dpnListenerId;
-    @JsonProperty("dpn-publisher-uri")
-    private String dpnPublisherUri;
-    @JsonProperty("dpn-client-threads")
-    private Integer dpnClientThreads;
-    @JsonProperty("metricsupdate-ms")
-    private Integer metricsupdateMs;
-    @JsonProperty("mobilityupdate-ms")
-    private Integer mobilityupdateMs;
-    @JsonProperty("activation-threads")
-    private Integer activationThreads;
-    @JsonProperty("target-read-limit")
-    private Integer targetReadLimit;
-    @JsonProperty("http-notifier-clients")
-    private Integer httpNotifierClients;
-    @JsonProperty("zmq-nbi-server-poolsize")
-    private Integer zmqNbiServerPoolsize;
-    @JsonProperty("zmq-nbi-server-uri")
-    private String zmqNbiServerUri;
-    @JsonProperty("zmq-nbi-inproc-uri")
-    private String zmqNbiInprocUri;
-    @JsonProperty("zmq-nbi-handler-poolsize")
-    private Integer zmqNbiHandlerPoolsize;
-    @JsonProperty("http-nio2-nb-poolsize")
-    private Integer httpNio2NbPoolsize;
-    @JsonProperty("http-nio2-nb-port")
-    private Integer httpNio2NbPort;
-    @JsonProperty("node-id")
-    private String nodeId;
-    @JsonProperty("network-id")
-    private String networkId;
-    @JsonProperty("zmq-broadcast-controllers")
-    private String zmqBroadcastControllers;
-    @JsonProperty("zmq-broadcast-dpns")
-    private String zmqBroadcastDpns;
-    @JsonProperty("zmq-broadcast-all")
-    private String zmqBroadcastAll;
-    @JsonIgnore
-    private Map<String, Object> additionalProperties = new HashMap<>();
-
-    /**
-     * No args constructor for use in serialization
-     */
-    public ConfigHelper() {
-    }
-
-
-    public Integer monitorThreads() {
-        return monitorThreads;
-    }
-
-
-    public void setMonitorThreads(Integer monitorThreads) {
-        this.monitorThreads = monitorThreads;
-    }
-
-
-    public Integer scheduledMonitorsPoolsize() {
-        return scheduledMonitorsPoolsize;
-    }
-
-
-    public void setScheduledMonitorsPoolsize(Integer scheduledMonitorsPoolsize) {
-        this.scheduledMonitorsPoolsize = scheduledMonitorsPoolsize;
-    }
-
-
-    public String dpnSubscriberUri() {
-        return dpnSubscriberUri;
-    }
-
-
-    public void setDpnSubscriberUri(String dpnSubscriberUri) {
-        this.dpnSubscriberUri = dpnSubscriberUri;
-    }
-
-
-    public Integer dpnListenerId() {
-        return dpnListenerId;
-    }
-
-
-    public void setDpnListenerId(Integer dpnListenerId) {
-        this.dpnListenerId = dpnListenerId;
-    }
-
-
-    public String dpnPublisherUri() {
-        return dpnPublisherUri;
-    }
-
-    public void setDpnPublisherUri(String dpnPublisherUri) {
-        this.dpnPublisherUri = dpnPublisherUri;
-    }
-
-
-    public Integer dpnClientThreads() {
-        return dpnClientThreads;
-    }
-
-
-    public void setDpnClientThreads(Integer dpnClientThreads) {
-        this.dpnClientThreads = dpnClientThreads;
-    }
-
-
-    public Integer metricUpdateMs() {
-        return metricsupdateMs;
-    }
-
-
-    public void setMetricsupdateMs(Integer metricsupdateMs) {
-        this.metricsupdateMs = metricsupdateMs;
-    }
-
-
-    public Integer mobilityUpdateMs() {
-        return mobilityupdateMs;
-    }
-
-
-    public void setMobilityupdateMs(Integer mobilityupdateMs) {
-        this.mobilityupdateMs = mobilityupdateMs;
-    }
-
-
-    public Integer activationThreads() {
-        return activationThreads;
-    }
-
-
-    public void setActivationThreads(Integer activationThreads) {
-        this.activationThreads = activationThreads;
-    }
-
-
-    public Integer targetReadLimit() {
-        return targetReadLimit;
-    }
-
-
-    public void setTargetReadLimit(Integer targetReadLimit) {
-        this.targetReadLimit = targetReadLimit;
-    }
-
-
-    public Integer httpNotifierClients() {
-        return httpNotifierClients;
-    }
-
-
-    public void setHttpNotifierClients(Integer httpNotifierClients) {
-        this.httpNotifierClients = httpNotifierClients;
-    }
-
-
-    public Integer zmqServerPoolsize() {
-        return zmqNbiServerPoolsize;
-    }
-
-
-    public void setZmqNbiServerPoolsize(Integer zmqNbiServerPoolsize) {
-        this.zmqNbiServerPoolsize = zmqNbiServerPoolsize;
-    }
-
-
-    public String zmqServerUri() {
-        return zmqNbiServerUri;
-    }
-
-
-    public void setZmqNbiServerUri(String zmqNbiServerUri) {
-        this.zmqNbiServerUri = zmqNbiServerUri;
-    }
-
-
-    public String zmqInprocUri() {
-        return zmqNbiInprocUri;
-    }
-
-
-    public void setZmqNbiInprocUri(String zmqNbiInprocUri) {
-        this.zmqNbiInprocUri = zmqNbiInprocUri;
-    }
-
-
-    public Integer zmqHandlerPoolsize() {
-        return zmqNbiHandlerPoolsize;
-    }
-
-
-    public void setZmqNbiHandlerPoolsize(Integer zmqNbiHandlerPoolsize) {
-        this.zmqNbiHandlerPoolsize = zmqNbiHandlerPoolsize;
-    }
-
-
-    public Integer httpNio2Poolsize() {
-        return httpNio2NbPoolsize;
-    }
-
-
-    public void setHttpNio2NbPoolsize(Integer httpNio2NbPoolsize) {
-        this.httpNio2NbPoolsize = httpNio2NbPoolsize;
-    }
-
-
-    public Integer httpNio2Port() {
-        return httpNio2NbPort;
-    }
-
-
-    public void setHttpNio2NbPort(Integer httpNio2NbPort) {
-        this.httpNio2NbPort = httpNio2NbPort;
-    }
-
-
-    public String nodeId() {
-        return nodeId;
-    }
-
-
-    public void setNodeId(String node_id) {
-        this.nodeId = node_id;
-    }
-
-
-    public String networkId() {
-        return networkId;
-    }
-
-
-    public void setNetworkId(String network_id) {
-        this.networkId = network_id;
-    }
-
-
-    public String zmqBroadcastControllers() {
-        return zmqBroadcastControllers;
-    }
-
-
-    public void setZmqBroadcastControllers(String zmqBroadcastControllers) {
-        this.zmqBroadcastControllers = zmqBroadcastControllers;
-    }
-
-    public String zmqBroadcastDpns() {
-        return zmqBroadcastDpns;
-    }
-
-
-    public void setZmqBroadcastDpns(String zmqBroadcastDpns) {
-        this.zmqBroadcastDpns = zmqBroadcastDpns;
-    }
-
-
-    public String zmqBroadcastAll() {
-        return zmqBroadcastAll;
-    }
-
-
-    public void setZmqBroadcastAll(String zmqBroadcastAll) {
-        this.zmqBroadcastAll = zmqBroadcastAll;
-    }
-
-    @JsonAnyGetter
-    public Map<String, Object> getAdditionalProperties() {
-        return this.additionalProperties;
-    }
-
-    @JsonAnySetter
-    public void setAdditionalProperty(String name, Object value) {
-        this.additionalProperties.put(name, value);
-    }
-
-}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/Converter.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/Converter.java
deleted file mode 100644
index c47bdd0..0000000
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/Converter.java
+++ /dev/null
@@ -1,166 +0,0 @@
-package org.onosproject.fpcagent.helpers;
-
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.ClientIdentifier;
-import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpcmobility.DefaultContexts;
-import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcContextId;
-import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcDpnGroupId;
-import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcIdentity;
-import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcPortId;
-import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.fpccontext.Dl;
-import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.fpccontext.Dpns;
-import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.fpccontext.Ul;
-import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.fpcidentity.FpcIdentityUnion;
-import org.onosproject.yang.gen.v1.ietfdmmthreegpp.rev20160803.ietfdmmthreegpp.EbiType;
-import org.onosproject.yang.gen.v1.ietfdmmthreegpp.rev20160803.ietfdmmthreegpp.ImsiType;
-import org.onosproject.yang.gen.v1.ietfinettypes.rev20130715.ietfinettypes.IpPrefix;
-
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.function.Function;
-
-public class Converter {
-    /**
-     * Short to Byte
-     *
-     * @param value - Short
-     * @return byte value
-     */
-    public static byte toUint8(Short value) {
-        return value.byteValue();
-    }
-
-    /**
-     * Short to byte array
-     *
-     * @param value - Short
-     * @return byte array
-     */
-    public static byte[] toUint16(Short value) {
-        return new byte[]{(byte) (value >>> 8), (byte) (value & 0xFF)};
-    }
-
-    /**
-     * Lower two bytes of an integer to byte array
-     *
-     * @param value - integer value
-     * @return byte array
-     */
-    public static byte[] toUint16(Integer value) {
-        return new byte[]{(byte) (value >>> 8), (byte) (value & 0xFF)};
-    }
-
-    /**
-     * Long to byte array.
-     *
-     * @param value - long
-     * @return byte array
-     */
-    public static byte[] toUint32(long value) {
-        return new byte[]{(byte) (value >>> 24), (byte) (value >>> 16), (byte) (value >>> 8), (byte) (value & 0xFF)};
-    }
-
-    /**
-     * BigInteger to byte array.
-     *
-     * @param value - BigInteger
-     * @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()};
-    }
-
-    /**
-     * Decodes a 32 bit value
-     *
-     * @param source - byte array
-     * @param offset - offset in the array where the 8 bytes begins
-     * @return integer
-     */
-    public static int toInt(byte[] source, int offset) {
-        return new BigInteger(Arrays.copyOfRange(source, offset, offset + 4)).intValue();
-    }
-
-    /**
-     * Converts a byte array to BigInteger
-     *
-     * @param source - byte array
-     * @param offset - offset in the array where the 8 bytes begins
-     * @return BigInteger representing a Uint64
-     */
-    public static BigInteger toBigInt(byte[] source, int offset) {
-        return new BigInteger(Arrays.copyOfRange(source, offset, offset + 8));
-    }
-
-    /**
-     * 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
-     * @return Long value of the unsigned integer
-     */
-    public static long fromIntToLong(byte[] source, int offset) {
-        long value = 0;
-        for (int i = offset; i < offset + 4; i++) {
-            value = (value << 8) + (source[i] & 0xff);
-        }
-        return value;
-    }
-
-    public static Function<String, FpcIdentity> getFpcIdentity = (v) -> new FpcIdentity(new FpcIdentityUnion(v));
-    public static Function<String, ClientIdentifier> getClientIdentity = (v) -> new ClientIdentifier(getFpcIdentity.apply(v));
-
-    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();
-        Dl dl = contexts.dl();
-        Ul ul = contexts.ul();
-        boolean dormant = contexts.dormant();
-        FpcDpnGroupId fpcDpnGroupId = contexts.dpnGroup();
-        List<Dpns> dpns = contexts.dpns();
-        EbiType ebi = contexts.ebi();
-        EbiType lbi = contexts.lbi();
-        ImsiType imsi = contexts.imsi();
-        FpcContextId fpcContextId1 = contexts.parentContext();
-        List<FpcPortId> ports = contexts.ports();
-
-        if (fpcContextId != null) {
-            ctx.contextId(fpcContextId);
-        }
-        if (ipPrefixes != null) {
-            ctx.delegatingIpPrefixes(ipPrefixes);
-        }
-        if (dl != null) {
-            ctx.dl(dl);
-        }
-        if (ul != null) {
-            ctx.ul(ul);
-        }
-        ctx.dormant(dormant);
-        if (fpcDpnGroupId != null) {
-            ctx.dpnGroup(fpcDpnGroupId);
-        }
-        if (dpns != null) {
-            ctx.dpns(dpns);
-        }
-        if (ebi != null) {
-            ctx.ebi(ebi);
-        }
-        if (lbi != null) {
-            ctx.lbi(lbi);
-        }
-        if (imsi != null) {
-            ctx.imsi(imsi);
-        }
-        if (fpcContextId1 != null) {
-            ctx.parentContext(fpcContextId1);
-        }
-        if (ports != null) {
-            ctx.ports(ports);
-        }
-        return ctx;
-    }
-}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/DpnCommunicationService.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/DpnCommunicationService.java
deleted file mode 100644
index 9785a41..0000000
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/DpnCommunicationService.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * 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.helpers;
-
-import org.onlab.packet.Ip4Address;
-
-import java.math.BigInteger;
-
-/**
- * Communication Service which sends packets to desired DPNs.
- */
-public interface DpnCommunicationService {
-
-    /**
-     * Creates Mobility Session.
-     *
-     * @param topic_id     - 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
-     */
-    void create_session(
-            Short 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
-    );
-
-    /**
-     * 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
-     */
-    void modify_bearer(
-            Short topic_id,
-            Ip4Address s1u_sgw_ipv4,
-            Long s1u_enodeb_teid,
-            Ip4Address s1u_enodeb_ipv4,
-            Long session_id,
-            Long client_id,
-            BigInteger op_id
-    );
-
-    /**
-     * Deletes Mobility Session.
-     *
-     * @param topic_id   - DPN Topic ID
-     * @param session_id - Context Identifier
-     * @param client_id  - Client Identifier
-     * @param op_id      - Operation Identifier
-     */
-    void delete_session(
-            Short topic_id,
-            Long session_id,
-            Long client_id,
-            BigInteger op_id
-    );
-
-    /**
-     * Creates the byte buffer to send ADC rules over ZMQ
-     *
-     * @param topic        - DPN Topic ID
-     * @param domain_name  - 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
-     */
-    void send_ADC_rules(
-            Short topic,
-            String domain_name,
-            String ip,
-            Short drop,
-            Long rating_group,
-            Long service_ID,
-            String sponsor_ID
-    );
-}
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/DpnNgicCommunicator.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/DpnNgicCommunicator.java
deleted file mode 100644
index 50d3d4a..0000000
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/helpers/DpnNgicCommunicator.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * 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.helpers;
-
-import org.onlab.packet.Ip4Address;
-import org.onlab.packet.Ip4Prefix;
-import org.onosproject.fpcagent.workers.ZMQSBPublisherManager;
-import org.onosproject.fpcagent.workers.ZMQSBSubscriberManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
-
-import static org.onosproject.fpcagent.helpers.Converter.*;
-
-/**
- * DPDK DPN API over ZeroMQ for NGIC.
- */
-public class DpnNgicCommunicator implements DpnCommunicationService {
-    protected static final Logger log = LoggerFactory.getLogger(DpnNgicCommunicator.class);
-
-    @Override
-    public void create_session(
-            Short 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
-    ) {
-        /* NGIC Create Session expected buffer:
-            uint8_t topic_id;
-	        uint8_t type;
-            struct create_session_t {
-                uint64_t imsi;
-                uint8_t  default_ebi;
-                uint32_t ue_ipv4;
-                uint32_t s1u_sgw_teid;
-                uint32_t s1u_sgw_ipv4;
-                uint64_t session_id;
-                uint8_t  controller_topic;
-                uint32_t client_id;
-                uint32_t op_id;
-            } create_session_msg;
-         */
-        // TODO: check if subscriber is open.
-        ByteBuffer bb = ByteBuffer.allocate(41)
-                .put(toUint8(topic_id))
-                .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(toUint8(ZMQSBSubscriberManager.getControllerTopic()))
-                .put(toUint32(client_id))
-                .put(toUint32(op_id.longValue()));
-
-        log.debug("create_session: {}", bb.array());
-        ZMQSBPublisherManager.getInstance().send(bb);
-    }
-
-    @Override
-    public void modify_bearer(
-            Short topic_id,
-            Ip4Address s1u_sgw_ipv4,
-            Long s1u_enodeb_teid,
-            Ip4Address s1u_enodeb_ipv4,
-            Long session_id,
-            Long client_id,
-            BigInteger op_id
-    ) {
-        /*
-           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(toUint8(topic_id))
-                .put(s11MsgType.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(toUint8(ZMQSBSubscriberManager.getControllerTopic()))
-                .put(toUint32(client_id))
-                .put(toUint32(op_id.longValue()));
-
-        log.debug("modify_bearer: {}", bb.array());
-        ZMQSBPublisherManager.getInstance().send(bb);
-    }
-
-    @Override
-    public void delete_session(
-            Short topic_id,
-            Long session_id,
-            Long client_id,
-            BigInteger op_id
-    ) {
-        /*
-            NGIC Delete Session expected buffer:
-            uint8_t topic_id;
-	        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;
-         */
-        ByteBuffer bb = ByteBuffer.allocate(19)
-                .put(toUint8(topic_id))
-                .put(s11MsgType.DELETE_SESSION.getType())
-                .put(toUint64(BigInteger.valueOf(session_id)))
-                .put(toUint8(ZMQSBSubscriberManager.getControllerTopic()))
-                .put(toUint32(client_id))
-                .put(toUint32(op_id.longValue()));
-
-        log.debug("delete_session: {}", bb.array());
-        ZMQSBPublisherManager.getInstance().send(bb);
-    }
-
-    @Override
-    public void send_ADC_rules(
-            Short topic,
-            String domain_name,
-            String ip,
-            Short drop,
-            Long rating_group,
-            Long service_ID, String sponsor_ID
-    ) {
-        // TODO take a look for this function. Not tested.
-        Ip4Prefix ip_prefix = null;
-        if (ip != null) {
-            ip_prefix = 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) {
-            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());
-        }
-        if ((selector_type == 1) || (selector_type == 2)) {
-            int ip_address_long = ip_prefix.address().toInt();
-            bb.put(toUint32(ip_address_long));
-        }
-        if (selector_type == 2) {
-            bb.put(toUint16(ip_prefix.prefixLength()));
-        }
-        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(toUint8(ZMQSBSubscriberManager.getControllerTopic()));
-
-        log.info("send_ADC_rules: {}", bb.array());
-        ZMQSBPublisherManager.getInstance().send(bb);
-    }
-
-    /**
-     * Following the NGIC message types.
-     *
-     * This type structure is defined in NGIC at interface/zmq/zmqsub.h:51
-     */
-    enum s11MsgType {
-        CREATE_SESSION(1),
-        MODIFY_BEARER(2),
-        DELETE_SESSION(3),
-        DPN_RESPONSE(4),
-        DDN(5),
-        ASSIGN_TOPIC(10),
-        ASSIGN_CONFLICT(11),
-        DPN_STATUS_INDICATION(12),
-        DPN_STATUS_ACK(13),
-        CONTROLLER_STATUS_INDICATION(14),
-        ADC_RULE(17),
-        PCC_RULE(18),
-        METER_RULE(19),
-        SDF_RULE(20);
-
-        private byte type;
-
-        s11MsgType(int type) {
-            this.type = (byte) type;
-        }
-
-        public byte getType() {
-            return type;
-        }
-    }
-}
\ No newline at end of file
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
index 7a53aaa..f137693 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,7 +1,7 @@
 package org.onosproject.fpcagent.workers;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
-import org.onosproject.fpcagent.FpcUtil;
+import org.onosproject.fpcagent.util.FpcUtil;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.yangautoprefixnotify.value.DownlinkDataNotification;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcDpnId;
 import org.slf4j.Logger;
@@ -16,7 +16,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadLocalRandom;
 
-import static org.onosproject.fpcagent.helpers.Converter.*;
+import static org.onosproject.fpcagent.util.Converter.*;
 
 public class ZMQSBSubscriberManager implements AutoCloseable {
     private static final Logger log = LoggerFactory.getLogger(ZMQSBSubscriberManager.class);
diff --git a/scripts/benchmark.sh b/scripts/benchmark.sh
index 779875a..1cc3b93 100755
--- a/scripts/benchmark.sh
+++ b/scripts/benchmark.sh
@@ -2,18 +2,18 @@
 
 ./addDPN.sh 1 &> /dev/null 
 
-for (( i=1; i<=1000; i++)); do
+for (( i=1; i<=100; i++)); do
 	./configureCreateOrUpdate.sh create $i 1 &> /dev/null &
-	if ! (($i % 100)); then
+	if ! (($i % 10)); then
 		wait
 	fi
 done
 
-for (( i=1; i<=1000; i++)); do
-	./configureDeleteOrQuery.sh delete $i &> /dev/null &
-	if ! (($i % 100)); then
-		wait
-	fi
-done
+#for (( i=1; i<=100; i++)); do
+#	./configureDeleteOrQuery.sh delete $i &> /dev/null &
+#	if ! (($i % 10)); then
+#		wait
+#	fi
+#done
 
-./deleteDPN.sh 1 &> /dev/null 
\ No newline at end of file
+./deleteDPN.sh 1 &> /dev/null