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 bca4bd5..e32d7c1 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/IcmpHandler.java
@@ -150,6 +150,8 @@
                         byte[] destIp = destinationAddress.getBytes();
                         for (IPv4 ipPacket : srManager.getIpPacketFromQueue(destIp)) {
                             if (ipPacket != null && !inSameSubnet(sw, ipPacket)) {
+                                ipPacket.setTtl((byte)(ipPacket.getTtl()-1));
+                                ipPacket.setChecksum((short)0);
                                 Ethernet eth = new Ethernet();
                                 eth.setDestinationMACAddress(destinationMacAddress);
                                 eth.setSourceMACAddress(sw
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 34c5046..a3c52fe 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -13,7 +13,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -96,11 +95,11 @@
     private HashMap<Switch, ECMPShortestPathGraph> graphs;
     //private HashSet<LinkData> topologyLinks;
     private ConcurrentLinkedQueue<TopologyEvents> topologyEventQueue;
-    private ConcurrentMap<Dpid, TopologyEvents> topologyEventMap;
 
     private int numOfEvents = 0;
     private int numOfEventProcess = 0;
     private int numOfPopulation = 0;
+    private long matchActionId = 0L;
 
     @Override
     public Collection<Class<? extends IFloodlightService>> getModuleServices() {
@@ -148,6 +147,7 @@
         this.packetService = context.getServiceImpl(IPacketService.class);
         packetService.registerPacketListener(this);
 
+
     }
 
     @Override
@@ -272,54 +272,36 @@
         Collection<PortData> portEntriesAdded = new ArrayList<PortData>();
         Collection<PortData> portEntriesRemoved = new ArrayList<PortData>();
         Collection<LinkData> linkEntriesRemoved = new ArrayList<LinkData>();
+        Collection<SwitchData> switchAdded = new ArrayList<SwitchData>();
         Collection<SwitchData> switchRemoved = new ArrayList<SwitchData>();
         Collection<MastershipData> mastershipRemoved = new ArrayList<MastershipData>();
 
         while (!topologyEventQueue.isEmpty()) {
             TopologyEvents topologyEvents = topologyEventQueue.poll();
 
-            if (linkEntriesAdded == null)
-                linkEntriesAdded = topologyEvents.getAddedLinkDataEntries();
-            else
-                linkEntriesAdded.addAll(topologyEvents.getAddedLinkDataEntries());
-
-            if (portEntriesAdded == null)
-                portEntriesAdded = topologyEvents.getAddedPortDataEntries();
-            else
-                portEntriesAdded.addAll(topologyEvents.getAddedPortDataEntries());
-
-            if (portEntriesRemoved == null)
-                portEntriesRemoved = topologyEvents.getRemovedPortDataEntries();
-            else
-                portEntriesRemoved.addAll(topologyEvents.getRemovedPortDataEntries());
-
-            if (linkEntriesRemoved == null)
-                linkEntriesRemoved = topologyEvents.getRemovedLinkDataEntries();
-            else
-                linkEntriesRemoved.addAll(topologyEvents.getRemovedLinkDataEntries());
-
-            if (switchRemoved == null)
-                switchRemoved = topologyEvents.getRemovedSwitchDataEntries();
-            else
-                switchRemoved.addAll(topologyEvents.getRemovedSwitchDataEntries());
-
-            if (mastershipRemoved == null)
-                mastershipRemoved = topologyEvents.getRemovedMastershipDataEntries();
-            else
-                mastershipRemoved.addAll(topologyEvents.getRemovedMastershipDataEntries());
-
+            linkEntriesAdded.addAll(topologyEvents.getAddedLinkDataEntries());
+            portEntriesAdded.addAll(topologyEvents.getAddedPortDataEntries());
+            portEntriesRemoved.addAll(topologyEvents.getRemovedPortDataEntries());
+            linkEntriesRemoved.addAll(topologyEvents.getRemovedLinkDataEntries());
+            switchAdded.addAll(topologyEvents.getAddedSwitchDataEntries());
+            switchRemoved.addAll(topologyEvents.getRemovedSwitchDataEntries());
+            mastershipRemoved.addAll(topologyEvents.getRemovedMastershipDataEntries());
             numOfEvents++;
         }
 
-
+        // TODO: We handle multiple events with one path re-computation
         if (!linkEntriesAdded.isEmpty()) {
             processLinkAdd(linkEntriesAdded);
         }
 
-        if (portEntriesAdded != null) {
+        if (!portEntriesAdded.isEmpty()) {
             processPortAdd(portEntriesAdded);
         }
 
+        if (!switchAdded.isEmpty()) {
+            processSwitchAdd(switchAdded);
+        }
+
         if (!portEntriesRemoved.isEmpty()) {
             processPortRemoval(portEntriesRemoved);
         }
@@ -342,6 +324,17 @@
     }
 
     /**
+     * Process the SwitchAdded events from topologyMananger.
+     * It does nothing. When a switch is added, then link will be added too.
+     * LinkAdded event will handle process all re-computation.
+     *
+     * @param switchAdded
+     */
+    private void processSwitchAdd(Collection<SwitchData> switchAdded) {
+
+    }
+
+    /**
      * Remove all ports connected to the switch removed
      *
      * @param mastershipRemoved master switch info removed
@@ -385,12 +378,12 @@
     }
 
     /**
-     * Report ports newly added to driver
+     * Report ports added to driver
      *
      * @param portEntries
      */
     private void processPortAdd(Collection<PortData> portEntries) {
-        // TODO: do we need to add ports slowly?
+        // TODO: do we need to add ports with delay?
         for (PortData port : portEntries) {
             Dpid dpid = port.getDpid();
 
@@ -411,9 +404,9 @@
 
         //boolean linkRecovered = false;
 
-        // TODO: How to determine this link was broken before and back now
-        // If so, we need to ad the link slowly...
-        // Or, just add any new or restored link slowly ???
+        // TODO: How to determine this link was broken before and back now?
+        // We should go stateless as possible.
+        // If the link broken is up, we need to add the link with delay.
         for (LinkData link : linkEntries) {
 
             SwitchPort srcPort = link.getSrc();
@@ -475,6 +468,7 @@
             Switch srcSwitch = mutableTopology.getSwitch(srcPort.getDpid());
             if (srcSwitch.getLinkToNeighbor(dstPort.getDpid()) == null) {
                 // TODO: it is only for debugging purpose.
+                // We just need to call populateEcmpRoutingRules() and return;
                 recomputationRequired = true;
                 log.debug("All links are gone b/w {} and {}", srcPort.getDpid(),
                         dstPort.getDpid());
@@ -507,6 +501,7 @@
     /**
      * Populate routing rules walking through the ECMP shortest paths
      *
+     * @param modified if true, it "modifies" the rules
      */
     private void populateEcmpRoutingRules(boolean modified) {
         graphs.clear();
@@ -524,6 +519,14 @@
         numOfPopulation++;
     }
 
+    /**
+     * populate routing rules to forward packets from the switch given to
+     * all other switches.
+     *
+     * @param sw source switch
+     * @param ecmpSPG shortest path from the the source switch to all others
+     * @param modified modification flag
+     */
     private void populateEcmpRoutingRulesForPath(Switch sw,
             ECMPShortestPathGraph ecmpSPG, boolean modified) {
 
@@ -574,10 +577,10 @@
     }
 
 
-    /*
+    /**
      * This class is used only for link recovery optimization in
      * modifyEcmpRoutingRules() function.
-     * TODO: please remove if optimization is not used at all
+     * TODO: please remove if the optimization is not used at all
      */
     private class SwitchPair {
         private Switch src;
@@ -636,12 +639,11 @@
         for (SwitchPair pair: linksToRecompute) {
 
             log.debug("Recompute path from {} to {}", pair.getSource(), pair.getDestination());
-            // TODO : we need the following function
+            // We need the following function for optimization
             //ECMPShortestPathGraph ecmpSPG =
             //     new ECMPShortestPathGraph(pair.getSource(), pair.getDestination());
             ECMPShortestPathGraph ecmpSPG =
                     new ECMPShortestPathGraph(pair.getSource());
-            // TODO: we need to use different function to MODIFY the rules
             populateEcmpRoutingRulesForPath(pair.getSource(), ecmpSPG, true);
         }
     }
@@ -659,7 +661,6 @@
             // TODO: need to check if this is a bidirectional or
             // unidirectional
             for (LinkData link: ppp) {
-                //if (link.equals(linkRemoved))
                 if (link.getDst().getDpid().equals(linkRemoved.getDst().getDpid()) &&
                         link.getSrc().getDpid().equals(linkRemoved.getSrc().getDpid()))
                     return true;
@@ -683,8 +684,8 @@
      * @param destSw Final destination switches
      * @param fwdToSw next hop switches
      */
-    private void setRoutingRule(Switch targetSw, String destSw, List<String> fwdToSw,
-            boolean modified) {
+    private void setRoutingRule(Switch targetSw, String destSw,
+            List<String> fwdToSw, boolean modified) {
 
         if (fwdToSw.isEmpty()) {
             fwdToSw.add(destSw);
@@ -759,8 +760,7 @@
     }
 
     /**
-     * Check if the switch is the edge router or not If any subnet information
-     * is defined in the config file, the we assume it is an edge router
+     * Check if the switch is the edge router or not.
      *
      * @param dpid Dpid of the switch to check
      * @return true if it is an edge router, otherwise false
@@ -847,11 +847,11 @@
 
         for (String fwdSw : fwdToSws) {
             groupAction.addSwitch(new Dpid(fwdSw));
+
         }
         actions.add(groupAction);
 
-        // TODO: Mactch Action Id should be set correctly
-        MatchAction matchAction = new MatchAction(new MatchActionId(0),
+        MatchAction matchAction = new MatchAction(new MatchActionId(matchActionId++),
                 new SwitchPort((long) 0, (short) 0), ipMatch, actions);
 
         Operator operator = null;
@@ -866,7 +866,6 @@
         IOF13Switch sw13 = (IOF13Switch) floodlightProvider.getMasterSwitch(
                 getSwId(sw.getDpid().toString()));
 
-        /* TODO: we should check the SWICH REMOVED events */
         if (sw13 != null) {
             try {
                 //printMatchActionOperationEntry(sw, maEntry);
@@ -941,7 +940,7 @@
             groupAction.addSwitch(new Dpid(fwdSw));
         actions.add(groupAction);
 
-        MatchAction matchAction = new MatchAction(new MatchActionId(0),
+        MatchAction matchAction = new MatchAction(new MatchActionId(matchActionId++),
                 new SwitchPort((long) 0, (short) 0), mplsMatch, actions);
 
         Operator operator = null;
