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 8f52964..fca1dfb 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -105,6 +105,9 @@
     private ConcurrentLinkedQueue<TopologyEvents> topologyEventQueue;
     private HashMap<Integer, HashMap<String, PolicyRouteInfo>> stitchInfo;
     private HashMap<Integer, HashMap<String, Integer>> tunnelGroupMap;
+    private HashMap<Integer, HashMap<PacketMatch, Integer>> policyMap;
+
+    private int testMode = 0;
 
     private int numOfEvents = 0;
     private int numOfEventProcess = 0;
@@ -113,6 +116,9 @@
     private final int DELAY_TO_ADD_LINK = 10;
     private final int MAX_NUM_LABELS = 3;
 
+    private final int POLICY_ADD = 1;
+    private final int POLICY_REMOVE = 2;
+
     @Override
     public Collection<Class<? extends IFloodlightService>> getModuleServices() {
         // TODO Auto-generated method stub
@@ -158,6 +164,7 @@
         stitchInfo = new HashMap<Integer, HashMap<String, PolicyRouteInfo>>();
         packetService = context.getServiceImpl(IPacketService.class);
         tunnelGroupMap = new HashMap<Integer, HashMap<String, Integer>>();
+        policyMap = new HashMap<Integer, HashMap<PacketMatch, Integer>>();
 
         packetService.registerPacketListener(this);
         topologyService.addListener(this, false);
@@ -190,11 +197,11 @@
             }
         });
 
-        // policy routing test task
-        //testTask.reschedule(20, TimeUnit.SECONDS);
+        //policy routing test task
+        testMode = POLICY_ADD;
+        testTask.reschedule(20, TimeUnit.SECONDS);
     }
 
-
     @Override
     public void receive(Switch sw, Port inPort, Ethernet payload) {
         if (payload.getEtherType() == Ethernet.TYPE_ARP)
@@ -674,7 +681,6 @@
 
     }
 
-
     /**
      * This class is used only for link recovery optimization in
      * modifyEcmpRoutingRules() function.
@@ -1152,46 +1158,45 @@
         return true;
     }
 
+    public void removeTunnel(int tunnelId) {
+
+    }
+
     /**
      * Set policy table for policy routing
      *
      * @param sw
      * @param mplsLabel
      */
-    public void setPolicyTable(MACAddress srcMac, MACAddress dstMac,
+    public void setPolicyTable(int pid, MACAddress srcMac, MACAddress dstMac,
             Short etherType, IPv4Net srcIp, IPv4Net dstIp, Byte ipProto,
             Short srcTcpPort, Short dstTcpPort, int tid) {
 
         HashMap<String, PolicyRouteInfo> routeInfo = stitchInfo.get(Integer.valueOf(tid));
         HashMap<String, Integer> switchGroupPair = tunnelGroupMap.get(Integer.valueOf(tid));
+        HashMap<PacketMatch, Integer> policyInfo = new HashMap<PacketMatch, Integer>();
+
+        PacketMatchBuilder packetBuilder = new PacketMatchBuilder();
+
+        if (srcMac != null)
+            packetBuilder.setSrcMac(srcMac);
+        if (dstMac != null)
+            packetBuilder.setDstMac(dstMac);
+        if (etherType != null)
+            packetBuilder.setEtherType(etherType);
+        if (srcIp != null)
+            packetBuilder.setSrcIp(srcIp.address(), srcIp.prefixLen());
+        if (dstIp != null)
+            packetBuilder.setDstIp(dstIp.address(), dstIp.prefixLen());
+        if (ipProto != null)
+            packetBuilder.setIpProto(ipProto);
+        if (srcTcpPort > 0)
+            packetBuilder.setSrcTcpPort(srcTcpPort);
+        if (dstTcpPort > 0)
+            packetBuilder.setDstTcpPort(dstTcpPort);
+        PacketMatch packetMatch = packetBuilder.build();
+
         for (String srcDpid: routeInfo.keySet()) {
-
-            PacketMatchBuilder packetBuilder = new PacketMatchBuilder();
-
-            if (srcMac != null)
-                packetBuilder.setSrcMac(srcMac);
-            if (dstMac != null)
-                packetBuilder.setDstMac(dstMac);
-            if (etherType != null) {
-                packetBuilder.setEtherType(etherType);
-            }
-            if (srcIp != null) {
-                packetBuilder.setSrcIp(srcIp.address(), srcIp.prefixLen());
-            }
-            if (dstIp != null) {
-                packetBuilder.setDstIp(dstIp.address(), dstIp.prefixLen());
-            }
-            if (ipProto != null) {
-                packetBuilder.setIpProto(ipProto);
-            }
-            if (srcTcpPort > 0) {
-                packetBuilder.setSrcTcpPort(srcTcpPort);
-            }
-            if (dstTcpPort > 0) {
-                packetBuilder.setDstTcpPort(dstTcpPort);
-            }
-            PacketMatch policyMatch = packetBuilder.build();
-
             List<Action> actions = new ArrayList<>();
             GroupAction groupAction = new GroupAction();
             int gropuId = switchGroupPair.get(srcDpid);
@@ -1200,7 +1205,7 @@
 
             MatchAction matchAction = new MatchAction(new MatchActionId(
                     matchActionId++),
-                    new SwitchPort((long) 0, (short) 0), policyMatch, actions);
+                    new SwitchPort((long) 0, (short) 0), packetMatch, actions);
             MatchActionOperationEntry maEntry =
                     new MatchActionOperationEntry(Operator.ADD, matchAction);
 
@@ -1213,9 +1218,65 @@
                     sw13.pushFlow(maEntry);
                 } catch (IOException e) {
                     e.printStackTrace();
+                    log.debug("Policy was not set due to pushFlow() error");
                 }
             }
         }
