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 a0253a8..16f0ca2 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -277,6 +277,11 @@
         Collection<MastershipData> mastershipRemoved = new ArrayList<MastershipData>();
 
         while (!topologyEventQueue.isEmpty()) {
+            // We should handle the events in the order of when they happen
+            // TODO: We need to simulate the final results of multiple events
+            // and shoot only the final state.
+            // Ex: link s1-s2 down, link s1-s2 up --> Do nothing
+            // Ex: ink s1-s2 up, s1-p1,p2 down --> link s1-s2 down
             TopologyEvents topologyEvents = topologyEventQueue.poll();
 
             linkEntriesAdded.addAll(topologyEvents.getAddedLinkDataEntries());
@@ -287,40 +292,36 @@
             switchRemoved.addAll(topologyEvents.getRemovedSwitchDataEntries());
             mastershipRemoved.addAll(topologyEvents.getRemovedMastershipDataEntries());
             numOfEvents++;
+
+            if (!portEntriesRemoved.isEmpty()) {
+                processPortRemoval(portEntriesRemoved);
+            }
+
+            if (!linkEntriesRemoved.isEmpty()) {
+                processLinkRemoval(linkEntriesRemoved);
+            }
+
+            if (!switchRemoved.isEmpty()) {
+                processSwitchRemoved(switchRemoved);
+            }
+
+            if (!mastershipRemoved.isEmpty()) {
+                processMastershipRemoved(mastershipRemoved);
+            }
+
+            if (!linkEntriesAdded.isEmpty()) {
+                processLinkAdd(linkEntriesAdded);
+            }
+
+            if (!portEntriesAdded.isEmpty()) {
+                processPortAdd(portEntriesAdded);
+            }
+
+            if (!switchAdded.isEmpty()) {
+                processSwitchAdd(switchAdded);
+            }
         }
 
-        // TODO: We handle multiple events with one path re-computation
-
-
-        if (!portEntriesRemoved.isEmpty()) {
-            processPortRemoval(portEntriesRemoved);
-        }
-
-        if (!linkEntriesRemoved.isEmpty()) {
-            processLinkRemoval(linkEntriesRemoved);
-        }
-
-        if (!switchRemoved.isEmpty()) {
-            processSwitchRemoved(switchRemoved);
-        }
-
-        if (!mastershipRemoved.isEmpty()) {
-            processMastershipRemoved(mastershipRemoved);
-        }
-
-        if (!linkEntriesAdded.isEmpty()) {
-            processLinkAdd(linkEntriesAdded);
-        }
-
-        if (!portEntriesAdded.isEmpty()) {
-            processPortAdd(portEntriesAdded);
-        }
-
-        if (!switchAdded.isEmpty()) {
-            processSwitchAdd(switchAdded);
-        }
-
-
         log.debug("num events {}, num of process {}, "
                 + "num of Population {}", numOfEvents, numOfEventProcess,
                 numOfPopulation);
@@ -350,10 +351,10 @@
                 Port dstPort = link.getDstPort();
                 IOF13Switch dstSw = (IOF13Switch) floodlightProvider.getMasterSwitch(
                         getSwId(dstPort.getDpid().toString()));
-                // TODO: please enable it when driver feature is implemented
-                //dstSw.removePortFromGroups(dstPort.getNumber());
-                log.debug("MasterSwitch {} is gone: remove port {}", sw.getDpid(), dstPort);
-
+                if (dstSw != null) {
+                    dstSw.removePortFromGroups(dstPort.getNumber());
+                    log.debug("MasterSwitch {} is gone: remove port {}", sw.getDpid(), dstPort);
+                }
             }
         }
     }
@@ -472,7 +473,6 @@
                 continue;
             srcSw.removePortFromGroups(srcPort.getPortNumber());
             dstSw.removePortFromGroups(dstPort.getPortNumber());
-
             log.debug("Remove port {} from switch {}", srcPort, srcSw);
             log.debug("Remove port {} from switch {}", dstPort, dstSw);
 
@@ -522,9 +522,6 @@
             //log.debug("ECMPShortestPathGraph is computed for switch {}",
             //        HexString.toHexString(sw.getDpid().value()));
             populateEcmpRoutingRulesForPath(sw, ecmpSPG, modified);
-            if (modified) {
-                log.debug("Modify the rules for {}" , sw.getDpid());
-            }
         }
         numOfPopulation++;
     }
@@ -915,74 +912,99 @@
     }
 
     /**
-     * Set MPLS forwarding rules to MPLS table - If the destination is the same
-     * as the next hop to forward packets then, pop the MPLS label according to
-     * PHP rule - Otherwise, just forward packets to next hops using Group
-     * action
+     * Set MPLS forwarding rules to MPLS table
+     * </p>
+     * If the destination is the same as the next hop to forward packets then,
+     * pop the MPLS label according to PHP rule. Here, if BoS is set, then
+     * copy TTL In and decrement NW TTL. Otherwise, it just decrement the MPLS
+     * TTL of the another MPLS header.
+     * If the next hop is not the destination, just forward packets to next
+     * hops using Group action.
      *
      * @param sw Switch to set the rules
      * @param mplsLabel destination MPLS label
      * @param fwdSws next hop switches
-     */
+     * */
     private void setMplsTable(Switch sw, String mplsLabel, List<String> fwdSws,
             boolean modified) {
 
-        MplsMatch mplsMatch = new MplsMatch(Integer.parseInt(mplsLabel));
+        if (fwdSws.isEmpty())
+            return;
 
-        List<Action> actions = new ArrayList<Action>();
+        Collection<MatchActionOperationEntry> maEntries =
+                new ArrayList<MatchActionOperationEntry>();
+        String fwdSw1 = fwdSws.get(0);
 
-        // If the destination is the same as the next hop, then pop MPLS
-        // Otherwise, just decrease the MPLS TTL.
-        if (fwdSws.size() == 1) {
-            String fwdMplsId = getMplsLabel(fwdSws.get(0));
-            if (fwdMplsId.equals(mplsLabel)) {
-                String fwdSw = fwdSws.get(0);
-                if (mplsLabel.equals(getMplsLabel(fwdSw))) {
-                    PopMplsAction popAction = new PopMplsAction(EthType.IPv4);
-                    CopyTtlInAction copyTtlInAction = new CopyTtlInAction();
-                    DecNwTtlAction decNwTtlAction = new DecNwTtlAction(1);
+        if (fwdSws.size() == 1 && mplsLabel.equals(getMplsLabel(fwdSw1))) {
+            // One rule for Bos = 1
+            MplsMatch mplsMatch = new MplsMatch(Integer.parseInt(mplsLabel), true);
+            List<Action> actions = new ArrayList<Action>();
 
-                    actions.add(copyTtlInAction);
-                    actions.add(popAction);
-                    actions.add(decNwTtlAction);
-                }
-            }
-            else {
-                DecMplsTtlAction decMplsTtlAction = new DecMplsTtlAction(1);
-                actions.add(decMplsTtlAction);
-            }
+            PopMplsAction popAction = new PopMplsAction(EthType.IPv4);
+            CopyTtlInAction copyTtlInAction = new CopyTtlInAction();
+            DecNwTtlAction decNwTtlAction = new DecNwTtlAction(1);
+
+            actions.add(copyTtlInAction);
+            actions.add(popAction);
+            actions.add(decNwTtlAction);
+
+            GroupAction groupAction = new GroupAction();
+            groupAction.addSwitch(new Dpid(fwdSw1));
+            actions.add(groupAction);
+
+            MatchAction matchAction = new MatchAction(new MatchActionId(matchActionId++),
+                    new SwitchPort((long) 0, (short) 0), mplsMatch, actions);
+            Operator operator = Operator.ADD;
+            MatchActionOperationEntry maEntry =
+                    new MatchActionOperationEntry(operator, matchAction);
+            maEntries.add(maEntry);
+
+            // One rule for Bos = 0
+            MplsMatch mplsMatchBos = new MplsMatch(Integer.parseInt(mplsLabel), false);
+            List<Action> actionsBos = new ArrayList<Action>();
+            actionsBos.add(popAction);
+            actionsBos.add(groupAction);
+
+            MatchAction matchActionBos = new MatchAction(new MatchActionId(matchActionId++),
+                    new SwitchPort((long) 0, (short) 0), mplsMatchBos, actionsBos);
+            MatchActionOperationEntry maEntryBos =
+                    new MatchActionOperationEntry(operator, matchActionBos);
+            maEntries.add(maEntryBos);
         }
-        GroupAction groupAction = new GroupAction();
-        for (String fwdSw : fwdSws)
-            groupAction.addSwitch(new Dpid(fwdSw));
-        actions.add(groupAction);
+        else {
+            MplsMatch mplsMatch = new MplsMatch(Integer.parseInt(mplsLabel), false);
+            List<Action> actions = new ArrayList<Action>();
 
-        MatchAction matchAction = new MatchAction(new MatchActionId(matchActionId++),
-                new SwitchPort((long) 0, (short) 0), mplsMatch, actions);
+            DecMplsTtlAction decMplsTtlAction = new DecMplsTtlAction(1);
+            actions.add(decMplsTtlAction);
 
-        Operator operator = null;
-        if (modified)
-            operator =  Operator.MODIFY;
-        else
-            operator = Operator.ADD;
+            GroupAction groupAction = new GroupAction();
+            for (String fwdSw : fwdSws)
+                groupAction.addSwitch(new Dpid(fwdSw));
+            actions.add(groupAction);
 
-        MatchActionOperationEntry maEntry =
-                new MatchActionOperationEntry(operator, matchAction);
-
+            MatchAction matchAction = new MatchAction(new MatchActionId(
+                    matchActionId++),
+                    new SwitchPort((long) 0, (short) 0), mplsMatch, actions);
+            Operator operator = Operator.ADD;
+            MatchActionOperationEntry maEntry =
+                    new MatchActionOperationEntry(operator, matchAction);
+            maEntries.add(maEntry);
+        }
         IOF13Switch sw13 = (IOF13Switch) floodlightProvider.getMasterSwitch(
                 getSwId(sw.getDpid().toString()));
 
         if (sw13 != null) {
             try {
                 //printMatchActionOperationEntry(sw, maEntry);
-                sw13.pushFlow(maEntry);
+                sw13.pushFlows(maEntries);
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
-
     }
 
+
     /**
      * Debugging function to print out the Match Action Entry
      *
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 f2a65a7..6ed35b4 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplCPqD13.java
@@ -1262,9 +1262,9 @@
                 .ethType(EthType.MPLS_UNICAST);
         OFOxmMplsLabel labelid = factory.oxms()
                 .mplsLabel(U32.of(mplsm.getMplsLabel()));
-        // OFOxmMplsBos bos = factory.oxms()
-        // .mplsBos(OFBooleanValue.of(mplsm.isBos()));
-        OFOxmList oxmList = OFOxmList.of(ethTypeMpls, labelid); // XXX add bos
+        OFOxmMplsBos bos = factory.oxms()
+                .mplsBos(OFBooleanValue.of(mplsm.isBos()));
+        OFOxmList oxmList = OFOxmList.of(ethTypeMpls, labelid, bos);
         OFMatchV3 matchlabel = factory.buildMatchV3()
                 .setOxmList(oxmList).build();
 
diff --git a/src/main/java/net/onrc/onos/core/matchaction/match/MplsMatch.java b/src/main/java/net/onrc/onos/core/matchaction/match/MplsMatch.java
index c0cf410..96d65f9 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/match/MplsMatch.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/match/MplsMatch.java
@@ -3,13 +3,19 @@
 public class MplsMatch implements Match {
 
     private final int mplsLabel;
+    private final boolean bos;
 
-    public MplsMatch(int label) {
+    public MplsMatch(int label, boolean bos) {
         this.mplsLabel = label;
+        this.bos = bos;
     }
 
     public int getMplsLabel() {
         return mplsLabel;
     }
 
+    public boolean isBos() {
+        return this.bos;
+    }
+
 }
