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 f9b7d36..85d3098 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/FpcRpcManager.java
@@ -136,7 +136,7 @@
     private InternalDeviceListener listener = new InternalDeviceListener();
     private ConcurrentMap<ClientIdentifier, DefaultRegisterClientInput> clientInfo = Maps.newConcurrentMap();
     private ConcurrentMap<FpcIdentity, HashSet<ClientIdentifier>> tenantInfo = Maps.newConcurrentMap();
-    private HashMap<FpcDpnId, org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpctopology.Dpns> dpnInfo = Maps.newHashMap();
+    private HashSet<FpcDpnId> dpnInfo = Sets.newHashSet();
 
     // FIXME configurable
     private ExecutorService executorService = Executors.newFixedThreadPool(25);
@@ -734,7 +734,7 @@
                             .addModelObject(configureDpnOutput)
                             .build()
             );
-            log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+            log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
             return new RpcOutput(status, dataNode.dataNodes().get(0));
         }, executorService).join();
     }
@@ -793,7 +793,7 @@
                             .addModelObject(configureOutput)
                             .build()
             );
-            log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+            log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
             return new RpcOutput(status, dataNode.dataNodes().get(0));
         }, executorService).join();
     }
@@ -854,7 +854,7 @@
                             .addModelObject(configureBundlesOutput)
                             .build()
             );
-            log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+            log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
             return new RpcOutput(status, dataNode.dataNodes().get(0));
         }, executorService).join();
     }
@@ -866,7 +866,7 @@
             // TODO implement
             return null;
         }, executorService);
-        log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+        log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
         return null;
     }
 
@@ -877,7 +877,7 @@
             // TODO implement
             return null;
         }, executorService);
-        log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+        log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
         return null;
     }
 
@@ -888,7 +888,7 @@
             // TODO implement
             return null;
         }, executorService);
-        log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+        log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
         return null;
     }
 
@@ -939,7 +939,7 @@
                             .addModelObject(registerClientOutput)
                             .build()
             );
-            log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+            log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
             return new RpcOutput(status, dataNode.dataNodes().get(0));
         }).join();
     }
@@ -986,7 +986,7 @@
                             .addModelObject(deregisterClientOutput)
                             .build()
             );
-            log.info("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
+            log.debug("Time Elapsed {} ms", Duration.between(start, Instant.now()).toMillis());
             return new RpcOutput(status, dataNode.dataNodes().get(0));
         }, executorService).join();
     }
