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 961a913..5053163 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -54,6 +54,7 @@
 
 import org.json.JSONArray;
 import org.json.JSONException;
+import org.projectfloodlight.openflow.types.EthType;
 import org.projectfloodlight.openflow.types.IPv4Address;
 import org.projectfloodlight.openflow.util.HexString;
 import org.slf4j.Logger;
@@ -494,7 +495,7 @@
         if (fwdSws.size() == 1) {
             String fwdSw = fwdSws.get(0);
             if (mplsLabel.equals(getMplsLabel(fwdSw))) {
-                PopMplsAction popAction = new PopMplsAction();
+                PopMplsAction popAction = new PopMplsAction(EthType.IPv4);
                 CopyTtlInAction copyTtlInAction = new CopyTtlInAction();
 
                 actions.add(popAction);
diff --git a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
index d722da8..61c7de9 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
@@ -27,6 +27,7 @@
 import net.onrc.onos.core.configmanager.SegmentRouterConfig;
 import net.onrc.onos.core.matchaction.MatchAction;
 import net.onrc.onos.core.matchaction.MatchActionOperationEntry;
+import net.onrc.onos.core.matchaction.MatchActionOperations;
 import net.onrc.onos.core.matchaction.MatchActionOperations.Operator;
 import net.onrc.onos.core.matchaction.action.Action;
 import net.onrc.onos.core.matchaction.action.CopyTtlInAction;
@@ -823,17 +824,26 @@
                 ofAction = factory.actions().buildSetField()
                         .setField(lid).build();
             } else if (action instanceof PopMplsAction) {
-
+                EthType ethertype = ((PopMplsAction) action).getEthType();
+                ofAction = factory.actions().popMpls(ethertype);
             } else if (action instanceof GroupAction) {
-                ofAction = factory.actions().buildGroup()
-                        .setGroup(OFGroup.of(0)) // TODO fail
-                        .build();
+                NeighborSet ns = ((GroupAction) action).getDpids();
+                EcmpInfo ei = ecmpGroups.get(ns);
+                if (ei != null) {
+                    int gid = ei.groupId;
+                    ofAction = factory.actions().buildGroup()
+                            .setGroup(OFGroup.of(gid))
+                            .build();
+                } else {
+                    log.error("Unable to find ecmp group for neighbors {} at "
+                            + "switch {}", ns, getStringId());
+                }
             } else if (action instanceof DecNwTtlAction) {
-
+                ofAction = factory.actions().decNwTtl();
             } else if (action instanceof DecMplsTtlAction) {
-
+                ofAction = factory.actions().decMplsTtl();
             } else if (action instanceof CopyTtlInAction) {
-
+                ofAction = factory.actions().copyTtlIn();
             } else if (action instanceof CopyTtlOutAction) {
                 ofAction = factory.actions().copyTtlOut();
             } else {
@@ -861,20 +871,35 @@
             priority = MAX_PRIORITY;
         }
 
-        // set flow-mod XXX - This is only ADD (not doing DELETE yet)
-        OFMessage ipFlow = factory.buildFlowAdd()
-                .setTableId(TableId.of(TABLE_IPv4_UNICAST))
-                .setMatch(match)
-                .setInstructions(instructions)
-                .setPriority(priority)
-                .setBufferId(OFBufferId.NO_BUFFER)
-                .setIdleTimeout(0)
-                .setHardTimeout(0)
-                .setXid(getNextTransactionId())
-                .build();
-
+        // set flow-mod
+        OFMessage ipFlow = null;
+        if (op == MatchActionOperations.Operator.ADD) {
+            ipFlow = factory.buildFlowAdd()
+                    .setTableId(TableId.of(TABLE_IPv4_UNICAST))
+                    .setMatch(match)
+                    .setInstructions(instructions)
+                    .setPriority(priority)
+                    .setBufferId(OFBufferId.NO_BUFFER)
+                    .setIdleTimeout(0)
+                    .setHardTimeout(0)
+                    .setXid(getNextTransactionId())
+                    .build();
+        } else {
+            ipFlow = factory.buildFlowDeleteStrict()
+                    .setTableId(TableId.of(TABLE_IPv4_UNICAST))
+                    .setMatch(match)
+                    .setInstructions(instructions)
+                    .setPriority(priority)
+                    .setBufferId(OFBufferId.NO_BUFFER)
+                    .setIdleTimeout(0)
+                    .setHardTimeout(0)
+                    .setXid(getNextTransactionId())
+                    .build();
+        }
         write(ipFlow, null);
-        log.debug("Adding ip-rule {}-{} in sw {}", match, writeActions,
+        log.debug("{} ip-rule {}-{} in sw {}",
+                (op == MatchActionOperations.Operator.ADD) ? "Adding" : "Deleting",
+                match, writeActions,
                 getStringId());
     }
 
diff --git a/src/main/java/net/onrc/onos/core/matchaction/action/PopMplsAction.java b/src/main/java/net/onrc/onos/core/matchaction/action/PopMplsAction.java
index 8e59988..38f5617 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/action/PopMplsAction.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/action/PopMplsAction.java
@@ -1,8 +1,15 @@
 package net.onrc.onos.core.matchaction.action;
 
+import org.projectfloodlight.openflow.types.EthType;
+
 public class PopMplsAction implements Action {
+    private final EthType ethtype;
 
-    public PopMplsAction() {
+    public PopMplsAction(EthType ethtype) {
+        this.ethtype = ethtype;
+    }
 
+    public EthType getEthType() {
+        return ethtype;
     }
 }
