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 93e5352..e825203 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -112,6 +112,7 @@
     private ConcurrentLinkedQueue<TopologyEvents> topologyEventQueue;
     private HashMap<String, PolicyInfo> policyTable;
     private HashMap<String, TunnelInfo> tunnelTable;
+    private HashMap<Integer, List<Integer>> adjacencyIdTable;
 
     private int testMode = 0;
 
@@ -185,6 +186,7 @@
         restApi = context.getServiceImpl(IRestApiService.class);
         policyTable = new HashMap<String, PolicyInfo>();
         tunnelTable = new HashMap<String, TunnelInfo>();
+        adjacencyIdTable = new HashMap<Integer, List<Integer>>();
 
         packetService.registerPacketListener(this);
         topologyService.addListener(this, false);
@@ -219,7 +221,7 @@
         });
 
         testMode = POLICY_ADD1;
-        testTask.reschedule(20, TimeUnit.SECONDS);
+        //testTask.reschedule(20, TimeUnit.SECONDS);
     }
 
     @Override
@@ -579,23 +581,40 @@
         numOfPopulation++;
     }
 
+    /**
+     * populate the MPLS rules to handle Adjacency IDs
+     *
+     * @param sw  Switch
+     * @throws JSONException
+     */
     private void populateAdjacencyncyRule(Switch sw) throws JSONException {
         String adjInfo = sw.getStringAttribute("adjacencySids");
+        String nodeSidStr = sw.getStringAttribute("nodeSid");
         String srcMac = sw.getStringAttribute("routerMac");
-        if (adjInfo == null || srcMac == null)
+        String autoAdjInfo = sw.getStringAttribute("autogenAdjSids");
+
+        if (adjInfo == null || srcMac == null || nodeSidStr == null)
             return;
 
         JSONArray arry = new JSONArray(adjInfo);
         for (int i = 0; i < arry.length(); i++) {
-            Object a = arry.getJSONObject(i);
+            //Object a = arry.getJSONObject(i);
             Integer adjId = (Integer) arry.getJSONObject(i).get("adjSid");
-            Integer portNo = (Integer) arry.getJSONObject(i).get("portNo");
-            if (adjId == null || portNo == null)
+            JSONArray portNos = (JSONArray) arry.getJSONObject(i).get("ports");
+            if (adjId == null || portNos == null)
                 continue;
 
+            List<Integer> portNoList = new ArrayList<Integer>();
+            for (int j = 0; j < portNos.length(); j++) {
+                portNoList.add(Integer.valueOf(portNos.getInt(0)));
+            }
+
+            adjacencyIdTable.put(Integer.parseInt(nodeSidStr), portNoList);
+
+            /*
             Dpid dstDpid = null;
             for (Link link: sw.getOutgoingLinks()) {
-                if (link.getSrcPort().getPortNumber().value() == portNo) {
+                if (link.getSrcPort().getPortNumber().value() == portNos[1]) {
                     dstDpid = link.getDstPort().getDpid();
                     break;
                 }
@@ -616,11 +635,21 @@
 
             setAdjRule(sw, adjId, srcMac, dstMac, portNo, true); // BoS = 1
             setAdjRule(sw, adjId, srcMac, dstMac, portNo, false); // BoS = 0
+            */
         }
 
     }
 
-
+    /**
+     * Push the MPLS rule for Adjacency ID
+     *
+     * @param sw  Switch to push the rule
+     * @param id  Adjacency ID
+     * @param srcMac  source MAC address
+     * @param dstMac  destination MAC address
+     * @param portNo  port number assigned to the ID
+     * @param bos  BoS option
+     */
     private void setAdjRule(Switch sw, int id, String srcMac, String dstMac, int portNo,
             boolean bos) {
 
@@ -669,7 +698,6 @@
         }
     }
 
-
     /**
      * populate routing rules to forward packets from the switch given to
      * all other switches.
@@ -929,6 +957,8 @@
      * If the next hop is not the destination, just forward packets to next
      * hops using Group action.
      *
+     * TODO: refactoring required
+     *
      * @param sw Switch to set the rules
      * @param mplsLabel destination MPLS label
      * @param fwdSws next hop switches
@@ -943,6 +973,7 @@
                 new ArrayList<MatchActionOperationEntry>();
         String fwdSw1 = fwdSws.get(0);
 
+        //If the next hop is the destination router
         if (fwdSws.size() == 1 && mplsLabel.equals(getMplsLabel(fwdSw1))) {
             // One rule for Bos = 1
             MplsMatch mplsMatch = new MplsMatch(Integer.parseInt(mplsLabel), true);
@@ -984,7 +1015,9 @@
                     new MatchActionOperationEntry(operator, matchActionBos);
             maEntries.add(maEntryBos);
         }
+        // If the next hop is NOT the destination router
         else {
+            // BoS = 0
             MplsMatch mplsMatch = new MplsMatch(Integer.parseInt(mplsLabel), false);
             List<Action> actions = new ArrayList<Action>();
 
@@ -1060,7 +1093,7 @@
             this.tunnelId = tid;
             this.type = type;
         }
-        
+
         public PolicyInfo(String pid, PacketMatch match, int priority,
                 String tid) {
             this.policyId = pid;
@@ -1156,7 +1189,7 @@
     public Collection<TunnelInfo> getTunnelTable() {
         return this.tunnelTable.values();
     }
-    
+
     public Collection<PolicyInfo> getPoclicyTable() {
         return this.policyTable.values();
     }
