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 5895a8e..87b9cd4 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/GenericIpHandler.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/GenericIpHandler.java
@@ -1,36 +1,32 @@
 package net.onrc.onos.apps.segmentrouting;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
 import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.IOF13Switch;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
+import net.onrc.onos.core.matchaction.MatchAction;
+import net.onrc.onos.core.matchaction.MatchActionOperationEntry;
+import net.onrc.onos.core.matchaction.MatchActionOperations.Operator;
+import net.onrc.onos.core.matchaction.action.Action;
+import net.onrc.onos.core.matchaction.action.OutputAction;
+import net.onrc.onos.core.matchaction.action.SetDAAction;
+import net.onrc.onos.core.matchaction.action.SetSAAction;
+import net.onrc.onos.core.matchaction.match.Ipv4Match;
 import net.onrc.onos.core.packet.Ethernet;
 import net.onrc.onos.core.packet.IPv4;
 import net.onrc.onos.core.topology.ITopologyService;
 import net.onrc.onos.core.topology.MutableTopology;
 import net.onrc.onos.core.topology.Port;
 import net.onrc.onos.core.topology.Switch;
+import net.onrc.onos.core.util.SwitchPort;
 
-import org.projectfloodlight.openflow.protocol.OFFactory;
-import org.projectfloodlight.openflow.protocol.OFMatchV3;
-import org.projectfloodlight.openflow.protocol.OFMessage;
-import org.projectfloodlight.openflow.protocol.OFOxmList;
-import org.projectfloodlight.openflow.protocol.action.OFAction;
-import org.projectfloodlight.openflow.protocol.instruction.OFInstruction;
-import org.projectfloodlight.openflow.protocol.oxm.OFOxmEthDst;
-import org.projectfloodlight.openflow.protocol.oxm.OFOxmEthSrc;
-import org.projectfloodlight.openflow.protocol.oxm.OFOxmEthType;
-import org.projectfloodlight.openflow.protocol.oxm.OFOxmIpv4DstMasked;
-import org.projectfloodlight.openflow.types.EthType;
 import org.projectfloodlight.openflow.types.IPv4Address;
 import org.projectfloodlight.openflow.types.MacAddress;
-import org.projectfloodlight.openflow.types.OFBufferId;
-import org.projectfloodlight.openflow.types.OFPort;
-import org.projectfloodlight.openflow.types.TableId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -97,12 +93,66 @@
         return true;
     }
 
