diff --git a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplDellOSR.java b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplDellOSR.java
index 6c12643..6426a6f 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplDellOSR.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplDellOSR.java
@@ -9,7 +9,19 @@
  */
 public class OFSwitchImplDellOSR extends OFSwitchImplSpringOpenTTP {
 
+    /* Table IDs to be used for Dell Open Segment Routers*/
+    private static final int DELL_TABLE_VLAN = 10;
+    private static final int DELL_TABLE_TMAC = 20;
+    private static final int DELL_TABLE_IPv4_UNICAST = 30;
+    private static final int DELL_TABLE_MPLS = 25;
+    private static final int DELL_TABLE_ACL = 40;
+
     public OFSwitchImplDellOSR(OFDescStatsReply desc, boolean usePipeline13) {
         super(desc, usePipeline13);
+        setVlanTableId(DELL_TABLE_VLAN);
+        setTmacTableId(DELL_TABLE_TMAC);
+        setIpv4UnicastTableId(DELL_TABLE_IPv4_UNICAST);
+        setMplsTableId(DELL_TABLE_MPLS);
+        setAclTableId(DELL_TABLE_ACL);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplSpringOpenTTP.java b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplSpringOpenTTP.java
index 287d4fa..fe9d8e9 100644
--- a/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplSpringOpenTTP.java
+++ b/src/main/java/net/onrc/onos/core/drivermanager/OFSwitchImplSpringOpenTTP.java
@@ -153,6 +153,15 @@
     private AtomicInteger groupid;
     private Map<String, String> publishAttributes;
 
+    /* Set the default values. These variables will get
+     * overwritten based on the switch vendor type
+     */
+    private int vlanTableId = TABLE_VLAN;
+    private int tmacTableId = TABLE_TMAC;
+    private int ipv4UnicastTableId = TABLE_IPv4_UNICAST;
+    private int mplsTableId = TABLE_MPLS;
+    private int aclTableId = TABLE_ACL;
+
     public OFSwitchImplSpringOpenTTP(OFDescStatsReply desc, boolean usePipeline13) {
         super();
         haltStateMachine = new AtomicBoolean(false);
@@ -508,13 +517,13 @@
 
     void setTableMissEntries() throws IOException {
         // set all table-miss-entries
-        populateTableMissEntry(TABLE_VLAN, true, false, false, -1);
-        populateTableMissEntry(TABLE_TMAC, true, false, false, -1);
-        populateTableMissEntry(TABLE_IPv4_UNICAST, false, true, true,
-                TABLE_ACL);
-        populateTableMissEntry(TABLE_MPLS, false, true, true,
-                TABLE_ACL);
-        populateTableMissEntry(TABLE_ACL, false, false, false, -1);
+        populateTableMissEntry(vlanTableId, true, false, false, -1);
+        populateTableMissEntry(tmacTableId, true, false, false, -1);
+        populateTableMissEntry(ipv4UnicastTableId, false, true, true,
+                aclTableId);
+        populateTableMissEntry(mplsTableId, false, true, true,
+                aclTableId);
+        populateTableMissEntry(aclTableId, false, false, false, -1);
     }
 
     private void sendHandshakeBarrier() throws IOException {
@@ -654,12 +663,12 @@
                         .setActions(actionlist).build();*/
 
                 OFInstruction gotoTbl = factory.instructions().buildGotoTable()
-                        .setTableId(TableId.of(TABLE_TMAC)).build();
+                        .setTableId(TableId.of(tmacTableId)).build();
                 List<OFInstruction> instructions = new ArrayList<OFInstruction>();
                 // instructions.add(appAction);
                 instructions.add(gotoTbl);
                 OFMessage flowEntry = factory.buildFlowAdd()
-                        .setTableId(TableId.of(TABLE_VLAN))
+                        .setTableId(TableId.of(vlanTableId))
                         .setMatch(match)
                         .setInstructions(instructions)
                         .setPriority(1000) // does not matter - all rules
@@ -684,10 +693,10 @@
         OFMatchV3 matchIp = factory.buildMatchV3()
                 .setOxmList(oxmListIp).build();
         OFInstruction gotoTblIp = factory.instructions().buildGotoTable()
-                .setTableId(TableId.of(TABLE_IPv4_UNICAST)).build();
+                .setTableId(TableId.of(ipv4UnicastTableId)).build();
         List<OFInstruction> instructionsIp = Collections.singletonList(gotoTblIp);
         OFMessage ipEntry = factory.buildFlowAdd()
-                .setTableId(TableId.of(TABLE_TMAC))
+                .setTableId(TableId.of(tmacTableId))
                 .setMatch(matchIp)
                 .setInstructions(instructionsIp)
                 .setPriority(1000) // strict priority required lower than
@@ -704,10 +713,10 @@
         OFMatchV3 matchMpls = factory.buildMatchV3()
                 .setOxmList(oxmListMpls).build();
         OFInstruction gotoTblMpls = factory.instructions().buildGotoTable()
-                .setTableId(TableId.of(TABLE_MPLS)).build();
+                .setTableId(TableId.of(mplsTableId)).build();
         List<OFInstruction> instructionsMpls = Collections.singletonList(gotoTblMpls);
         OFMessage mplsEntry = factory.buildFlowAdd()
-                .setTableId(TableId.of(TABLE_TMAC))
+                .setTableId(TableId.of(tmacTableId))
                 .setMatch(matchMpls)
                 .setInstructions(instructionsMpls)
                 .setPriority(1001) // strict priority required lower than
@@ -1342,7 +1351,7 @@
         OFInstruction writeInstr = factory.instructions().buildWriteActions()
                 .setActions(writeActions).build();
         OFInstruction gotoInstr = factory.instructions().buildGotoTable()
-                .setTableId(TableId.of(TABLE_ACL)).build();
+                .setTableId(TableId.of(aclTableId)).build();
         List<OFInstruction> instructions = new ArrayList<OFInstruction>();
         instructions.add(writeInstr);
         instructions.add(gotoInstr);
@@ -1370,7 +1379,7 @@
             return null;
         }
         OFMessage ipFlow = fmBuilder
-                .setTableId(TableId.of(TABLE_IPv4_UNICAST))
+                .setTableId(TableId.of(ipv4UnicastTableId))
                 .setMatch(match)
                 .setInstructions(instructions)
                 .setPriority(priority)
@@ -1415,7 +1424,7 @@
         OFInstruction writeInstr = factory.instructions().buildWriteActions()
                 .setActions(writeActions).build();
         OFInstruction gotoInstr = factory.instructions().buildGotoTable()
-                .setTableId(TableId.of(TABLE_ACL)).build();
+                .setTableId(TableId.of(aclTableId)).build();
         List<OFInstruction> instructions = new ArrayList<OFInstruction>();
         instructions.add(writeInstr);
         instructions.add(gotoInstr);
@@ -1438,7 +1447,7 @@
         }
 
         OFMessage mplsFlow = fmBuilder
-                .setTableId(TableId.of(TABLE_MPLS))
+                .setTableId(TableId.of(mplsTableId))
                 .setMatch(matchlabel)
                 .setInstructions(instructions)
                 .setPriority(MAX_PRIORITY) // exact match and exclusive
@@ -1541,7 +1550,7 @@
         }
 
         OFMessage aclFlow = fmBuilder
-                .setTableId(TableId.of(TABLE_ACL))
+                .setTableId(TableId.of(aclTableId))
                 .setMatch(matchBuilder.build())
                 .setInstructions(instructions)
                 .setPriority(ma.getPriority()) // exact match and exclusive
@@ -1609,13 +1618,13 @@
     public TableId getTableId(String tableType) {
         tableType = tableType.toLowerCase();
         if (tableType.contentEquals("ip")) {
-            return TableId.of(OFSwitchImplSpringOpenTTP.TABLE_IPv4_UNICAST);
+            return TableId.of(ipv4UnicastTableId);
         }
         else if (tableType.contentEquals("mpls")) {
-            return TableId.of(OFSwitchImplSpringOpenTTP.TABLE_MPLS);
+            return TableId.of(mplsTableId);
         }
         else if (tableType.contentEquals("acl")) {
-            return TableId.of(OFSwitchImplSpringOpenTTP.TABLE_ACL);
+            return TableId.of(aclTableId);
         }
         else {
             log.warn("Invalid tableType: {}", tableType);
@@ -2054,7 +2063,7 @@
             OFFlowMod.Builder fmBuilder = factory.buildFlowAdd();
 
             OFMessage aclFlow = fmBuilder
-                    .setTableId(TableId.of(TABLE_ACL))
+                    .setTableId(TableId.of(aclTableId))
                     .setMatch(matchBuilder.build())
                     .setInstructions(instructions)
                     .setPriority(10) // TODO: wrong - should be MA
@@ -2075,6 +2084,43 @@
         }
     }
 
+    protected int getVlanTableId() {
+        return vlanTableId;
+    }
 
+    protected void setVlanTableId(int vlanTableId) {
+        this.vlanTableId = vlanTableId;
+    }
 
+    protected int getTmacTableId() {
+        return tmacTableId;
+    }
+
+    protected void setTmacTableId(int tmacTableId) {
+        this.tmacTableId = tmacTableId;
+    }
+
+    protected int getIpv4UnicastTableId() {
+        return ipv4UnicastTableId;
+    }
+
+    protected void setIpv4UnicastTableId(int ipv4UnicastTableId) {
+        this.ipv4UnicastTableId = ipv4UnicastTableId;
+    }
+
+    protected int getMplsTableId() {
+        return mplsTableId;
+    }
+
+    protected void setMplsTableId(int mplsTableId) {
+        this.mplsTableId = mplsTableId;
+    }
+
+    protected int getAclTableId() {
+        return aclTableId;
+    }
+
+    protected void setAclTableId(int aclTableId) {
+        this.aclTableId = aclTableId;
+    }
 }
