added comments and dpn ack
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/ActivationManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/ActivationManager.java
deleted file mode 100644
index a32fe12..0000000
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/ActivationManager.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package org.onosproject.fpcagent;
-
-public class ActivationManager {
-}
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 4ae0847..d7d88e6 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcManager.java
@@ -108,7 +108,7 @@
 
         notificationIds = coreService.getIdGenerator("fpc-notification-ids");
 
-        HTTPNotifier.getInstance().open();
+        HTTPNotifier.createInstance(modelConverter).open();
 
         log.info("FPC Service Started");
     }
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 63bcd25..4e9b3bb 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
@@ -179,11 +179,14 @@
 
         final DefaultConnectionInfo defaultConnectionInfo = new DefaultConnectionInfo();
 
+        // instatiate DC Store with empty fields
         createNode(tenants, root);
         createNode(fpcAgentInfo, root);
         createNode(defaultConnectionInfo, root);
     }
 
+    // TODO check if DPN is abstract and replicate
+
     @Override
     public DefaultConfigureOutput configureCreate(
             CreateOrUpdate create,
@@ -192,8 +195,10 @@
     ) throws Exception {
         DefaultConfigureOutput configureOutput = new DefaultConfigureOutput();
         Collection<Callable<Object>> tasks = new ArrayList<>();
+        // Get this clients tenant.
         FpcIdentity tenantId = clientInfo.tenantId();
         DefaultCommonSuccess defaultCommonSuccess = new DefaultCommonSuccess();
+        // Load cache for specific tenant.
         CacheManager cacheManager = CacheManager.getInstance(tenantId);
 
         for (Contexts context : create.contexts()) {
@@ -220,6 +225,7 @@
 
                 final DpnCommunicationService dpnCommunicationService;
                 Class<? extends FpcDpnControlProtocol> controlProtocol = optionalDpn.get().controlProtocol();
+                // Check if the DPN supports NGIC or P4 protocol
                 if (controlProtocol.isAssignableFrom(ZmqDpnControlProtocol.class)) {
                     dpnCommunicationService = new DpnNgicCommunicator();
                 } else if (controlProtocol.isAssignableFrom(P4DpnControlProtocol.class)) {
@@ -351,9 +357,12 @@
     ) throws Exception {
         DefaultConfigureOutput configureOutput = new DefaultConfigureOutput();
         Collection<Callable<Object>> tasks = new ArrayList<>();
+        // Get this clients tenant.
         FpcIdentity tenantId = clientInfo.tenantId();
         DefaultCommonSuccess defaultCommonSuccess = new DefaultCommonSuccess();
+        // Load cache for specific tenant.
         CacheManager cacheManager = CacheManager.getInstance(tenantId);
+
         for (Contexts context : update.contexts()) {
             Instructions instructions = context.instructions();
             if (instructions == null) {
@@ -378,6 +387,7 @@
 
                 final DpnCommunicationService dpnCommunicationService;
                 Class<? extends FpcDpnControlProtocol> controlProtocol = optionalDpn.get().controlProtocol();
+                // Check if the DPN supports NGIC or P4 protocol
                 if (controlProtocol.isAssignableFrom(ZmqDpnControlProtocol.class)) {
                     dpnCommunicationService = new DpnNgicCommunicator();
                 } else if (controlProtocol.isAssignableFrom(P4DpnControlProtocol.class)) {
@@ -420,7 +430,7 @@
 
                 BigInteger opId = operationId.uint64();
 
-                // TODO dpn.direction()
+                // TODO do we care about dpn.direction()?
 
                 DefaultContexts convertContext = convertContext(context);
                 if (commands.contains("downlink")) {
@@ -498,7 +508,9 @@
     ) throws Exception {
         DefaultConfigureOutput configureOutput = new DefaultConfigureOutput();
         Collection<Callable<Object>> tasks = new ArrayList<>();
+        // get client's tenant.
         FpcIdentity tenantId = clientInfo.tenantId();
+        // get cache for specific tenant.
         CacheManager cacheManager = CacheManager.getInstance(tenantId);
         DefaultDeleteSuccess defaultDeleteSuccess = new DefaultDeleteSuccess();
         for (Targets target : delete.targets()) {
@@ -606,12 +618,14 @@
         DefaultConfigureDpnOutput defaultConfigureDpnOutput = new DefaultConfigureDpnOutput();
         boolean done = false;
 
+        // get DPN and abstract DPN
         final FpcDpnId fpcDpnId = input.inputDpnId(),
                 abstractDpnId = input.abstractDpnId();
         if (fpcDpnId == null || abstractDpnId == null) {
             throw new RuntimeException("DPN and Abstract DPN must be provided.");
         }
 
+        // search in the Cache for the specified DPN
         for (CacheManager cacheManager : CacheManager.cacheInfo.values()) {
             final Optional<DefaultDpns> optionalDpn = cacheManager.dpnsCache.get(fpcDpnId),
                     optionalvDpn = cacheManager.dpnsCache.get(abstractDpnId);
@@ -632,6 +646,7 @@
                 vdpn.dpnIds(new ArrayList<>());
             }
 
+            // add DPN to the abstract DPN and then replicate all the messages.
             if (!vdpn.dpnIds().contains(dpn.dpnId())) {
                 // TODO copy contexts
                 vdpn.addToDpnIds(dpn.dpnId());
@@ -654,12 +669,14 @@
         DefaultConfigureDpnOutput defaultConfigureDpnOutput = new DefaultConfigureDpnOutput();
         boolean done = false;
 
+        // get DPN and abstract DPN
         final FpcDpnId fpcDpnId = input.inputDpnId(),
                 abstractDpnId = input.abstractDpnId();
         if (fpcDpnId == null || abstractDpnId == null) {
             throw new RuntimeException("DPN and Abstract DPN must be provided.");
         }
 
+        // search in the Cache for the specified DPN
         for (CacheManager cacheManager : CacheManager.cacheInfo.values()) {
             final Optional<DefaultDpns> optionalDpn = cacheManager.dpnsCache.get(fpcDpnId),
                     optionalvDpn = cacheManager.dpnsCache.get(abstractDpnId);
@@ -679,6 +696,7 @@
                 throw new RuntimeException("DPN is not part of the vDPN");
             }
 
+            // remove DPN from the abstract DPN.
             vdpn.dpnIds().remove(dpn.dpnId());
             // TODO remove contexts
             done = true;
@@ -899,7 +917,9 @@
                     if (clientInfo.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);
+                    // keep clients for each tenant
                     HashSet<ClientIdentifier> hashSet = tenantInfo.getOrDefault(input.tenantId(), Sets.newHashSet());
                     hashSet.add(input.clientId());
                     tenantInfo.put(input.tenantId(), hashSet);
@@ -992,6 +1012,7 @@
         public void event(DeviceEvent event) {
             if (event.subject().manufacturer().equals("fpc")) {
                 switch (event.type()) {
+                    // in case an FPC device is added or restarted send DPN availability to all connected clients
                     case DEVICE_UPDATED:
                     case DEVICE_ADDED: {
                         tenantInfo.forEach(
@@ -1001,11 +1022,12 @@
                                         DefaultTenant tenant = defaultTenant.get();
                                         if (tenant.fpcTopology().dpns() != null) {
                                             tenant.fpcTopology().dpns().forEach(dpn -> {
-                                                        CacheManager.getInstance(tenantId).nodeNetworkCache.put(
-                                                                dpn.nodeId() + "/" + dpn.networkId(),
-                                                                Optional.of(dpn.dpnId())
-                                                        );
                                                         if (!dpnInfo.contains(dpn.dpnId())) {
+                                                            CacheManager.getInstance(tenantId).nodeNetworkCache.put(
+                                                                    dpn.nodeId() + "/" + dpn.networkId(),
+                                                                    Optional.of(dpn.dpnId())
+                                                            );
+
                                                             DefaultYangAutoPrefixNotify notify = new DefaultYangAutoPrefixNotify();
                                                             notify.notificationId(NotificationId.of(notificationIds.getNewId()));
 
@@ -1033,6 +1055,7 @@
                         );
                         break;
                     }
+                    // in case an FPC device is removed or shutdown send DPN availability to all connected clients
                     case DEVICE_AVAILABILITY_CHANGED:
                     case DEVICE_REMOVED: {
                         String nodeNetwork = event.subject().id().toString().split(":")[1];
@@ -1062,7 +1085,6 @@
 
                                             clients.forEach(client -> sendNotification(notify, client));
                                             dpnInfo.remove(fpcDpnId);
-
                                         }
                                     } catch (Exception e) {
                                         log.error(ExceptionUtils.getFullStackTrace(e));
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 8d5c150..d0b1217 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcService.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcService.java
@@ -9,6 +9,9 @@
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.opinput.opbody.CreateOrUpdate;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.opinput.opbody.DeleteOrQuery;
 
+/**
+ * Main service that handles RPC events and DC Store modifications.
+ */
 @Beta
 public interface FpcRpcService {
 
@@ -16,9 +19,10 @@
      * Handles create Configure operations that are invoked through RPC.
      *
      * @param create      RPC Input converted
-     * @param clientInfo    Client Identifier
+     * @param clientInfo  Client info
      * @param operationId Operation Identifier
      * @return Result of the configuration
+     * @throws Exception Runtime exception
      */
     DefaultConfigureOutput configureCreate(
             CreateOrUpdate create,
@@ -30,9 +34,10 @@
      * Handles update Configure operations that are invoked through RPC.
      *
      * @param update      RPC Input converted
-     * @param clientInfo    Client Identifier
+     * @param clientInfo  Client info
      * @param operationId Operation Identifier
      * @return Result of the configuration
+     * @throws Exception Runtime exception
      */
     DefaultConfigureOutput configureUpdate(
             CreateOrUpdate update,
@@ -44,9 +49,10 @@
      * Handles delete Configure operations that are invoked through RPC.
      *
      * @param delete      RPC Input converted
-     * @param clientInfo    Client Identifier
+     * @param clientInfo  Client info
      * @param operationId Operation Identifier
      * @return Result of the configuration
+     * @throws Exception Runtime exception
      */
     DefaultConfigureOutput configureDelete(
             DeleteOrQuery delete,
@@ -54,7 +60,21 @@
             OpIdentifier operationId
     ) throws Exception;
 
+    /**
+     * Configures a DPN if it is abstract or not.
+     *
+     * @param input RPC Input converted
+     * @return Result of the configuration
+     * @throws Exception Runtime exception
+     */
     DefaultConfigureDpnOutput configureDpnAdd(DefaultConfigureDpnInput input) throws Exception;
 
+    /**
+     * Configures a DPN if it is abstract or not.
+     *
+     * @param input RPC Input converted
+     * @return Result of the configuration
+     * @throws Exception Runtime exception
+     */
     DefaultConfigureDpnOutput configureDpnRemove(DefaultConfigureDpnInput input) throws Exception;
 }
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 17df670..c44a18b 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
@@ -27,7 +27,8 @@
 
     /**
      * Creates Mobility Session.
-     *  @param topic_id     - DPN Topic ID
+     *
+     * @param topic_id     - DPN Topic ID
      * @param imsi         - IMSI identifier
      * @param default_ebi  - EBI
      * @param ue_ipv4      - UE IPv4 Address
@@ -51,7 +52,8 @@
 
     /**
      * Modifies Bearer.
-     *  @param topic_id        - DPN Topic ID
+     *
+     * @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
@@ -71,7 +73,8 @@
 
     /**
      * Deletes Mobility Session.
-     *  @param topic_id   - DPN Topic ID
+     *
+     * @param topic_id   - DPN Topic ID
      * @param session_id - Context Identifier
      * @param client_id  - Client Identifier
      * @param op_id      - Operation Identifier
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 78f1171..b030967 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
@@ -16,11 +16,15 @@
 
 package org.onosproject.fpcagent.protocols;
 
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.json.JSONObject;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.Ip4Prefix;
 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.ClientIdentifier;
+import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcDpnId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -120,6 +124,35 @@
         ZMQSBPublisherManager.getInstance().send(bb);
     }
 
+    /**
+     * 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 ddnAck(JSONObject body) {
+        try {
+            ByteBuffer bb = ByteBuffer.allocate(14);
+            Short dpn = DpnAPIListener.getTopicFromDpnId(new FpcDpnId((String) body.get("dpn-id")));
+            bb.put(toUint8(dpn))
+                    .put(s11MsgType.DDN_ACK.getType());
+
+            if (body.has("dl-buffering-duration")) {
+                bb.put(toUint8((short) body.getInt("dl-buffering-duration")));
+            }
+            if (body.has("dl-buffering-suggested-count")) {
+                bb.put(toUint16((int) body.getInt("dl-buffering-suggested-count")));
+            }
+            bb.put(ZMQSBSubscriberManager.getInstance().getControllerTopic())
+                    .put(toUint32(Long.parseLong(new ClientIdentifier(body.getString("client-id")).getString())))
+                    .put(toUint32(body.getLong("op-id")));
+
+            ZMQSBPublisherManager.getInstance().send(bb);
+        } catch (InterruptedException e) {
+            log.error("{}", ExceptionUtils.getFullStackTrace(e));
+        }
+
+    }
+
     @Override
     public void create_session(
             byte topic_id,
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 98585bf..2b45678 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
@@ -16,19 +16,14 @@
 
 package org.onosproject.fpcagent.util;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.config.DynamicConfigService;
 import org.onosproject.config.Filter;
 import org.onosproject.core.IdGenerator;
 import org.onosproject.fpcagent.workers.HTTPNotifier;
 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.DefaultTenants;
@@ -55,12 +50,15 @@
 public 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 HashSet<FpcDpnId> dpnInfo = Sets.newHashSet();
     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;
-
+    // Resource IDs
     public static ResourceId configureDpn;
     public static ResourceId configure;
     public static ResourceId tenants;
@@ -69,13 +67,9 @@
     public static ResourceId deregisterClient;
     public static ResourceId module;
     public static ResourceId notification;
-
+    // Notification IDs generator
     public static IdGenerator notificationIds;
 
-    public static final ConcurrentMap<ClientIdentifier, DefaultRegisterClientInput> clientInfo = Maps.newConcurrentMap();
-    public static final ConcurrentMap<FpcIdentity, HashSet<ClientIdentifier>> tenantInfo = Maps.newConcurrentMap();
-    public static final HashSet<FpcDpnId> dpnInfo = Sets.newHashSet();
-
     /**
      * Returns resource id from model converter.
      *
@@ -169,6 +163,12 @@
         }
     }
 
+    /**
+     * Get model object for specific tenant.
+     *
+     * @param fpcIdentity Tenant ID
+     * @return tenants model object
+     */
     public static ModelObjectId.Builder tenantBuilder(FpcIdentity fpcIdentity) {
         TenantKeys tenantKeys = new TenantKeys();
         tenantKeys.tenantId(fpcIdentity);
@@ -297,25 +297,19 @@
         );
     }
 
+    /**
+     * Sends a HTTP Post request to specified client.
+     *
+     * @param notify message
+     * @param client HTTP client to receive message
+     */
     public static void sendNotification(DefaultYangAutoPrefixNotify notify, ClientIdentifier client) {
-        ResourceData dataNode = modelConverter.createDataNode(
-                DefaultModelObjectData.builder()
-                        .addModelObject(notify)
-                        .build()
+        log.info("Sending HTTP notification {} to {}", notify, client);
+        HTTPNotifier.getInstance().send(
+                new AbstractMap.SimpleEntry<>(
+                        clientInfo.get(client).endpointUri().toString(),
+                        notify
+                )
         );
-        ObjectNode jsonNodes = RestconfUtils.convertDataNodeToJson(module, dataNode.dataNodes().get(0));
-        ObjectMapper mapper = new ObjectMapper();
-
-        try {
-            log.info("Sending HTTP notification {} to {}", notify, client);
-            HTTPNotifier.getInstance().send(
-                    new AbstractMap.SimpleEntry<>(
-                            clientInfo.get(client).endpointUri().toString(),
-                            mapper.writeValueAsString(jsonNodes)
-                    )
-            );
-        } catch (JsonProcessingException e) {
-            log.error(ExceptionUtils.getFullStackTrace(e));
-        }
     }
 }
diff --git a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/HTTPNotifier.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/HTTPNotifier.java
index 995d6f3..a45b5d4 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/HTTPNotifier.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/workers/HTTPNotifier.java
@@ -16,12 +16,22 @@
 
 package org.onosproject.fpcagent.workers;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.http.HttpResponse;
+import org.apache.http.client.ResponseHandler;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.BasicResponseHandler;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
+import org.onosproject.restconf.utils.RestconfUtils;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.DefaultYangAutoPrefixNotify;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.yangautoprefixnotify.value.DownlinkDataNotification;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ResourceData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,25 +41,34 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.LinkedBlockingQueue;
 
+import static org.onosproject.fpcagent.util.FpcUtil.module;
+
 public class HTTPNotifier implements AutoCloseable {
     private static final Logger log = LoggerFactory.getLogger(HTTPNotifier.class);
     private static HTTPNotifier _instance = null;
-    private final BlockingQueue<Map.Entry<String, String>> blockingQueue;
+    private final BlockingQueue<Map.Entry<String, DefaultYangAutoPrefixNotify>> blockingQueue;
+    public ModelConverter modelConverter = null;
     private boolean run;
+    private ResponseHandler<String> handler = new BasicResponseHandler();
 
-    protected HTTPNotifier() {
+    protected HTTPNotifier(ModelConverter modelConverter) {
         this.run = true;
         this.blockingQueue = new LinkedBlockingQueue<>();
+        this.modelConverter = modelConverter;
     }
 
-    public static HTTPNotifier getInstance() {
+    public static HTTPNotifier createInstance(ModelConverter modelConverter) {
         if (_instance == null) {
-            _instance = new HTTPNotifier();
+            _instance = new HTTPNotifier(modelConverter);
         }
         return _instance;
     }
 
-    public void send(Map.Entry<String, String> buf) {
+    public static HTTPNotifier getInstance() {
+        return _instance;
+    }
+
+    public void send(Map.Entry<String, DefaultYangAutoPrefixNotify> buf) {
         try {
             blockingQueue.put(buf);
         } catch (InterruptedException e) {
@@ -57,23 +76,37 @@
         }
     }
 
+
     public void open() {
         ExecutorService executorService = Executors.newSingleThreadExecutor();
         executorService.submit(() -> {
             while ((!Thread.currentThread().isInterrupted()) && run) {
                 try {
-                    Map.Entry<String, String> entry = blockingQueue.take();
+                    Map.Entry<String, DefaultYangAutoPrefixNotify> entry = blockingQueue.take();
+                    DefaultYangAutoPrefixNotify notify = entry.getValue();
 
                     CloseableHttpClient client = HttpClients.createDefault();
                     HttpPost httpPost = new HttpPost(entry.getKey());
                     httpPost.addHeader("User-Agent", "ONOS Notification Agent");
                     httpPost.addHeader("Charset", "utf-8");
                     httpPost.addHeader("Content-type", "application/json");
-                    StringEntity params = new StringEntity(entry.getValue());
+
+                    ResourceData dataNode = modelConverter.createDataNode(
+                            DefaultModelObjectData.builder()
+                                    .addModelObject(notify)
+                                    .build()
+                    );
+                    ObjectNode jsonNodes = RestconfUtils.convertDataNodeToJson(module, dataNode.dataNodes().get(0));
+                    ObjectMapper mapper = new ObjectMapper();
+
+                    StringEntity params = new StringEntity(mapper.writeValueAsString(jsonNodes.get(0)));
                     httpPost.setEntity(params);
                     HttpResponse response = client.execute(httpPost);
 
-                    log.info("Response {}", response);
+                    if (notify.value() instanceof DownlinkDataNotification) {
+                        String msg = handler.handleResponse(response);
+                        log.info("Response {}", response);
+                    }
                 } catch (Exception e) {
                     log.error(ExceptionUtils.getFullStackTrace(e));
                 }