+
+
+    /**
+     */
+    public void addRouteToHost(Switch sw, int destinationAddress,
+            byte[] destinationMacAddress) {
+
+        // If we do not know the host, then we cannot set the forwarding rule
+        net.onrc.onos.core.topology.Host host = mutableTopology.getHostByMac(MACAddress
+                .valueOf(destinationMacAddress));
+        if (host == null) {
+            return;
+        }
+
+        IPv4Address destIpAddress = IPv4Address.of(destinationAddress);
+        Ipv4Match ipMatch = new Ipv4Match(destIpAddress.toString()+"/32");
+        List<Action> actions = new ArrayList<>();
+
+        MacAddress destMacAddress = MacAddress.of(destinationMacAddress);
+        SetDAAction setDAAction = new SetDAAction(destMacAddress);
+
+        String routerMacAddress = sw.getStringAttribute("routerMac");
+        MacAddress srcMacAddress = MacAddress.of(routerMacAddress);
+        SetSAAction setSAAction = new SetSAAction(srcMacAddress);
+
+        actions.add(setDAAction);
+        actions.add(setSAAction);
+
+        for (Port port : host.getAttachmentPoints()) {
+            OutputAction outputAction = new OutputAction(port.getPortNumber());
+            actions.add(outputAction);
+        }
+
+        MatchAction matchAction = new MatchAction(srManager.getMatchActionId(),
+                new SwitchPort((long) 0, (short) 0), ipMatch, actions);
+
+        net.onrc.onos.core.matchaction.MatchActionOperations.Operator operator =  Operator.ADD;
+
+        MatchActionOperationEntry maEntry =
+                new MatchActionOperationEntry(operator, matchAction);
+
+        IOF13Switch sw13 = (IOF13Switch) floodlightProvider.getMasterSwitch(
+                sw.getDpid().value());
+
+        if (sw13 != null) {
+            try {
+                sw13.pushFlow(maEntry);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+    }
+
+
     /**
      * Add routing rules to forward packets to known hosts
-     * 
+     *
      * @param sw Switch
      * @param hostIp Host IP address to forwards packets to
-     */
     public void addRouteToHost(Switch sw, int destinationAddress,
             byte[] destinationMacAddress) {
 
@@ -122,9 +172,13 @@
                 .ipv4DstMasked(
                         IPv4Address.of(destinationAddress),
                         IPv4Address.NO_MASK); // host addr should be /32
+
+
         OFOxmList oxmListSlash32 = OFOxmList.of(ethTypeIp, ipPrefix);
         OFMatchV3 match = factory.buildMatchV3()
                 .setOxmList(oxmListSlash32).build();
+
+
         OFAction setDmac = null;
         OFOxmEthDst dmac = factory.oxms()
                 .ethDst(MacAddress.of(destinationMacAddress));
@@ -144,26 +198,6 @@
         actionList.add(decTtl);
         actionList.add(setSA);
 
-        /* TODO : need to check the config file for all packets
-        String subnets = sw.getStringAttribute("subnets");
-        try {
-            JSONArray arry = new JSONArray(subnets);
-            for (int i = 0; i < arry.length(); i++) {
-                String subnetIp = (String) arry.getJSONObject(i).get("subnetIp");
-                int portNo = (int) arry.getJSONObject(i).get("portNo");
-
-                if (netMatch(subnetIp, IPv4Address.of(hostIp.getDestinationAddress()).toString())) {
-                    OFAction out = factory.actions().buildOutput()
-                            .setPort(OFPort.of(portNo)).build();
-                    actionList.add(out);
-                }
-            }
-        } catch (JSONException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-        */
-
         // Set output port
         for (Port port : host.getAttachmentPoints()) {
             OFAction out = factory.actions().buildOutput()
@@ -194,5 +228,6 @@
         flowPusher.add(sw.getDpid(), myIpEntry);
 
     }
+    */
 
 }
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 675a492..7f12a1a 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java
@@ -14,6 +14,7 @@
 import net.floodlightcontroller.core.IFloodlightProviderService;
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
+import net.onrc.onos.core.drivermanager.OFSwitchImplDellOSR;
 import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.core.packet.Ethernet;
 import net.onrc.onos.core.packet.ICMP;
@@ -39,6 +40,7 @@
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmVlanVid;
 import org.projectfloodlight.openflow.types.EthType;
 import org.projectfloodlight.openflow.types.IPv4Address;
+import org.projectfloodlight.openflow.types.MacAddress;
 import org.projectfloodlight.openflow.types.OFBufferId;
 import org.projectfloodlight.openflow.types.OFPort;
 import org.projectfloodlight.openflow.types.OFVlanVidMatch;
@@ -300,6 +302,22 @@
                     actions.add(pushlabel);
                     actions.add(setlabelid);
                     actions.add(copyTtlOut);
+
+                    //If the next hop is the DELL switch, then we need to set
+                    // MPLS MAC as the destination MAC
+                    IOFSwitch sw13 = this.floodlightProvider.getMasterSwitch(
+                            sw.getDpid().value());
+                    if (sw13 == null) {
+                        log.debug("Failed to get the IOFSwitch object for {}", sw);
+                        return;
+                    }
+                    if (sw13 instanceof OFSwitchImplDellOSR) {
+                        MacAddress mplsDstMac =
+                                MacAddress.of(packet.getDestinationMAC().toLong()+1);
+                        OFAction setDAAction = factory.actions().setDlDst(mplsDstMac);
+                        actions.add(setDAAction);
+                    }
+
                 }
             }
 
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 10324ff..591ff52 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -1861,6 +1861,9 @@
         return mutableTopology.getSwitch(new Dpid(dpid));
     }
 
+    public MatchActionId getMatchActionId() {
+        return new MatchActionId(matchActionId++);
+    }
 
     // ************************************
     // Test functions