@@ -1028,7 +1028,11 @@
                                         DefaultTenant tenant = defaultTenant.get();
                                         if (tenant.fpcTopology().dpns() != null) {
                                             tenant.fpcTopology().dpns().forEach(dpn -> {
-                                                        if (!dpnInfo.containsKey(dpn.dpnId())) {
+                                                        CacheManager.getInstance(tenantId).nodeNetworkCache.put(
+                                                                dpn.nodeId() + "/" + dpn.networkId(),
+                                                                Optional.of(dpn.dpnId())
+                                                        );
+                                                        if (!dpnInfo.contains(dpn.dpnId())) {
                                                             DefaultYangAutoPrefixNotify notify = new DefaultYangAutoPrefixNotify();
                                                             notify.notificationId(NotificationId.of(notificationIds.getNewId()));
 
@@ -1046,7 +1050,7 @@
                                                             notify.value(availability);
 
                                                             clients.forEach(client -> sendNotification(notify, client));
-                                                            dpnInfo.put(dpn.dpnId(), dpn);
+                                                            dpnInfo.add(dpn.dpnId());
                                                         }
                                                     }
                                             );
@@ -1058,38 +1062,37 @@
                     }
                     case DEVICE_AVAILABILITY_CHANGED:
                     case DEVICE_REMOVED: {
-                        String[] s = event.subject().id().toString().split(":")[1].split("/");
+                        String nodeNetwork = event.subject().id().toString().split(":")[1];
                         tenantInfo.forEach(
                                 (tenantId, clients) -> {
-                                    Optional<DefaultTenant> defaultTenant = getTenant(tenantId);
-                                    if (defaultTenant.isPresent()) {
-                                        DefaultTenant tenant = defaultTenant.get();
-                                        if (tenant.fpcTopology().dpns() != null) {
-                                            tenant.fpcTopology().dpns().forEach(dpn -> {
-                                                        if (dpn.networkId().equals(s[1]) && dpn.nodeId().equals(s[0]) &&
-                                                                dpnInfo.containsKey(dpn.dpnId())) {
-                                                            DefaultYangAutoPrefixNotify notify = new DefaultYangAutoPrefixNotify();
-                                                            notify.notificationId(NotificationId.of(notificationIds.getNewId()));
+                                    try {
+                                        FpcDpnId fpcDpnId = CacheManager.getInstance(tenantId).nodeNetworkCache.get(nodeNetwork).get();
 
-                                                            notify.timestamp(BigInteger.valueOf(System.currentTimeMillis()));
-                                                            DefaultDpnAvailability availability = new DefaultDpnAvailability();
-                                                            availability.availabilityMessageType("Dpn-Availability");
-                                                            availability.dpnId(dpn.dpnId());
-                                                            availability.dpnGroups(dpn.dpnGroups());
-                                                            availability.controlProtocol(dpn.controlProtocol());
-                                                            availability.networkId(dpn.networkId());
-                                                            availability.nodeId(dpn.nodeId());
-                                                            availability.dpnName(dpn.dpnName());
-                                                            availability.dpnStatus(DpnStatusEnum.UNAVAILABLE);
+                                        if (dpnInfo.contains(fpcDpnId)) {
+                                            DefaultDpns dpn = CacheManager.getInstance(tenantId).dpnsCache.get(fpcDpnId).get();
 
-                                                            notify.value(availability);
+                                            DefaultYangAutoPrefixNotify notify = new DefaultYangAutoPrefixNotify();
+                                            notify.notificationId(NotificationId.of(notificationIds.getNewId()));
 
-                                                            clients.forEach(client -> sendNotification(notify, client));
-                                                            dpnInfo.remove(dpn.dpnId());
-                                                        }
-                                                    }
-                                            );
+                                            notify.timestamp(BigInteger.valueOf(System.currentTimeMillis()));
+                                            DefaultDpnAvailability availability = new DefaultDpnAvailability();
+                                            availability.availabilityMessageType("Dpn-Availability");
+                                            availability.dpnId(dpn.dpnId());
+                                            availability.dpnGroups(dpn.dpnGroups());
+                                            availability.controlProtocol(dpn.controlProtocol());
+                                            availability.networkId(dpn.networkId());
+                                            availability.nodeId(dpn.nodeId());
+                                            availability.dpnName(dpn.dpnName());
+                                            availability.dpnStatus(DpnStatusEnum.UNAVAILABLE);
+
+                                            notify.value(availability);
+
+                                            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/util/CacheManager.java b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java
index 1b0bae3..efac596 100644
--- a/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java
+++ b/apps/fpcagent/src/main/java/org/onosproject/fpcagent/util/CacheManager.java
@@ -20,9 +20,11 @@
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.Maps;
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.DefaultTenant;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpcmobility.DefaultContexts;
 import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpctopology.DefaultDpns;
+import org.onosproject.yang.gen.v1.ietfdmmfpcagent.rev20160803.ietfdmmfpcagent.tenants.tenant.fpctopology.Dpns;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcContextId;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcDpnId;
 import org.onosproject.yang.gen.v1.ietfdmmfpcbase.rev20160803.ietfdmmfpcbase.FpcIdentity;
@@ -44,6 +46,7 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
     public LoadingCache<FpcContextId, Optional<DefaultContexts>> contextsCache;
     public LoadingCache<FpcDpnId, Optional<DefaultDpns>> dpnsCache;
+    public LoadingCache<String, Optional<FpcDpnId>> nodeNetworkCache;
 
     private CacheManager(FpcIdentity identity) {
         contextsCache = CacheBuilder.newBuilder()
@@ -101,6 +104,32 @@
                             }
                         }
                 );
+
+        nodeNetworkCache = CacheBuilder.newBuilder()
+                .maximumSize(100)
+                .build(
+                        new CacheLoader<String, Optional<FpcDpnId>>() {
+                            @Override
+                            public Optional<FpcDpnId> load(String s) throws Exception {
+                                try {
+                                    Optional<DefaultTenant> defaultTenant = getTenant(identity);
+                                    if (defaultTenant.isPresent()) {
+                                        DefaultTenant tenant = defaultTenant.get();
+                                        log.debug("tenant {}", tenant);
+                                        if (tenant.fpcTopology().dpns() != null) {
+                                            return tenant.fpcTopology().dpns().stream()
+                                                    .filter(dpns -> s.equals(dpns.nodeId()+"/"+dpns.networkId()))
+                                                    .findFirst()
+                                                    .map(Dpns::dpnId);
+                                        }
+                                    }
+                                } catch (Exception e) {
+                                    log.error(ExceptionUtils.getFullStackTrace(e));
+                                }
+                                return Optional.empty();
+                            }
+                        }
+                );
     }
 
     public static CacheManager getInstance(FpcIdentity identity) {
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 25c0312..9de92c8 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
@@ -109,7 +109,7 @@
 
         notification = ResourceId.builder()
                 .addBranchPointSchema("/", null)
-                .addBranchPointSchema("notify", "urn:onos:params:xml:ns:yang:fpcagent")
+                .addBranchPointSchema("notify", "urn:ietf:params:xml:ns:yang:fpcagent")
                 .build();
     }
 
