diff --git a/src/test/subscriberMultiTable/__init__.py b/src/test/cordSubscriber/__init__.py
similarity index 100%
rename from src/test/subscriberMultiTable/__init__.py
rename to src/test/cordSubscriber/__init__.py
diff --git a/src/test/subscriberMultiTable/subscriberMultiTableTest.py b/src/test/cordSubscriber/cordSubscriberTest.py
similarity index 96%
rename from src/test/subscriberMultiTable/subscriberMultiTableTest.py
rename to src/test/cordSubscriber/cordSubscriberTest.py
index 75c9392..7f002df 100644
--- a/src/test/subscriberMultiTable/subscriberMultiTableTest.py
+++ b/src/test/cordSubscriber/cordSubscriberTest.py
@@ -19,7 +19,6 @@
 from threadPool import ThreadPool
 from portmaps import g_subscriber_port_map
 from OltConfig import *
-from OnosFlowCtrl import get_mac
 from CordTestServer import cord_test_onos_restart
 
 log.setLevel('INFO')
@@ -176,7 +175,7 @@
       table_app_file = os.path.join(test_path, '..', 'apps/ciena-cordigmp-multitable-2.0-SNAPSHOT.oar')
       app_file = os.path.join(test_path, '..', 'apps/ciena-cordigmp-2.0-SNAPSHOT.oar')
       onos_config_path = os.path.join(test_path, '..', 'setup/onos-config')
-      olt_conf_file = os.path.join(test_path, '..', 'setup/olt_config_multitable.json')
+      olt_conf_file = os.path.join(test_path, '..', 'setup/olt_config.json')
       cpqd_path = os.path.join(test_path, '..', 'setup')
       ovs_path = cpqd_path
       test_services = ('IGMP', 'TRAFFIC')
@@ -187,20 +186,8 @@
 
       @classmethod
       def load_device_id(cls):
