diff --git a/apps/dhcp/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java b/apps/dhcp/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java
index 24cb087..99cc731 100644
--- a/apps/dhcp/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java
+++ b/apps/dhcp/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java
@@ -86,7 +86,7 @@
     private static final ProviderId PID = new ProviderId("of", "org.onosproject.dhcp", true);
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private final NetworkConfigListener cfgListener = new InternalConfigListener();
+    private final InternalConfigListener cfgListener = new InternalConfigListener();
 
     private final Set<ConfigFactory> factories = ImmutableSet.of(
             new ConfigFactory<ApplicationId, DhcpConfig>(APP_SUBJECT_FACTORY,
@@ -163,8 +163,11 @@
 
         cfgService.addListener(cfgListener);
         factories.forEach(cfgService::registerConfigFactory);
+        cfgListener.reconfigureNetwork(cfgService.getConfig(appId, DhcpConfig.class));
+        cfgListener.reconfigureStore(cfgService.getConfig(appId, DhcpStoreConfig.class));
+
         hostProviderService = hostProviderRegistry.register(hostProvider);
-        packetService.addProcessor(processor, PacketProcessor.observer(1));
+        packetService.addProcessor(processor, PacketProcessor.director(1));
         requestPackets();
         log.info("Started");
     }
@@ -394,7 +397,7 @@
                 TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
                 ConnectPoint sourcePoint = context.inPacket().receivedFrom();
                 builder.setOutput(sourcePoint.port());
-
+                context.block();
                 packetService.emit(new DefaultOutboundPacket(sourcePoint.deviceId(),
                         builder.build(), ByteBuffer.wrap(reply.serialize())));
             }
@@ -407,7 +410,6 @@
          * @param dhcpPayload the extracted DHCP payload
          */
         private void processDHCPPacket(PacketContext context, DHCP dhcpPayload) {
-
             Ethernet packet = context.inPacket().parsed();
             boolean flagIfRequestedIP = false;
             boolean flagIfServerIP = false;
@@ -483,7 +485,6 @@
                         }
                     }
                 } else if (incomingPacketType == DHCPPacketType.DHCPRELEASE.getValue()) {
-
                     dhcpStore.releaseIP(clientMAC);
                 }
             }
@@ -540,7 +541,6 @@
 
         @Override
         public void process(PacketContext context) {
-
             Ethernet packet = context.inPacket().parsed();
             if (packet == null) {
                 return;
@@ -581,7 +581,9 @@
          * @param cfg configuration object
          */
         private void reconfigureNetwork(DhcpConfig cfg) {
-
+            if (cfg == null) {
+                return;
+            }
             if (cfg.ip() != null) {
                 myIP = cfg.ip();
             }
@@ -620,6 +622,9 @@
          * @param cfg configuration object
          */
         private void reconfigureStore(DhcpStoreConfig cfg) {
+            if (cfg == null) {
+                return;
+            }
 
             if (cfg.defaultTimeout() != null) {
                 dhcpStore.setDefaultTimeoutForPurge(Integer.valueOf(cfg.defaultTimeout()));
