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 fe4e6e3..20f05e1 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/ArpHandler.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/ArpHandler.java
@@ -16,8 +16,6 @@
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.api.packet.IPacketListener;
-import net.onrc.onos.api.packet.IPacketService;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.core.packet.ARP;
 import net.onrc.onos.core.packet.Ethernet;
@@ -48,13 +46,12 @@
  * hosts to the controllers.
  * TODO: need to check the network config file for all hosts and packets
  */
-public class ArpHandler implements IPacketListener  {
+public class ArpHandler {
 
     private static final Logger log = LoggerFactory
             .getLogger(ArpHandler.class);
 
     private IFloodlightProviderService floodlightProvider;
-    private IPacketService packetService;
     private IFlowPusherService flowPusher;
     private ITopologyService topologyService;
     private MutableTopology mutableTopology;
@@ -84,45 +81,31 @@
     public ArpHandler(FloodlightModuleContext context, SegmentRoutingManager segmentRoutingManager) {
 
         this.floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
-        this.packetService = context.getServiceImpl(IPacketService.class);
         this.flowPusher = context.getServiceImpl(IFlowPusherService.class);
         this.topologyService = context.getServiceImpl(ITopologyService.class);
         this.srManager = segmentRoutingManager;
         this.mutableTopology = topologyService.getTopology();
 
-        packetService.registerPacketListener(this);
-        //arpEntries = new ArrayList<ArpEntry>();
-
         Log.debug("Arp Handler is initialized");
 
     }
 
-    @Override
-    public void receive(Switch sw, Port inPort, Ethernet payload) {
-        log.debug("Received a packet {} from sw {} ", payload.toString(), sw.getDpid());
+    public void processPacketIn(Switch sw, Port inPort, Ethernet payload){
 
-        if (payload.getEtherType() == Ethernet.TYPE_ARP) {
+    	log.debug("ArpHandler: Received a ARP packet from sw {} ", sw.getDpid());
 
-            ARP arp = (ARP)payload.getPayload();
-            srManager.updateArpCache(arp);
+        ARP arp = (ARP)payload.getPayload();
 
-            if (arp.getOpCode() == ARP.OP_REQUEST) {
-                handleArpRequest(sw, inPort, arp);
-            }
-            else {
-                byte[] senderMacAddressByte = arp.getSenderHardwareAddress();
-                String targetMacAddressStr = MacAddress.of(senderMacAddressByte).toString();
-                if (targetMacAddressStr.equals(sw.getStringAttribute("routerMac"))) {
-                    IPv4Address hostIpAddress = IPv4Address.of(arp.getSenderProtocolAddress());
-                    srManager.addRouteToHost(sw,hostIpAddress.getInt(), senderMacAddressByte);
-                }
-            }
-
+        if (arp.getOpCode() == ARP.OP_REQUEST) {
+        	log.debug("ArpHandler: Received a ARP Requestfrom sw {} ", sw.getDpid());
+            handleArpRequest(sw, inPort, payload);
         }
-
+        byte[] senderMacAddressByte = arp.getSenderHardwareAddress();
+        IPv4Address hostIpAddress = IPv4Address.of(arp.getSenderProtocolAddress());
+    	log.debug("ArpHandler: Add IP route to Host {} ", hostIpAddress);
+        srManager.addRouteToHost(sw,hostIpAddress.getInt(), senderMacAddressByte);
     }
 
-
     /**
      * Send an ARP response for the ARP request to the known switches
      *
@@ -130,8 +113,9 @@
      * @param inPort port to send ARP response to
      * @param arpRequest ARP request packet to handle
      */
-    private void handleArpRequest(Switch sw, Port inPort, ARP arpRequest) {
+    private void handleArpRequest(Switch sw, Port inPort, Ethernet payload) {
 
+    	ARP arpRequest = (ARP)payload.getPayload();
         List<String> subnetGatewayIPs = getSubnetGatewayIps(sw);
         String switchMacAddressStr = sw.getStringAttribute("routerMac");
         if (!subnetGatewayIPs.isEmpty()) {
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/GenericIpHandler.java b/src/main/java/net/onrc/onos/apps/segmentrouting/GenericIpHandler.java
index e04ae85..0784144 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/GenericIpHandler.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/GenericIpHandler.java
@@ -7,8 +7,6 @@
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.api.packet.IPacketListener;
-import net.onrc.onos.api.packet.IPacketService;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.core.packet.Ethernet;
 import net.onrc.onos.core.packet.IPv4;
@@ -36,13 +34,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class GenericIpHandler implements IPacketListener {
+public class GenericIpHandler {
 
     private MutableTopology mutableTopology;
     private ITopologyService topologyService;
     private IFloodlightProviderService floodlightProvider;
     private IFlowPusherService flowPusher;
-    private IPacketService packetService;
     private SegmentRoutingManager srManager;
 
     private static final Logger log = LoggerFactory
@@ -66,38 +63,30 @@
         this.topologyService = context.getServiceImpl(ITopologyService.class);
         this.mutableTopology = topologyService.getTopology();
         this.flowPusher = context.getServiceImpl(IFlowPusherService.class);
-        this.packetService = context.getServiceImpl(IPacketService.class);
         this.srManager = sr;
 
-        packetService.registerPacketListener(this);
-
     }
 
-    @Override
-    public void receive(Switch sw, Port inPort, Ethernet payload) {
+    public void processPacketIn(Switch sw, Port inPort, Ethernet payload) {
         // TODO Auto-generated method stub
-        if ((payload.getEtherType() == Ethernet.TYPE_IPV4) &&
-            (((IPv4)payload.getPayload()).getProtocol() != IPv4.PROTOCOL_ICMP)){
+        log.debug("GenericIPHandler: Received a IP packet {} from sw {} ",
+                payload.toString(), sw.getDpid());
+        IPv4 ipv4 = (IPv4)payload.getPayload();
+        int destinationAddress = ipv4.getDestinationAddress();
 
-            log.debug("GenericIPHandler: Received a IP packet {} from sw {} ",
-                    payload.toString(), sw.getDpid());
-            IPv4 ipv4 = (IPv4)payload.getPayload();
-            int destinationAddress = ipv4.getDestinationAddress();
-
-            // Check if the destination is any host known to TopologyService
-            for (net.onrc.onos.core.topology.Host host: mutableTopology.getHosts()) {
-                IPv4Address hostIpAddress = IPv4Address.of(host.getIpAddress());
-                if (hostIpAddress != null && hostIpAddress.getInt() == destinationAddress) {
-                    byte[] destinationMacAddress = host.getMacAddress().toBytes();
-                    addRouteToHost(sw, destinationAddress, destinationMacAddress);
-                    return;
-                }
+        // Check if the destination is any host known to TopologyService
+        for (net.onrc.onos.core.topology.Host host: mutableTopology.getHosts()) {
+            IPv4Address hostIpAddress = IPv4Address.of(host.getIpAddress());
+            if (hostIpAddress != null && hostIpAddress.getInt() == destinationAddress) {
+                byte[] destinationMacAddress = host.getMacAddress().toBytes();
+                addRouteToHost(sw, destinationAddress, destinationMacAddress);
+                return;
             }
+        }
 
-            // Check if the destination is within subnets of the swtich
-            if (isWithinSubnets(sw, IPv4Address.of(destinationAddress).toString())) {
-                srManager.sendArpRequest(sw, destinationAddress, inPort);
-            }
+        // Check if the destination is within subnets of the swtich
+        if (isWithinSubnets(sw, IPv4Address.of(destinationAddress).toString())) {
+            srManager.sendArpRequest(sw, destinationAddress, inPort);
         }
     }
 
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java b/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java
index b8bbc99..2f5576a 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java
@@ -6,8 +6,6 @@
 import net.floodlightcontroller.core.IFloodlightProviderService;
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
-import net.onrc.onos.api.packet.IPacketListener;
-import net.onrc.onos.api.packet.IPacketService;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.core.packet.Ethernet;
 import net.onrc.onos.core.packet.ICMP;
@@ -41,12 +39,11 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class IcmpHandler implements IPacketListener {
+public class IcmpHandler {
 
     private SegmentRoutingManager srManager;
     private IFloodlightProviderService floodlightProvider;
     private MutableTopology mutableTopology;
-    private IPacketService packetService;
     private ITopologyService topologyService;
     private static final Logger log = LoggerFactory
             .getLogger(IcmpHandler.class);
@@ -75,18 +72,13 @@
 
         this.floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
         this.flowPusher = context.getServiceImpl(IFlowPusherService.class);
-        this.packetService = context.getServiceImpl(IPacketService.class);
         this.topologyService = context.getServiceImpl(ITopologyService.class);
         this.mutableTopology = topologyService.getTopology();
 
         this.srManager = manager;
-
-        packetService.registerPacketListener(this);
-
     }
 
-    @Override
-    public void receive(Switch sw, Port inPort, Ethernet payload) {
+    public void processPacketIn(Switch sw, Port inPort, Ethernet payload) {
 
         if (payload.getEtherType() == Ethernet.TYPE_IPV4) {
 
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 eedc1c9..b51370f 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -15,11 +15,14 @@
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
 import net.floodlightcontroller.core.module.IFloodlightService;
+import net.onrc.onos.api.packet.IPacketListener;
 import net.onrc.onos.api.packet.IPacketService;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.core.intent.Path;
 import net.onrc.onos.core.main.config.IConfigInfoService;
 import net.onrc.onos.core.packet.ARP;
+import net.onrc.onos.core.packet.Ethernet;
+import net.onrc.onos.core.packet.IPv4;
 import net.onrc.onos.core.topology.ITopologyListener;
 import net.onrc.onos.core.topology.ITopologyService;
 import net.onrc.onos.core.topology.LinkData;
@@ -34,16 +37,19 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class SegmentRoutingManager implements IFloodlightModule, ITopologyListener {
+public class SegmentRoutingManager implements IFloodlightModule,
+						ITopologyListener, IPacketListener {
 
     private static final Logger log = LoggerFactory
             .getLogger(SegmentRoutingManager.class);
     private ITopologyService topologyService;
+    private IPacketService packetService;
     private MutableTopology mutableTopology;
 
     private List<ArpEntry> arpEntries;
     private ArpHandler arpHandler;
     private GenericIpHandler ipHandler;
+    private IcmpHandler icmpHandler;
 
     @Override
     public Collection<Class<? extends IFloodlightService>> getModuleServices() {
@@ -76,13 +82,15 @@
     public void init(FloodlightModuleContext context) throws FloodlightModuleException {
 
         arpHandler = new ArpHandler(context, this);
-        IcmpHandler icmpHandler = new IcmpHandler(context, this);
+        icmpHandler = new IcmpHandler(context, this);
         ipHandler = new GenericIpHandler(context, this);
         arpEntries = new ArrayList<ArpEntry>();
         topologyService = context.getServiceImpl(ITopologyService.class);
         mutableTopology = topologyService.getTopology();
         topologyService.addListener(this, false);
 
+        this.packetService = context.getServiceImpl(IPacketService.class);
+        packetService.registerPacketListener(this);
     }
 
     @Override
@@ -91,6 +99,17 @@
 
     }
 
+    @Override
+    public void receive(Switch sw, Port inPort, Ethernet payload) {
+    	if (payload.getEtherType() == Ethernet.TYPE_ARP)
+    		arpHandler.processPacketIn(sw, inPort, payload);
+        if (payload.getEtherType() == Ethernet.TYPE_IPV4) {
+        	if (((IPv4)payload.getPayload()).getProtocol() != IPv4.PROTOCOL_ICMP)
+        		icmpHandler.processPacketIn(sw, inPort, payload);
+        	else
+        		ipHandler.processPacketIn(sw, inPort, payload);
+        }
+    }
     /**
      * Update ARP Cache using ARP packets
      * It is used to set destination MAC address to forward packets to known hosts.
