diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/ArpHandler.java b/src/main/java/net/onrc/onos/apps/segmentrouting/ArpHandler.java
index b724e27..0a8c316 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/ArpHandler.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/ArpHandler.java
@@ -148,12 +148,13 @@
             targetMac = MACAddress.valueOf(switchMacAddressStr);
         	log.debug("ArpHandler: Received a ARP query for a sw {} ", sw.getDpid());
     	}
-
-    	Host knownHost = isArpReqForKnownHost(sw, arpRequest);
-    	if (knownHost != null) {
-            targetMac = knownHost.getMacAddress();
-        	log.debug("ArpHandler: Received a ARP query for a known host {} ",
-        						IPv4Address.of(knownHost.getIpAddress()));
+    	else {
+        	Host knownHost = isArpReqForKnownHost(sw, arpRequest);
+        	if (knownHost != null) {
+                targetMac = knownHost.getMacAddress();
+            	log.debug("ArpHandler: Received a ARP query for a known host {} ",
+            						IPv4Address.of(knownHost.getIpAddress()));
+        	}
     	}
 
     	if (targetMac != null) {
@@ -183,9 +184,11 @@
     		 * that subnets are connected to except the port from which
     		 * ARP request is received
     		 */
+    	    IPv4Address targetAddress =
+    	            IPv4Address.of(arpRequest.getTargetProtocolAddress());
         	log.debug("ArpHandler: Received a ARP query for unknown host {} ",
         			IPv4Address.of(arpRequest.getTargetProtocolAddress()));
-    		for (Integer portNo : getSwitchSubnetPorts(sw)) {
+    		for (Integer portNo : getSwitchSubnetPorts(sw, targetAddress)) {
     			if (portNo.shortValue() == inPort.getPortNumber().shortValue())
     				continue;
             	log.debug("ArpHandler: Sending ARP request on switch {} port {}",
@@ -265,15 +268,18 @@
         return gatewayIps;
     }
 
-    private HashSet<Integer> getSwitchSubnetPorts(Switch sw) {
+    private HashSet<Integer> getSwitchSubnetPorts(Switch sw, IPv4Address targetAddress) {
         HashSet<Integer> switchSubnetPorts = new HashSet<Integer>();
 
         String subnets = sw.getStringAttribute("subnets");
         try {
             JSONArray arry = new JSONArray(subnets);
             for (int i = 0; i < arry.length(); i++) {
-                Integer subnetPort = (Integer)arry.getJSONObject(i).get("portNo");
-                switchSubnetPorts.add(subnetPort);
+                String subnetIpSlash = (String) arry.getJSONObject(i).get("subnetIp");
+                if (srManager.netMatch(subnetIpSlash, targetAddress.toString())) {
+                    Integer subnetPort = (Integer)arry.getJSONObject(i).get("portNo");
+                    switchSubnetPorts.add(subnetPort);
+                }
             }
         } catch (JSONException e) {
             // TODO Auto-generated catch block
@@ -324,7 +330,7 @@
 		 * that subnets are connected to except the port from which
 		 * ARP request is received
 		 */
-		for (Integer portNo : getSwitchSubnetPorts(sw)) {
+		for (Integer portNo : getSwitchSubnetPorts(sw, targetAddress)) {
 			if (portNo.shortValue() == inPort.getPortNumber().shortValue())
 				continue;
         	log.debug("ArpHandler: Sending ARP request on switch {} port {}",
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
index 053ba8a..89ce633 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -237,9 +237,17 @@
      */
     public void topologyEvents(TopologyEvents topologyEvents)
     {
-        if (topologyEvents.getAddedLinkDataEntries() != null)
-        {
-            discoveryTask.reschedule(1, TimeUnit.SECONDS);
+
+        Collection<LinkData> linkEntriesAdded =
+                topologyEvents.getAddedLinkDataEntries();
+        if (!linkEntriesAdded.isEmpty()) {
+            processLinkAdd(linkEntriesAdded);
+        }
+
+        Collection<PortData> PortEntriesAdded =
+                topologyEvents.getAddedPortDataEntries();
+        if (linkEntriesAdded != null) {
+            processPortAdd(PortEntriesAdded);
         }
 
         Collection<PortData> portEntries =
@@ -248,14 +256,57 @@
             processPortRemoval(portEntries);
         }
 
-        Collection<LinkData> linkEntries =
+        Collection<LinkData> linkEntriesRemoved =
                 topologyEvents.getRemovedLinkDataEntries();
-        if (!linkEntries.isEmpty()) {
-            processLinkRemoval(linkEntries);
+        if (!linkEntriesRemoved.isEmpty()) {
+            processLinkRemoval(linkEntriesRemoved);
         }
     }
 
     /**
+     * Report ports newly added to driver
+     *
+     * @param portEntries
+     */
+    private void processPortAdd(Collection<PortData> portEntries) {
+        //TODO: do we need to add ports slowly?
+        for (PortData port: portEntries) {
+            Dpid dpid = port.getDpid();
+            int portNo = (int) port.getPortNumber().value();
+
+            IOF13Switch sw13 = (IOF13Switch)floodlightProvider.getMasterSwitch(
+                    getSwId(port.getDpid().toString()));
+            //sw13.addPort(portNo);
+            log.debug("Add port {} to switch {}", portNo, dpid.toString());
+        }
+    }
+
+    /**
+     * Reports ports of new links to driver and recalculate ECMP SPG
+     *
+     * @param linkEntries
+     */
+    private void processLinkAdd(Collection<LinkData> linkEntries) {
+
+        // TODO: How to determine this link was broken before and back now
+        // If so, we need to ad the link slowly...
+        // Or, just add any new or restored link slowly ???
+        for (LinkData link: linkEntries) {
+            SwitchPort srcPort = link.getSrc();
+            SwitchPort dstPort = link.getDst();
+
+            IOF13Switch sw13src = (IOF13Switch)floodlightProvider.getMasterSwitch(
+                    getSwId(srcPort.getDpid().toString()));
+            IOF13Switch sw13dst = (IOF13Switch)floodlightProvider.getMasterSwitch(
+                    getSwId(srcPort.getDpid().toString()));
+            //sw13src.addPort(srcPort);
+            //sw13dst.addPort(dstPort);
+
+        }
+        discoveryTask.reschedule(1, TimeUnit.SECONDS);
+    }
+
+    /**
      * Check if all links are gone b/w the two switches.
      * If all links are gone, then we need to recalculate the path.
      * Otherwise, just report link failure to the driver.
@@ -264,20 +315,27 @@
      */
     private void processLinkRemoval(Collection<LinkData> linkEntries) {
         for (LinkData link: linkEntries) {
-            Dpid srcSwDpid = link.getSrc().getDpid();
-            Dpid dstSwDpid = link.getDst().getDpid();
+            SwitchPort srcPort = link.getSrc();
+            SwitchPort dstPort = link.getDst();
 
-            Switch srcSwitch = mutableTopology.getSwitch(srcSwDpid);
-            if (srcSwitch.getLinkToNeighbor(dstSwDpid) == null) {
+            IOF13Switch sw13src = (IOF13Switch)floodlightProvider.getMasterSwitch(
+                    getSwId(srcPort.getDpid().toString()));
+            IOF13Switch sw13dst = (IOF13Switch)floodlightProvider.getMasterSwitch(
+                    getSwId(srcPort.getDpid().toString()));
+            //sw13src.addPort(srcPort);
+            //sw13dst.addPort(dstPort);
+
+            Switch srcSwitch = mutableTopology.getSwitch(srcPort.getDpid());
+            if (srcSwitch.getLinkToNeighbor(dstPort.getDpid()) == null) {
                 discoveryTask.reschedule(1, TimeUnit.SECONDS);
-                log.debug("All links are gone b/w {} and {}",srcSwDpid,
-                        dstSwDpid);
+                log.debug("All links are gone b/w {} and {}",srcPort.getDpid(),
+                        srcPort.getDpid());
             }
         }
     }
 
     /**
-     * report ports removed to the driver
+     * report ports removed to the driver immediately
      *
      * @param portEntries
      */