+        policyInfo.put(packetMatch, Integer.valueOf(tid));
+        policyMap.put(Integer.valueOf(pid), policyInfo);
+    }
+
+    /**
+     * Remove all policies applied to specific tunnel.
+     *
+     * @param srcMac
+     * @param dstMac
+     * @param etherType
+     * @param srcIp
+     * @param dstIp
+     * @param ipProto
+     * @param srcTcpPort
+     * @param dstTcpPort
+     * @param tid
+     */
+    public void removePolicy(int pid) {
+
+        HashMap<PacketMatch, Integer> policyInfo =  policyMap.get(Integer.valueOf(pid));
+        PacketMatch policyMatch = (PacketMatch) policyInfo.keySet().toArray()[0];
+        int tid = policyInfo.get(policyMatch).intValue();
+
+        List<Action> actions = new ArrayList<>();
+        int gropuId = 0; // dummy group ID
+        GroupAction groupAction = new GroupAction();
+        groupAction.setGroupId(gropuId);
+        actions.add(groupAction);
+
+        MatchAction matchAction = new MatchAction(new MatchActionId(
+                matchActionId++),
+                new SwitchPort((long) 0, (short) 0), policyMatch, actions);
+        MatchActionOperationEntry maEntry =
+                new MatchActionOperationEntry(Operator.REMOVE, matchAction);
+
+        HashMap<String, Integer> groupInfo = tunnelGroupMap.get(
+                Integer.valueOf(tid));
+
+        for (String dpid: groupInfo.keySet()) {
+            IOF13Switch sw13 = (IOF13Switch) floodlightProvider.getMasterSwitch(
+                    getSwId(dpid));
+
+            if (sw13 != null) {
+                printMatchActionOperationEntry(sw13, maEntry);
+                try {
+                    sw13.pushFlow(maEntry);
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    log.debug("policy remove failed due to pushFlow() exception");
+                    return;
+                }
+            }
+        }
+
+        log.debug("Policy {} is removed.", pid);
     }
 
     /**
@@ -1300,19 +1361,29 @@
 
     private void runTest() {
 
-        String[] routeArray = {"101", "102", "103", "104", "105", "108", "110"};
-        List<String> routeList = new ArrayList<String>();
-        for (int i = 0; i < routeArray.length; i++)
-            routeList.add(routeArray[i]);
+        if (testMode == POLICY_ADD) {
+            String[] routeArray = {"101", "102", "103", "104", "105", "108",
+                    "110"};
+            List<String> routeList = new ArrayList<String>();
+            for (int i = 0; i < routeArray.length; i++)
+                routeList.add(routeArray[i]);
 
-        if (createTunnel(1, routeList)) {
-            IPv4Net srcIp = new IPv4Net("10.0.1.1/24");
-            IPv4Net dstIp = new IPv4Net("10.1.2.1/24");
+            if (createTunnel(1, routeList)) {
+                IPv4Net srcIp = new IPv4Net("10.0.1.1/24");
+                IPv4Net dstIp = new IPv4Net("10.1.2.1/24");
 
-            this.setPolicyTable(null, null, Ethernet.TYPE_IPV4, srcIp, dstIp, IPv4.PROTOCOL_ICMP, (short)-1, (short)-1, 1);
+                this.setPolicyTable(1, null, null, Ethernet.TYPE_IPV4, srcIp,
+                        dstIp, IPv4.PROTOCOL_ICMP, (short)-1, (short)-1, 1);
+
+                testMode = POLICY_REMOVE;
+                testTask.reschedule(10, TimeUnit.SECONDS);
+            }
+            else {
+                testTask.reschedule(5, TimeUnit.SECONDS);
+            }
         }
-        else {
-            testTask.reschedule(5, TimeUnit.SECONDS);
+        else if (testMode == POLICY_REMOVE) {
+            this.removePolicy(1);
         }
     }
 
@@ -1386,7 +1457,9 @@
 
     }
 
-
+    /**
+     * Strore policy routing info
+     */
     class PolicyRouteInfo {
 
         String srcSwDpid;
@@ -1427,7 +1500,6 @@
         }
     }
 
-
     /**
      *
      *
@@ -1545,8 +1617,6 @@
 
     }
 
-
-
     /**
      * Debugging function to print out the Match Action Entry
      * @param sw13