-            '''If running under olt, we get the first switch connected to onos'''
-            olt = os.getenv('OLT_CONFIG', None)
-            if olt:
-                  devices = OnosCtrl.get_devices()
-                  if devices:
-                        dids = map(lambda d: d['id'], devices)
-                        if len(dids) == 1:
-                              did = dids[0]
-                        else:
-                              ###If we have more than 1, then check for env before using first one
-                              did = os.getenv('OLT_DEVICE_ID', dids[0])
-            else:
-                  did = 'of:' + get_mac('ovsbr0')
-
+            '''Configure the device id'''
+            did = OnosCtrl.get_device_id()
             #Set the default config
             cls.device_id = did
             cls.device_dict = { "devices" : {
@@ -230,7 +217,7 @@
           cls.install_app_table()
           cls.olt = OltConfig(olt_conf_file = cls.olt_conf_file)
           OnosCtrl.cord_olt_config(cls.olt.olt_device_data())
-          cls.port_map, cls.port_list = cls.olt.olt_port_map_multi()
+          cls.port_map, cls.port_list = cls.olt.olt_port_map()
           cls.activate_apps(cls.apps + cls.olt_apps)
 
       @classmethod
diff --git a/src/test/dhcp/dhcpTest.py b/src/test/dhcp/dhcpTest.py
index 8f14e65..38eb839 100644
--- a/src/test/dhcp/dhcpTest.py
+++ b/src/test/dhcp/dhcpTest.py
@@ -57,7 +57,7 @@
     @classmethod
     def setUpClass(cls):
         cls.olt = OltConfig()
-        cls.port_map = cls.olt.olt_port_map()
+        cls.port_map, _ = cls.olt.olt_port_map()
         if not cls.port_map:
             cls.port_map = g_subscriber_port_map
         cls.iface = cls.port_map[1]
diff --git a/src/test/dhcprelay/dhcprelayTest.py b/src/test/dhcprelay/dhcprelayTest.py
index 3b95586..769177b 100644
--- a/src/test/dhcprelay/dhcprelayTest.py
+++ b/src/test/dhcprelay/dhcprelayTest.py
@@ -21,8 +21,8 @@
 import time
 import os, sys
 from DHCP import DHCPTest
-from OnosCtrl import OnosCtrl
-from OnosFlowCtrl import get_mac
+from OnosCtrl import OnosCtrl, get_mac
+from OltConfig import OltConfig
 from portmaps import g_subscriber_port_map
 import threading, random
 from threading import current_thread
@@ -32,9 +32,7 @@
 
     app = 'org.onosproject.dhcprelay'
     app_dhcp = 'org.onosproject.dhcp'
-    relay_device_id = 'of:' + get_mac('ovsbr0')
-    relay_interface_port = 100
-    relay_interfaces = (g_subscriber_port_map[relay_interface_port],)
+    relay_interfaces_last = ()
     interface_to_mac_map = {}
     dhcp_data_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'setup')
     default_config = { 'default-lease-time' : 600, 'max-lease-time' : 7200, }
@@ -74,6 +72,7 @@
         status, _ = cls.onos_ctrl.activate()
         assert_equal(status, True)
         time.sleep(3)
+        cls.dhcp_relay_setup()
         ##start dhcpd initially with default config
         cls.dhcpd_start()
         cls.onos_dhcp_relay_load()
@@ -89,6 +88,20 @@
         cls.dhcpd_stop()
 
     @classmethod
+    def dhcp_relay_setup(cls):
+        did = OnosCtrl.get_device_id()
+        cls.relay_device_id = did
+        cls.olt = OltConfig()
+        cls.port_map, _ = cls.olt.olt_port_map()
+        if cls.port_map:
+            cls.relay_interface_port = cls.port_map['uplink']
+            cls.relay_interfaces = (cls.port_map[cls.relay_interface_port],)
+        else:
+            cls.relay_interface_port = 100
+            cls.relay_interfaces = (g_subscriber_port_map[cls.relay_interface_port],)
+        cls.relay_interfaces_last = cls.relay_interfaces
+
+    @classmethod
     def onos_load_config(cls, config):
         status, code = OnosCtrl.config(config)
         if status is False:
@@ -133,10 +146,12 @@
         return '{}{}{}'.format(conf, opts, subnet_config)
 
     @classmethod
-    def dhcpd_start(cls, intf_list = relay_interfaces,
+    def dhcpd_start(cls, intf_list = None,
                     config = default_config, options = default_options,
                     subnet = default_subnet_config):
         '''Start the dhcpd server by generating the conf file'''
+        if intf_list is None:
+            intf_list = cls.relay_interfaces
         ##stop dhcpd if already running
         cls.dhcpd_stop()
         dhcp_conf = cls.dhcpd_conf_generate(config = config, options = options,
@@ -163,6 +178,7 @@
         ret = os.system(dhcpd_cmd)
         assert_equal(ret, 0)
         time.sleep(3)
+        cls.relay_interfaces_last = cls.relay_interfaces
         cls.relay_interfaces = intf_list
 
     @classmethod
@@ -171,6 +187,8 @@
         for intf in cls.relay_interfaces:
             os.system('ifconfig {} 0'.format(intf))
 
+        cls.relay_interfaces = cls.relay_interfaces_last
+
     def get_mac(self, iface):
         if self.interface_to_mac_map.has_key(iface):
             return self.interface_to_mac_map[iface]
@@ -226,8 +244,6 @@
         self.total_success += self.ip_count
 	self.total_failure += self.failure_count
 
-
-
     def send_recv(self, mac, update_seed = False, validate = True):
         cip, sip = self.dhcp.discover(mac = mac, update_seed = update_seed)
         if validate:
@@ -269,6 +285,7 @@
         self.dhcp = DHCPTest(seed_ip = '192.169.1.1', iface = iface)
         ip_map = {}
         for i in range(10):
+            mac = RandMAC()._fix()
             cip, sip = self.send_recv(mac, update_seed = True)
             if ip_map.has_key(cip):
                 log.info('IP %s given out multiple times' %cip)
@@ -300,7 +317,7 @@
         assert_equal(self.dhcp.release(cip2), True)
 
     def test_dhcpRelay_Nrelease(self, iface = 'veth0'):
-        mac = self.get_mac(iface)
+        mac = None
         self.host_load(iface)
         ##we use the defaults for this test that serves as an example for others
         ##You don't need to restart dhcpd server if retaining default config
@@ -351,29 +368,6 @@
                          config = config,
                          options = options,
                          subnet = subnet)
-        self.dhcp = DHCPTest(seed_ip = '192.169.1.1', iface = iface)
-        ip_map = {}
-        for i in range(10):
-            cip, sip = self.send_recv(mac, update_seed = True)
-            if ip_map.has_key(cip):
-                log.info('IP %s given out multiple times' %cip)
-                assert_equal(False, ip_map.has_key(cip))
-            ip_map[cip] = sip
-
-
-    def test_dhcpRelay_starvation(self, iface = 'veth0'):
-        mac = self.get_mac(iface)
-        self.host_load(iface)
-        ##we use the defaults for this test that serves as an example for others
-        ##You don't need to restart dhcpd server if retaining default config
-        config = self.default_config
-        options = self.default_options
-        subnet = self.default_subnet_config
-        dhcpd_interface_list = self.relay_interfaces
-        self.dhcpd_start(intf_list = dhcpd_interface_list,
-                         config = config,
-                         options = options,
-                         subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '182.17.0.1', iface = iface)
         log.info('Verifying 1 ')
         while True:
diff --git a/src/test/flows/flowsTest.py b/src/test/flows/flowsTest.py
index 78eec17..8fa51fb 100644
--- a/src/test/flows/flowsTest.py
+++ b/src/test/flows/flowsTest.py
@@ -23,7 +23,7 @@
 import threading
 import os
 from OnosCtrl import OnosCtrl
-from OnosFlowCtrl import OnosFlowCtrl, get_mac
+from OnosFlowCtrl import OnosFlowCtrl
 from OltConfig import OltConfig
 import random
 from threading import current_thread
@@ -98,15 +98,13 @@
         return '.'.join(lst)
 
 
-
-
     @classmethod
     def setUpClass(cls):
         cls.olt = OltConfig()
-        cls.port_map = cls.olt.olt_port_map()
+        cls.port_map, _ = cls.olt.olt_port_map()
         if not cls.port_map:
             cls.port_map = cls.default_port_map
-        cls.device_id = 'of:' + get_mac() ##match against our device id
+        cls.device_id = OnosCtrl.get_device_id()
 
     def test_flow_mac(self):
         '''Test Add and verify flows with MAC selectors'''
diff --git a/src/test/proxyarp/proxyarpTest.py b/src/test/proxyarp/proxyarpTest.py
index a9083b9..5fbf28a 100644
--- a/src/test/proxyarp/proxyarpTest.py
+++ b/src/test/proxyarp/proxyarpTest.py
@@ -16,9 +16,9 @@
 import unittest
 from nose.tools import *
 from scapy.all import *
-from OnosCtrl import OnosCtrl
+from OnosCtrl import OnosCtrl, get_mac
 from OltConfig import OltConfig
-from OnosFlowCtrl import OnosFlowCtrl, get_mac
+from OnosFlowCtrl import OnosFlowCtrl
 from onosclidriver import OnosCliDriver
 from CordContainer import Container, Onos, Quagga
 from CordTestServer import cord_test_onos_restart, cord_test_quagga_restart
@@ -54,16 +54,30 @@
     @classmethod
     def setUpClass(cls):
         cls.olt = OltConfig()
-        cls.port_map = cls.olt.olt_port_map()
+        cls.port_map, _ = cls.olt.olt_port_map()
         if not cls.port_map:
             cls.port_map = g_subscriber_port_map
         time.sleep(3)
+        cls.load_device_id()
 
     @classmethod
     def tearDownClass(cls):
         '''Deactivate the vrouter apps'''
         #cls.vrouter_host_unload()
 
+    @classmethod
+    def load_device_id(cls):
+        did = OnosCtrl.get_device_id()
+        cls.device_id = did
+        cls.device_dict = { "devices" : {
+                "{}".format(did) : {
+                    "basic" : {
+                        "driver" : "softrouter"
+                    }
+                }
+            },
+        }
+
     def cliEnter(self):
         retries = 0
         while retries < 3:
diff --git a/src/test/setup/cord-test.py b/src/test/setup/cord-test.py
index ba8e2ee..022a192 100755
--- a/src/test/setup/cord-test.py
+++ b/src/test/setup/cord-test.py
@@ -59,7 +59,7 @@
             self.olt = True
             olt_conf_file = os.path.join(self.tester_base, 'olt_config.json')
             olt_config = OltConfig(olt_conf_file)
-            self.port_map = olt_config.olt_port_map()
+            self.port_map, _ = olt_config.olt_port_map()
         else:
             self.olt = False
             self.port_map = None
@@ -130,7 +130,7 @@
     def cleanup_intfs(cls):
         olt_conf_file = os.path.join(cls.tester_base, 'olt_config.json')
         olt_config = OltConfig(olt_conf_file)
-        port_map = olt_config.olt_port_map()
+        port_map, _ = olt_config.olt_port_map()
         port_num = 0
         intf_host = port_map['host']
         start_vlan = port_map['start_vlan']
@@ -275,7 +275,7 @@
 
     test_containers = []
     #These tests end up restarting ONOS/quagga/radius
-    tests_exempt = ('vrouter',)
+    tests_exempt = ('vrouter', 'cordSubscriber', 'proxyarp')
     if args.test_type.lower() == 'all':
         tests = CordTester.ALL_TESTS
         args.quagga = True
diff --git a/src/test/setup/eval.sh b/src/test/setup/eval.sh
index 51513c9..663674e 100755
--- a/src/test/setup/eval.sh
+++ b/src/test/setup/eval.sh
@@ -8,11 +8,31 @@
 docker kill cord-onos || true
 docker kill cord-quagga || true
 docker kill cord-radius || true
+olt_config="$(dirname $0)/olt_config.json"
+sub=0
+if grep -q br-int $olt_config; then
+  sub=1
+fi
+if [ $sub -eq 1 ]; then
+    sed -i 's,br-int,ovsbr0,g' $olt_config
+fi
+function finish {
+    $cord_tester cleanup --olt
+    pkill -f cord-test
+    if [ $sub -eq 1 ]; then
+        sed -i 's,ovsbr0,br-int,g' $olt_config
+    fi
+}
+trap finish EXIT
+$cord_tester setup --olt --start-switch
+cnt=`docker ps -lq`
 echo "Running TLS authentication test"
-$cord_tester run -r -t tls
-echo "Running DHCP request test"
-$cord_tester run -t dhcp
+docker exec $cnt nosetests -v /root/test/src/test/tls/tlsTest.py
+echo "Running DHCP relay request test"
+docker exec $cnt nosetests -v /root/test/src/test/dhcprelay/dhcprelayTest.py:dhcprelay_exchange.test_dhcpRelay_1request
 echo "Running IGMP join verify test"
-$cord_tester run -t igmp:igmp_exchange.test_igmp_join_verify_traffic
+docker exec $cnt nosetests -v /root/test/src/test/igmp/igmpTest.py:igmp_exchange.test_igmp_join_verify_traffic
 echo "Running VROUTER test with 5 routes"
-$cord_tester run -q -t vrouter:vrouter_exchange.test_vrouter_1
+docker exec $cnt nosetests -v /root/test/src/test/vrouter/vrouterTest.py:vrouter_exchange.test_vrouter_with_5_routes
+echo "Running CORD subscriber channel join jump test"
+docker exec $cnt nosetests -v /root/test/src/test/cordSubscriber/cordSubscriberTest.py:subscriber_exchange.test_subscriber_join_jump
diff --git a/src/test/setup/olt_config.json b/src/test/setup/olt_config.json
index db00a33..36070f7 100644
--- a/src/test/setup/olt_config.json
+++ b/src/test/setup/olt_config.json
@@ -1,2 +1 @@
-{ "olt" : false , "port_map" : { "ports" : [ "veth0", "veth2", "veth4", "veth6", "veth8", "veth10" ], "tx" : "veth2", "rx" : "veth0", "host" : "br-int", "start_vlan" : 1000 }, "uplink" : 2, "vlan" : 0 }
-
+{ "olt" : false , "port_map" : { "num_ports" : 11, "host" : "br-int", "start_vlan" : 1000 }, "uplink" : 2, "vlan" : 0 }
diff --git a/src/test/setup/olt_config_multitable.json b/src/test/setup/olt_config_multitable.json
deleted file mode 100644
index 6d4f4dc..0000000
--- a/src/test/setup/olt_config_multitable.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{ "olt" : false , "port_map" : { "port" : "veth0", "num_ports" : 100, "host" : "br-int", "start_vlan" : 1000 }, "uplink" : 2, "vlan" : 0 }
-  
diff --git a/src/test/subscriber/subscriberTest.py b/src/test/subscriber/subscriberTest.py
index 6359636..ab1e6a7 100644
--- a/src/test/subscriber/subscriberTest.py
+++ b/src/test/subscriber/subscriberTest.py
@@ -237,7 +237,7 @@
       def setUp(self):
           '''Load the OLT config and activate relevant apps'''
           self.olt = OltConfig()
-          self.port_map = self.olt.olt_port_map()
+          self.port_map, _ = self.olt.olt_port_map()
           ##if no olt config, fall back to ovs port map
           if not self.port_map:
                 self.port_map = g_subscriber_port_map
diff --git a/src/test/utils/OltConfig.py b/src/test/utils/OltConfig.py
index bb78563..ac5f5db 100644
--- a/src/test/utils/OltConfig.py
+++ b/src/test/utils/OltConfig.py
@@ -38,34 +38,12 @@
     def olt_port_map(self):
         if self.on_olt() and self.olt_conf.has_key('port_map'):
             port_map = {}
-            port_map['ports'] = self.olt_conf['port_map']['ports']
-            port_map['start_vlan'] = 0
-            if self.olt_conf['port_map'].has_key('host'):
-                port_map['host'] = self.olt_conf['port_map']['host']
-            else:
-                port_map['host'] = 'ovsbr0'
-            if self.olt_conf['port_map'].has_key('start_vlan'):
-                port_map['start_vlan'] = int(self.olt_conf['port_map']['start_vlan'])
-                
-            ##Build a rx/tx port number to interface map
-            port_map[1] = self.olt_conf['port_map']['rx']
-            port_map[2] = self.olt_conf['port_map']['tx']
-            port_map[port_map[1]] = 1
-            port_map[port_map[2]] = 2
-            return port_map
-        else:
-            return None
-
-    def olt_port_map_multi(self):
-        if self.on_olt() and self.olt_conf.has_key('port_map'):
-            port_map = {}
             if self.olt_conf['port_map'].has_key('ports'):
                 port_map['ports'] = self.olt_conf['port_map']['ports']
             else:
                 port_map['ports'] = []
                 num_ports = int(self.olt_conf['port_map']['num_ports'])
-                port_map['port'] = self.olt_conf['port_map']['port']
-                for port in xrange(0, num_ports, 2):
+                for port in xrange(0, num_ports*2, 2):
                     port_map['ports'].append('veth{}'.format(port))
             port_num = 1
             port_map['uplink'] = int(self.olt_conf['uplink'])
diff --git a/src/test/utils/OnosCtrl.py b/src/test/utils/OnosCtrl.py
index e323112..9c73b4a 100644
--- a/src/test/utils/OnosCtrl.py
+++ b/src/test/utils/OnosCtrl.py
@@ -16,6 +16,20 @@
 import json
 import requests
 import os,sys,time
+from OltConfig import OltConfig
+import fcntl, socket, struct
+
+def get_mac(iface = 'ovsbr0', pad = 4):
+    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    try:
+        info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', bytes(iface[:15])))
+    except:
+        info = ['0'] * 24
+    s.close()
+    sep = ''
+    if pad == 0:
+        sep = ':'
+    return '0'*pad + sep.join(['%02x' %ord(char) for char in info[18:24]])
 
 class OnosCtrl:
 
@@ -61,6 +75,24 @@
         return None
 
     @classmethod
+    def get_device_id(cls):
+        '''If running under olt, we get the first switch connected to onos'''
+        olt = OltConfig()
+        if olt.on_olt():
+            devices = cls.get_devices()
+            if devices:
+                dids = map(lambda d: d['id'], devices)
+                if len(dids) == 1:
+                    did = dids[0]
+                else:
+                    ###If we have more than 1, then check for env before using first one
+                    did = os.getenv('OLT_DEVICE_ID', dids[0])
+            else:
+                  did = 'of:' + get_mac('ovsbr0')
+
+        return did
+
+    @classmethod
     def get_flows(cls, device_id):
         url = 'http://%s:8181/onos/v1/flows/' %(cls.controller) + device_id
         result = requests.get(url, auth = cls.auth)
diff --git a/src/test/utils/OnosFlowCtrl.py b/src/test/utils/OnosFlowCtrl.py
index f1b72cf..295a7ab 100644
--- a/src/test/utils/OnosFlowCtrl.py
+++ b/src/test/utils/OnosFlowCtrl.py
@@ -19,19 +19,6 @@
 from nose.tools import *
 from scapy.all import *
 from OnosCtrl import OnosCtrl
-import fcntl, socket, struct
-
-def get_mac(iface = 'ovsbr0', pad = 4):
-    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    try:
-        info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', iface[:15]))
-    except:
-        info = ['0'] * 24
-    s.close()
-    sep = ''
-    if pad == 0:
-        sep = ':'
-    return '0'*pad + sep.join(['%02x' %ord(char) for char in info[18:24]])
 
 class OnosFlowCtrl:
 
diff --git a/src/test/vrouter/vrouterTest.py b/src/test/vrouter/vrouterTest.py
index b69bf5c..8e602ee 100644
--- a/src/test/vrouter/vrouterTest.py
+++ b/src/test/vrouter/vrouterTest.py
@@ -16,9 +16,9 @@
 import unittest
 from nose.tools import *
 from scapy.all import *
-from OnosCtrl import OnosCtrl
+from OnosCtrl import OnosCtrl, get_mac
 from OltConfig import OltConfig
-from OnosFlowCtrl import OnosFlowCtrl, get_mac
+from OnosFlowCtrl import OnosFlowCtrl
 from onosclidriver import OnosCliDriver
 #from quaggaclidriver import QuaggaCliDriver
 from CordContainer import Container, Onos, Quagga
@@ -82,16 +82,30 @@
     def setUpClass(cls):
         ''' Activate the vrouter apps'''
         cls.olt = OltConfig()
-        cls.port_map = cls.olt.olt_port_map()
+        cls.port_map, _ = cls.olt.olt_port_map()
         if not cls.port_map:
             cls.port_map = g_subscriber_port_map
         time.sleep(3)
+        cls.load_device_id()
 
     @classmethod
     def tearDownClass(cls):
         '''Deactivate the vrouter apps'''
         #cls.vrouter_host_unload()
 
+    @classmethod
+    def load_device_id(cls):
+        did = OnosCtrl.get_device_id()
+        cls.device_id = did
+        cls.vrouter_device_dict = { "devices" : {
+                "{}".format(did) : {
+                    "basic" : {
+                        "driver" : "softrouter"
+                    }
+                }
+            },
+        }
+
     def cliEnter(self):
         retries = 0
         while retries < 3:
