diff --git a/src/test/utils/VSGAccess.py b/src/test/utils/VSGAccess.py
new file mode 100644
index 0000000..cb47805
--- /dev/null
+++ b/src/test/utils/VSGAccess.py
@@ -0,0 +1,333 @@
+import os
+import shutil
+import re
+from novaclient import client as nova_client
+from SSHTestAgent import SSHTestAgent
+from CordTestUtils import *
+
+class VSGAccess(object):
+
+    vcpe_map = {}
+    interface_map = {}
+    ip_addr_pattern = re.compile('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}$')
+
+    @classmethod
+    def setUp(cls):
+        try:
+            shutil.copy('/etc/resolv.conf', '/etc/resolv.conf.orig')
+        except:
+            pass
+
+    @classmethod
+    def tearDown(cls):
+        try:
+            shutil.copy('/etc/resolv.conf.orig', '/etc/resolv.conf')
+        except:
+            pass
+
+    @classmethod
+    def get_nova_credentials_v2(cls):
+        credential = {}
+        credential['username'] = os.environ['OS_USERNAME']
+        credential['api_key'] = os.environ['OS_PASSWORD']
+        credential['auth_url'] = os.environ['OS_AUTH_URL']
+        credential['project_id'] = os.environ['OS_TENANT_NAME']
+        return credential
+
+    @classmethod
+    def get_compute_nodes(cls):
+        credentials = cls.get_nova_credentials_v2()
+        nvclient = nova_client.Client('2', **credentials)
+        return nvclient.hypervisors.list()
+
+    @classmethod
+    def get_vsgs(cls, active = True):
+        credentials = cls.get_nova_credentials_v2()
+        nvclient = nova_client.Client('2', **credentials)
+        vsgs = nvclient.servers.list(search_opts = {'all_tenants': 1})
+        if active is True:
+            vsgs = filter(lambda vsg: vsg.status == 'ACTIVE', vsgs)
+        vsg_wrappers = []
+        for vsg in vsgs:
+            vsg_wrappers.append(VSGWrapper(vsg))
+        return vsg_wrappers
+
+    @classmethod
+    def open_mgmt(cls, intf = 'eth0'):
+        if intf in cls.interface_map:
+            gw = cls.interface_map[intf]['gw']
+            ip = cls.interface_map[intf]['ip']
+            if gw != '0.0.0.0':
+                current_gw, _ = get_default_gw()
+                cmds = [ 'route del default gw {}'.format(current_gw),
+                         'ifconfig {} {} up'.format(intf, ip),
+                         'route add default gw {}'.format(gw) ]
+                for cmd in cmds:
+                    os.system(cmd)
+                shutil.copy('/etc/resolv.conf', '/etc/resolv.conf.lastdhcp')
+                shutil.copy('/etc/resolv.conf.orig', '/etc/resolv.conf')
+                return current_gw
+        return None
+
+    @classmethod
+    def close_mgmt(cls, restore_gw, intf = 'eth0'):
+        if restore_gw:
+            cmds = [ 'route del default gw 0.0.0.0',
+                     'route add default gw {}'.format(restore_gw),
+                     'cp /etc/resolv.conf.lastdhcp /etc/resolv.conf',
+                     'rm -f /etc/resolv.conf.lastdhcp'
+                     ]
+            for cmd in cmds:
+                os.system(cmd)
+
+    @classmethod
+    def health_check(cls):
+        '''Returns 0 if all active vsgs are reachable through the compute node'''
+        vsgs = cls.get_vsgs()
+        vsg_status = []
+        for vsg in vsgs:
+            vsg_status.append(vsg.get_health())
+        unreachable = filter(lambda st: st == False, vsg_status)
+        return len(unreachable) == 0
+
+    @classmethod
+    def get_vcpe_vsg(cls, vcpe):
+        '''Find the vsg hosting the vcpe service'''
+        if vcpe in cls.vcpe_map:
+            return cls.vcpe_map[vcpe]['vsg']
+        vsgs = cls.get_vsgs()
+        for vsg in vsgs:
+            cmd = 'sudo docker exec {} ls 2>/dev/null'.format(vcpe)
+            st, _ = vsg.run_cmd(cmd, timeout = 30)
+            if st == True:
+                return vsg
+        return None
+
+    @classmethod
+    def save_vcpe_config(cls, vsg, vcpe):
+        if vcpe not in cls.vcpe_map:
+            cmd_gw = "sudo docker exec %s ip route show | grep default | head -1 | awk '{print $3}'" %(vcpe)
+            vsg_ip = vsg.ip
+            if vsg_ip is None:
+                return False
+            st, output = vsg.run_cmd(cmd_gw, timeout = 30)
+            if st == False or not output:
+                return False
+            gw = output
+            cmd_wan = "sudo docker exec %s ip addr show eth0 |grep inet |head -1 | tr -s ' ' | awk '{print $2}' | awk '{print $1}'" %(vcpe)
+            cmd_lan = "sudo docker exec %s ip addr show eth1 |grep inet |head -1 | tr -s ' ' | awk '{print $2}' | awk '{print $1}'" %(vcpe)
+            st, output = vsg.run_cmd(cmd_wan, timeout = 30)
+            ip_wan = '0.0.0.0/24'
+            ip_lan = '0.0.0.0/24'
+            if st and output:
+                if cls.ip_addr_pattern.match(output):
+                    ip_wan = output
+
+            st, output = vsg.run_cmd(cmd_lan, timeout = 30)
+            if st and output:
+                if cls.ip_addr_pattern.match(output):
+                    ip_lan = output
+
+            cls.vcpe_map[vcpe] = { 'vsg': vsg, 'gw': gw, 'wan': ip_wan, 'lan': ip_lan }
+
+        return True
+
+    @classmethod
+    def restore_vcpe_config(cls, vcpe, gw = True, wan = False, lan = False):
+        if vcpe in cls.vcpe_map:
+            vsg = cls.vcpe_map[vcpe]['vsg']
+            cmds = []
+            if gw is True:
+                #restore default gw
+                gw = cls.vcpe_map[vcpe]['gw']
+                cmds.append('sudo docker exec {} ip link set eth0 up'.format(vcpe))
+                cmds.append('sudo docker exec {} route add default gw {} dev eth0'.format(vcpe, gw))
+            if wan is True:
+                ip_wan = cls.vcpe_map[vcpe]['wan']
+                cmds.append('sudo docker exec {} ip addr set {} dev eth0'.format(vcpe, ip_wan))
+            if lan is True:
+                ip_lan = cls.vcpe_map[vcpe]['lan']
+                cmds.append('sudo docker exec {} ip addr set {} dev eth1'.format(vcpe, ip_lan))
+            ret_status = True
+            for cmd in cmds:
+                st, _ = vsg.run_cmd(cmd, timeout = 30)
+                if st == False:
+                    ret_status = False
+            return ret_status
+        return False
+
+    @classmethod
+    def get_vcpe_gw(cls, vcpe):
+        if vcpe in cls.vcpe_map:
+            return cls.vcpe_map[vcpe]['gw']
+        return None
+
+    @classmethod
+    def get_vcpe_wan(cls, vcpe):
+        if vcpe in cls.vcpe_map:
+            return cls.vcpe_map[vcpe]['wan']
+        return None
+
+    @classmethod
+    def get_vcpe_lan(cls, vcpe):
+        if vcpe in cls.vcpe_map:
+            return cls.vcpe_map[vcpe]['lan']
+        return None
+
+    @classmethod
+    def vcpe_wan_up(cls, vcpe):
+        return cls.restore_vcpe_config(vcpe)
+
+    @classmethod
+    def vcpe_lan_up(cls, vcpe, vsg = None):
+        if vsg is None:
+            vsg = cls.get_vcpe_vsg(vcpe)
+            if vsg is None:
+                return False
+        cmd = 'sudo docker exec {} ip link set eth1 up'.format(vcpe)
+        st, _ = vsg.run_cmd(cmd, timeout = 30)
+        return st
+
+    #we cannot access compute node if the vcpe port gets dhcp as default would be through fabric
+    @classmethod
+    def vcpe_port_down(cls, vcpe, port, vsg = None):
+        if vsg is None:
+            vsg = cls.get_vcpe_vsg(vcpe)
+            if vsg is None:
+                return False
+        if not cls.save_vcpe_config(vsg, vcpe):
+            return False
+        cmd = 'sudo docker exec {} ip link set {} down'.format(vcpe, port)
+        st, _ = vsg.run_cmd(cmd, timeout = 30)
+        if st is False:
+            cls.restore_vcpe_config(vcpe)
+            return False
+        return st
+
+    @classmethod
+    def vcpe_wan_down(cls, vcpe, vsg = None):
+        return cls.vcpe_port_down(vcpe, 'eth0', vsg = vsg)
+
+    @classmethod
+    def vcpe_lan_down(cls, vcpe, vsg = None):
+        return cls.vcpe_port_down(vcpe, 'eth1', vsg = vsg)
+
+    @classmethod
+    def save_interface_config(cls, intf):
+        if intf not in cls.interface_map:
+            ip = get_ip(intf)
+            if ip is None:
+                ip = '0.0.0.0'
+            default_gw, default_gw_device = get_default_gw()
+            if default_gw_device != intf:
+                default_gw = '0.0.0.0'
+            cls.interface_map[intf] = { 'ip' : ip, 'gw': default_gw }
+            #bounce the interface to remove default gw
+            cmds = ['ifconfig {} 0 down'.format(intf),
+                    'ifconfig {} 0 up'.format(intf)
+                    ]
+            for cmd in cmds:
+                os.system(cmd)
+
+    #open up access to compute node
+    @classmethod
+    def restore_interface_config(cls, intf, vcpe = None):
+        if intf in cls.interface_map:
+            ip = cls.interface_map[intf]['ip']
+            gw = cls.interface_map[intf]['gw']
+            del cls.interface_map[intf]
+            cmds = []
+            if vcpe is not None:
+                shutil.copy('/etc/resolv.conf.orig', '/etc/resolv.conf')
+                #bounce the vcpes to clear default gw
+                cmds.append('ifconfig {} 0 down'.format(vcpe))
+                cmds.append('ifconfig {} 0 up'.format(vcpe))
+            cmds.append('ifconfig {} {} up'.format(intf, ip))
+            if gw and gw != '0.0.0.0':
+                cmds.append('route add default gw {} dev {}'.format(gw, intf))
+            for cmd in cmds:
+                os.system(cmd)
+
+    @classmethod
+    def vcpe_get_dhcp(cls, vcpe, mgmt = 'eth0'):
+        '''Get DHCP from vcpe dhcp interface.'''
+        '''We have to also save the management interface config for restoration'''
+        cls.save_interface_config(mgmt)
+        getstatusoutput('pkill -9 dhclient')
+        st, output = getstatusoutput('dhclient -q {}'.format(vcpe))
+        getstatusoutput('pkill -9 dhclient')
+        vcpe_ip = get_ip(vcpe)
+        if vcpe_ip is None:
+            cls.restore_interface_config(mgmt)
+            return None
+        if output:
+            #workaround for docker container apparmor that prevents moving dhclient resolv.conf
+            start = output.find('/etc/resolv.conf')
+            if start >= 0:
+                end = output.find("'", start)
+                dns_file = output[start:end]
+                if os.access(dns_file, os.F_OK):
+                    shutil.copy(dns_file, '/etc/resolv.conf')
+
+        default_gw, default_gw_device = get_default_gw()
+        if default_gw and default_gw_device == vcpe:
+            return vcpe_ip
+        cls.restore_interface_config(mgmt, vcpe = vcpe)
+        return None
+
+class VSGWrapper(object):
+
+    def __init__(self, vsg):
+        self.vsg = vsg
+        self.name = self.vsg.name
+        self.compute_node = self.get_compute_node()
+        self.ip = self.get_ip()
+
+    def get_compute_node(self):
+        return self.vsg._info['OS-EXT-SRV-ATTR:hypervisor_hostname']
+
+    def get_ip(self):
+        if 'management' in self.vsg.networks:
+            ips = self.vsg.networks['management']
+            if len(ips) > 0:
+                return ips[0]
+        return None
+
+    def run_cmd_compute(self, cmd, timeout = 5):
+        ssh_agent = SSHTestAgent(self.compute_node)
+        st, output = ssh_agent.run_cmd(cmd, timeout = timeout)
+        if st == True and output:
+            output = output.strip()
+        else:
+            output = None
+
+        return st, output
+
+    def run_cmd(self, cmd, timeout = 5, mgmt = 'eth0'):
+        last_gw = VSGAccess.open_mgmt(mgmt)
+        ssh_agent = SSHTestAgent(self.compute_node)
+        ssh_cmd = 'ssh {} {}'.format(self.ip, cmd)
+        st, output = ssh_agent.run_cmd(ssh_cmd, timeout = timeout)
+        if st == True and output:
+            output = output.strip()
+        else:
+            output = None
+        VSGAccess.close_mgmt(last_gw, mgmt)
+        return st, output
+
+    def get_health(self):
+        if self.ip is None:
+            return False
+        cmd = 'ping -c 1 {}'.format(self.ip)
+        st, _ = self.run_cmd_compute(cmd)
+        return st
+
+    def check_access(self):
+        if self.ip is None:
+            return False
+        ssh_agent = SSHTestAgent(self.compute_node)
+        st, _ = ssh_agent.run_cmd('ls', timeout=10)
+        if st == False:
+            return st
+        st, _ = ssh_agent.run_cmd('ssh {} ls'.format(self.ip), timeout=30)
+        return st
diff --git a/src/test/vsg/vsgTest.py b/src/test/vsg/vsgTest.py
index b76dd72..91ddcb5 100644
--- a/src/test/vsg/vsgTest.py
+++ b/src/test/vsg/vsgTest.py
@@ -12,35 +12,19 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-import unittest
+import time
+import os
+import shutil
+import re
 from nose.tools import *
 from scapy.all import *
 from CordTestUtils import *
-from OnosCtrl import OnosCtrl
 from OltConfig import OltConfig
-from socket import socket
-from OnosFlowCtrl import OnosFlowCtrl
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
 from onosclidriver import OnosCliDriver
-from CordContainer import Container, Onos, Quagga
-from CordTestServer import cord_test_onos_restart, cord_test_onos_shutdown
 from SSHTestAgent import SSHTestAgent
-from portmaps import g_subscriber_port_map
-from scapy.all import *
-import time, monotonic
-from OnosLog import OnosLog
 from CordLogger import CordLogger
-import os
-import shutil
-import json
-import random
-import collections
-import paramiko
-import re
-from paramiko import SSHClient
-from neutronclient.v2_0 import client as neutron_client
-from novaclient import client as nova_client
+from VSGAccess import VSGAccess
+
 log.setLevel('INFO')
 
 class vsg_exchange(CordLogger):
@@ -55,7 +39,6 @@
     HEAD_NODE = head_node + '.cord.lab' if len(head_node.split('.')) == 1 else head_node
     test_path = os.path.dirname(os.path.realpath(__file__))
     olt_conf_file = os.path.join(test_path, '..', 'setup/olt_config.json')
-    ip_addr_pattern = re.compile('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}$')
 
     @classmethod
     def setUpClass(cls):
@@ -78,17 +61,11 @@
         cls.vcpe_container = vcpe_container
         cls.vcpe_dhcp = vcpe_dhcp
         cls.vcpe_dhcp_stag = vcpe_dhcp_stag
-        try:
-            shutil.copy('/etc/resolv.conf', '/etc/resolv.conf.orig')
-        except:
-            pass
+        VSGAccess.setUp()
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            shutil.copy('/etc/resolv.conf.orig', '/etc/resolv.conf')
-        except:
-            pass
+        VSGAccess.tearDown()
 
     def cliEnter(self, controller = None):
         retries = 0
@@ -118,221 +95,9 @@
     def log_set(self, level = None, app = 'org.onosproject'):
         CordLogger.logSet(level = level, app = app, controllers = self.controllers, forced = True)
 
-    def get_nova_credentials_v2(self):
-        credential = {}
-        credential['username'] = os.environ['OS_USERNAME']
-        credential['api_key'] = os.environ['OS_PASSWORD']
-        credential['auth_url'] = os.environ['OS_AUTH_URL']
-        credential['project_id'] = os.environ['OS_TENANT_NAME']
-        return credential
-
-    def get_compute_nodes(self):
-        credentials = self.get_nova_credentials_v2()
-        nvclient = nova_client.Client('2', **credentials)
-        return nvclient.hypervisors.list()
-
-    def get_vsgs(self, active = True):
-        credentials = self.get_nova_credentials_v2()
-        nvclient = nova_client.Client('2', **credentials)
-        vsgs = nvclient.servers.list(search_opts = {'all_tenants': 1})
-        if active is True:
-            return filter(lambda vsg: vsg.status == 'ACTIVE', vsgs)
-        return vsgs
-
-    def get_vsg_ip(self, vm_name, vcpe = None):
-        if vcpe is not None:
-            if vcpe in self.vcpe_map:
-                return self.vcpe_map[vcpe]['vsg_ip']
-        vsgs = self.get_vsgs()
-        vms = filter(lambda vsg: vsg.name == vm_name, vsgs)
-        if vms:
-            vm = vms[0]
-            if vm.networks.has_key('management'):
-                ips = vm.networks['management']
-                if len(ips) > 0:
-                    return ips[0]
-        return None
-
-    def get_compute_node(self, vsg):
-        return vsg._info['OS-EXT-SRV-ATTR:hypervisor_hostname']
-
-    def run_cmd_compute(self, compute, cmd, timeout = 5):
-        ssh_agent = SSHTestAgent(compute)
-        st, output = ssh_agent.run_cmd(cmd, timeout = timeout)
-        if st == True and output:
-            output = output.strip()
-        else:
-            output = None
-
-        return st, output
-
-    def run_cmd_vsg(self, compute, vsg_ip, cmd, timeout = 5, mgmt = 'eth0'):
-        last_gw = self.open_compute(mgmt)
-        ssh_agent = SSHTestAgent(compute)
-        ssh_cmd = 'ssh {} {}'.format(vsg_ip, cmd)
-        st, output = ssh_agent.run_cmd(ssh_cmd, timeout = timeout)
-        if st == True and output:
-            output = output.strip()
-        else:
-            output = None
-        self.close_compute(last_gw, mgmt)
-        return st, output
-
-    #ping the vsg through the compute node.
-    #the ssh key is already used by SSHTestAgent in cord-tester
-    def get_vsg_health(self, vsg):
-        compute_node = self.get_compute_node(vsg)
-        vsg_ip = self.get_vsg_ip(vsg.name)
-        if vsg_ip is None:
-            return False
-        cmd = 'ping -c 1 {}'.format(vsg_ip)
-        st, _ = self.run_cmd_compute(compute_node, cmd)
-        return st
-
-    #returns 0 if all active vsgs are reachable through the compute node
-    def health_check(self):
-        vsgs = self.get_vsgs()
-        vsg_status = []
-        for vsg in vsgs:
-            vsg_status.append(self.get_vsg_health(vsg))
-        unreachable = filter(lambda st: st == False, vsg_status)
-        return len(unreachable) == 0
-
-    #find the vsg hosting the vcpe service
-    def get_vcpe_vsg(self, vcpe):
-        if vcpe in self.vcpe_map:
-            return self.vcpe_map[vcpe]['vsg']
-        vsgs = self.get_vsgs()
-        for vsg in vsgs:
-            vsg_ip = self.get_vsg_ip(vsg.name)
-            compute_node = self.get_compute_node(vsg)
-            cmd = 'sudo docker exec {} ls 2>/dev/null'.format(vcpe)
-            st, _ = self.run_cmd_vsg(compute_node, vsg_ip, cmd, timeout = 30)
-            if st == True:
-                return vsg
-        return None
-
-    def save_vcpe_config(self, vsg, vcpe):
-        if vcpe not in self.vcpe_map:
-            cmd_gw = "sudo docker exec %s ip route show | grep default | head -1 | awk '{print $3}'" %(vcpe)
-            vsg_ip = self.get_vsg_ip(vsg.name)
-            if vsg_ip is None:
-                return False
-            compute_node = self.get_compute_node(vsg)
-            st, output = self.run_cmd_vsg(compute_node, vsg_ip, cmd_gw, timeout = 30)
-            if st == False or not output:
-                return False
-            gw = output
-            cmd_wan = "sudo docker exec %s ip addr show eth0 |grep inet |head -1 | tr -s ' ' | awk '{print $2}' | awk '{print $1}'" %(vcpe)
-            cmd_lan = "sudo docker exec %s ip addr show eth1 |grep inet |head -1 | tr -s ' ' | awk '{print $2}' | awk '{print $1}'" %(vcpe)
-            st, output = self.run_cmd_vsg(compute_node, vsg_ip, cmd_wan, timeout = 30)
-            ip_wan = '0.0.0.0/24'
-            ip_lan = '0.0.0.0/24'
-            if st and output:
-                if self.ip_addr_pattern.match(output):
-                    ip_wan = output
-
-            st, output = self.run_cmd_vsg(compute_node, vsg_ip, cmd_lan, timeout = 30)
-            if st and output:
-                if self.ip_addr_pattern.match(output):
-                    ip_lan = output
-
-            self.vcpe_map[vcpe] = { 'vsg': vsg, 'vsg_ip': vsg_ip, 'gw': gw, 'wan': ip_wan, 'lan': ip_lan }
-
-        return True
-
-    def restore_vcpe_config(self, vcpe, gw = True, wan = False, lan = False):
-        if vcpe in self.vcpe_map:
-            vsg = self.vcpe_map[vcpe]['vsg']
-            vsg_ip = self.vcpe_map[vcpe]['vsg_ip']
-            compute_node = self.get_compute_node(vsg)
-            cmds = []
-            if gw is True:
-                #restore default gw
-                gw = self.vcpe_map[vcpe]['gw']
-                cmds.append('sudo docker exec {} ip link set eth0 up'.format(vcpe))
-                cmds.append('sudo docker exec {} route add default gw {} dev eth0'.format(vcpe, gw))
-            if wan is True:
-                ip_wan = self.vcpe_map[vcpe]['wan']
-                cmds.append('sudo docker exec {} ip addr set {} dev eth0'.format(vcpe, ip_wan))
-            if lan is True:
-                ip_lan = self.vcpe_map[vcpe]['lan']
-                cmds.append('sudo docker exec {} ip addr set {} dev eth1'.format(vcpe, ip_lan))
-            ret_status = True
-            for cmd in cmds:
-                st, _ = self.run_cmd_vsg(compute_node, vsg_ip, cmd, timeout = 30)
-                if st == False:
-                    ret_status = False
-            return ret_status
-        return False
-
-    def get_vcpe_gw(self, vcpe):
-        if vcpe in self.vcpe_map:
-            return self.vcpe_map[vcpe]['gw']
-        return None
-
-    def get_vcpe_wan(self, vcpe):
-        if vcpe in self.vcpe_map:
-            return self.vcpe_map[vcpe]['wan']
-        return None
-
-    def get_vcpe_lan(self, vcpe):
-        if vcpe in self.vcpe_map:
-            return self.vcpe_map[vcpe]['lan']
-        return None
-
-    def vcpe_wan_up(self, vcpe, vsg = None):
-        if vsg is None:
-            vsg = self.get_vcpe_vsg(vcpe)
-            if vsg is None:
-                return False
-        return self.restore_vcpe_config(vcpe)
-
-    def vcpe_lan_up(self, vcpe, vsg = None):
-        if vsg is None:
-            vsg = self.get_vcpe_vsg(vcpe)
-            if vsg is None:
-                return False
-        vsg_ip = self.get_vsg_ip(vsg.name, vcpe = vcpe)
-        compute_node = self.get_compute_node(vsg)
-        cmd = 'sudo docker exec {} ip link set eth1 up'.format(vcpe)
-        st, _ = self.run_cmd_vsg(compute_node, vsg_ip, cmd, timeout = 30)
-        return st
-
-    #we cannot access compute node if the vcpe port gets dhcp as default would be through fabric
-    def vcpe_port_down(self, vcpe, port, vsg = None):
-        if vsg is None:
-            vsg = self.get_vcpe_vsg(vcpe)
-            if vsg is None:
-                return False
-        if not self.save_vcpe_config(vsg, vcpe):
-            return False
-        vsg_ip = self.get_vsg_ip(vsg.name, vcpe = vcpe)
-        compute_node = self.get_compute_node(vsg)
-        cmd = 'sudo docker exec {} ip link set {} down'.format(vcpe, port)
-        st, _ = self.run_cmd_vsg(compute_node, vsg_ip, cmd, timeout = 30)
-        if st is False:
-            self.restore_vcpe_config(vcpe)
-            return False
-        return st
-
-    def vcpe_wan_down(self, vcpe, vsg = None):
-        return self.vcpe_port_down(vcpe, 'eth0', vsg = vsg)
-
-    def vcpe_lan_down(self, vcpe, vsg = None):
-        return self.vcpe_port_down(vcpe, 'eth1', vsg = vsg)
-
-    #use SSHTestAgent to talk to the vsg through the compute node like in get_vsg_health
-    # def connect_ssh(vsg_ip, private_key_file=None, user='ubuntu'):
-    #     key = ssh.RSAKey.from_private_key_file(private_key_file)
-    #     client = ssh.SSHClient()
-    #     client.set_missing_host_key_policy(ssh.WarningPolicy())
-    #     client.connect(ip, username=user, pkey=key, timeout=5)
-    #     return client
-
     def test_vsg_vm(self):
-        status = self.health_check()
-        assert_equal( status, True)
+        status = VSGAccess.health_check()
+        assert_equal(status, True)
 
     def test_vsg_for_default_route_to_vsg_vm(self):
         ssh_agent = SSHTestAgent(host = self.HEAD_NODE, user = self.USER, password = self.PASS)
@@ -341,189 +106,48 @@
         assert_equal(status, True)
 
     def test_vsg_vm_for_vcpe(self):
-        vsgs = self.get_vsgs()
-        compute_nodes = self.get_compute_nodes()
+        vsgs = VSGAccess.get_vsgs()
+        compute_nodes = VSGAccess.get_compute_nodes()
         assert_not_equal(len(vsgs), 0)
         assert_not_equal(len(compute_nodes), 0)
 
-    #TODO: use cord-test container itself to dhclient on vcpe interfaces
-    #using the info from OltConfig().get_vcpes()
-    #deleting default through eth0, fetching ip through dhclient on vcpe,
-    #and testing for dhcp ip on vcpe0 and default route on vcpe0 before pinging 8.8.8.8
     def test_vsg_for_external_connectivity(self):
         ssh_agent = SSHTestAgent(host = self.HEAD_NODE, user = self.USER, password = self.PASS)
         cmd = "lxc exec testclient -- ping -c 3 8.8.8.8"
         status, output = ssh_agent.run_cmd(cmd)
         assert_equal( status, True)
 
-    def check_vsg_access(self, vsg):
-        compute_node = self.get_compute_node(vsg)
-        vsg_ip = self.get_vsg_ip(vsg.name)
-        if vsg_ip is None:
-            return False
-        ssh_agent = SSHTestAgent(compute_node)
-        st, _ = ssh_agent.run_cmd('ls', timeout=10)
-        if st == False:
-            return st
-        st, _ = ssh_agent.run_cmd('ssh {} ls'.format(vsg_ip), timeout=30)
-        return st
-
     def test_vsg_vm_for_login_to_vsg(self):
-        vsgs = self.get_vsgs()
-        vsg_access_status = map(self.check_vsg_access, vsgs)
+        vsgs = VSGAccess.get_vsgs()
+        vsg_access_status = map(lambda vsg: vsg.check_access(), vsgs)
         status = filter(lambda st: st == False, vsg_access_status)
         assert_equal(len(status), 0)
 
-    def save_interface_config(self, intf):
-        if intf not in self.interface_map:
-            ip = get_ip(intf)
-            if ip is None:
-                ip = '0.0.0.0'
-            default_gw, default_gw_device = get_default_gw()
-            if default_gw_device != intf:
-                default_gw = '0.0.0.0'
-            self.interface_map[intf] = { 'ip' : ip, 'gw': default_gw }
-            #bounce the interface to remove default gw
-            cmds = ['ifconfig {} 0 down'.format(intf),
-                    'ifconfig {} 0 up'.format(intf)
-                    ]
-            for cmd in cmds:
-                os.system(cmd)
-
-    #open up access to compute node
-    def open_compute(self, intf = 'eth0'):
-        if intf in self.interface_map:
-            gw = self.interface_map[intf]['gw']
-            ip = self.interface_map[intf]['ip']
-            if gw != '0.0.0.0':
-                current_gw, _ = get_default_gw()
-                cmds = [ 'route del default gw {}'.format(current_gw),
-                         'ifconfig {} {} up'.format(intf, ip),
-                         'route add default gw {}'.format(gw) ]
-                for cmd in cmds:
-                    os.system(cmd)
-                shutil.copy('/etc/resolv.conf', '/etc/resolv.conf.lastdhcp')
-                shutil.copy('/etc/resolv.conf.orig', '/etc/resolv.conf')
-                return current_gw
-
-        return None
-
-    def close_compute(self, restore_gw, intf = 'eth0'):
-        if restore_gw:
-            cmds = [ 'route del default gw 0.0.0.0',
-                     'route add default gw {}'.format(restore_gw),
-                     'cp /etc/resolv.conf.lastdhcp /etc/resolv.conf',
-                     'rm -f /etc/resolv.conf.lastdhcp'
-                     ]
-            for cmd in cmds:
-                os.system(cmd)
-
-    def restore_interface_config(self, intf, vcpe = None):
-        if intf in self.interface_map:
-            ip = self.interface_map[intf]['ip']
-            gw = self.interface_map[intf]['gw']
-            del self.interface_map[intf]
-            cmds = []
-            if vcpe is not None:
-                shutil.copy('/etc/resolv.conf.orig', '/etc/resolv.conf')
-                #bounce the vcpes to clear default gw
-                cmds.append('ifconfig {} 0 down'.format(vcpe))
-                cmds.append('ifconfig {} 0 up'.format(vcpe))
-            cmds.append('ifconfig {} {} up'.format(intf, ip))
-            if gw and gw != '0.0.0.0':
-                cmds.append('route add default gw {} dev {}'.format(gw, intf))
-            for cmd in cmds:
-                os.system(cmd)
-
-    def vcpe_get_dhcp(self, vcpe, mgmt = 'eth0'):
-        self.save_interface_config(mgmt)
-        getstatusoutput('pkill -9 dhclient')
-        st, output = getstatusoutput('dhclient -q {}'.format(vcpe))
-        getstatusoutput('pkill -9 dhclient')
-        vcpe_ip = get_ip(vcpe)
-        if vcpe_ip is None:
-            self.restore_interface_config(mgmt)
-            return None
-        if output:
-            #workaround for docker container apparmor that prevents moving dhclient resolv.conf
-            start = output.find('/etc/resolv.conf')
-            if start >= 0:
-                end = output.find("'", start)
-                dns_file = output[start:end]
-                if os.access(dns_file, os.F_OK):
-                    shutil.copy(dns_file, '/etc/resolv.conf')
-
-        default_gw, default_gw_device = get_default_gw()
-        if default_gw and default_gw_device == vcpe:
-            return vcpe_ip
-        self.restore_interface_config(mgmt, vcpe = vcpe)
-        return None
-
-    #these need to first get dhcp through dhclient on vcpe interfaces (using OltConfig get_vcpes())
     def test_vsg_external_connectivity_sending_icmp_echo_requests(self):
         vcpe = self.vcpe_dhcp
         mgmt = 'eth0'
         host = '8.8.8.8'
         self.success = False
         assert_not_equal(vcpe, None)
-        vcpe_ip = self.vcpe_get_dhcp(vcpe, mgmt = mgmt)
+        vcpe_ip = VSGAccess.vcpe_get_dhcp(vcpe, mgmt = mgmt)
         assert_not_equal(vcpe_ip, None)
         log.info('Got DHCP IP %s for %s' %(vcpe_ip, vcpe))
         log.info('Sending icmp echo requests to external network 8.8.8.8')
         st, _ = getstatusoutput('ping -c 3 8.8.8.8')
-        self.restore_interface_config(mgmt, vcpe = vcpe)
+        VSGAccess.restore_interface_config(mgmt, vcpe = vcpe)
         assert_equal(st, 0)
 
-    def test_vsg_external_connectivity_sending_icmp_ping_on_different_interface(self):
-        host = '8.8.8.8'
-        self.success = False
-        def mac_recv_task():
-            def recv_cb(pkt):
-                log.info('Recieved icmp echo reply which is not expected')
-                self.success = True
-            sniff(count=1, timeout=5,
-                 lfilter = lambda p: IP in p and p[ICMP].type == 0,
-                 prn = recv_cb, iface = 'vcpe0.222.112')
-        t = threading.Thread(target = mac_recv_task)
-        t.start()
-        L3 = IP(dst = host)
-        pkt = L3/ICMP()
-        log.info('Sending icmp echo requests to external network')
-        send(pkt, count=3, iface = 'vcpe0.222.112')
-        t.join()
-        assert_equal(self.success, False)
-
-    def test_vsg_external_connectivity_pinging_with_single_tag_negative_scenario(self):
-        host = '8.8.8.8'
-        self.success = False
-        assert_not_equal(self.vcpe_dhcp_stag, None)
-        def mac_recv_task():
-            def recv_cb(pkt):
-                log.info('Recieved icmp echo reply which is not expected')
-                self.success = True
-            sniff(count=1, timeout=5,
-                  lfilter = lambda p: IP in p and p[ICMP].type == 0,
-                  prn = recv_cb, iface = self.vcpe_dhcp_stag)
-        t = threading.Thread(target = mac_recv_task)
-        t.start()
-        L3 = IP(dst = host)
-        pkt = L3/ICMP()
-        log.info('Sending icmp echo requests to external network')
-        send(pkt, count=3, iface = self.vcpe_dhcp_stag)
-        t.join()
-        assert_equal(self.success, False)
-
     def test_vsg_external_connectivity_pinging_to_google(self):
         host = 'www.google.com'
         vcpe = self.vcpe_dhcp
         mgmt = 'eth0'
         assert_not_equal(vcpe, None)
-        vcpe_ip = self.vcpe_get_dhcp(vcpe, mgmt = mgmt)
+        vcpe_ip = VSGAccess.vcpe_get_dhcp(vcpe, mgmt = mgmt)
         assert_not_equal(vcpe_ip, None)
         log.info('Got DHCP IP %s for %s' %(vcpe_ip, vcpe))
         log.info('Sending icmp ping requests to %s' %host)
         st, _ = getstatusoutput('ping -c 1 {}'.format(host))
-        self.restore_interface_config(mgmt, vcpe = vcpe)
+        VSGAccess.restore_interface_config(mgmt, vcpe = vcpe)
         assert_equal(st, 0)
 
     def test_vsg_external_connectivity_pinging_to_non_existing_website(self):
@@ -531,12 +155,12 @@
         vcpe = self.vcpe_dhcp
         mgmt = 'eth0'
         assert_not_equal(vcpe, None)
-        vcpe_ip = self.vcpe_get_dhcp(vcpe, mgmt = mgmt)
+        vcpe_ip = VSGAccess.vcpe_get_dhcp(vcpe, mgmt = mgmt)
         assert_not_equal(vcpe_ip, None)
         log.info('Got DHCP IP %s for %s' %(vcpe_ip, vcpe))
         log.info('Sending icmp ping requests to non existent host %s' %host)
         st, _ = getstatusoutput('ping -c 1 {}'.format(host))
-        self.restore_interface_config(mgmt, vcpe = vcpe)
+        VSGAccess.restore_interface_config(mgmt, vcpe = vcpe)
         assert_not_equal(st, 0)
 
     def test_vsg_external_connectivity_ping_to_google_with_ttl_1(self):
@@ -544,12 +168,12 @@
         vcpe = self.vcpe_dhcp
         mgmt = 'eth0'
         assert_not_equal(vcpe, None)
-        vcpe_ip = self.vcpe_get_dhcp(vcpe, mgmt = mgmt)
+        vcpe_ip = VSGAccess.vcpe_get_dhcp(vcpe, mgmt = mgmt)
         assert_not_equal(vcpe_ip, None)
         log.info('Got DHCP IP %s for %s' %(vcpe_ip, vcpe))
         log.info('Sending icmp ping requests to host %s with ttl 1' %host)
         st, _ = getstatusoutput('ping -c 1 -t 1 {}'.format(host))
-        self.restore_interface_config(mgmt, vcpe = vcpe)
+        VSGAccess.restore_interface_config(mgmt, vcpe = vcpe)
         assert_not_equal(st, 0)
 
     def test_vsg_for_external_connectivity_with_wan_interface_toggle_in_vcpe_container(self):
@@ -559,29 +183,29 @@
         assert_not_equal(vcpe, None)
         assert_not_equal(self.vcpe_dhcp, None)
         #first get dhcp on the vcpe interface
-        vcpe_ip = self.vcpe_get_dhcp(self.vcpe_dhcp, mgmt = mgmt)
+        vcpe_ip = VSGAccess.vcpe_get_dhcp(self.vcpe_dhcp, mgmt = mgmt)
         assert_not_equal(vcpe_ip, None)
         log.info('Got DHCP IP %s for %s' %(vcpe_ip, self.vcpe_dhcp))
         log.info('Sending ICMP pings to host %s' %(host))
         st, _ = getstatusoutput('ping -c 1 {}'.format(host))
         if st != 0:
-            self.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
+            VSGAccess.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
         assert_equal(st, 0)
         #bring down the wan interface and check again
-        st = self.vcpe_wan_down(vcpe)
+        st = VSGAccess.vcpe_wan_down(vcpe)
         if st is False:
-            self.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
+            VSGAccess.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
         assert_equal(st, True)
         st, _ = getstatusoutput('ping -c 1 {}'.format(host))
         if st == 0:
-            self.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
+            VSGAccess.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
         assert_not_equal(st, 0)
-        st = self.vcpe_wan_up(vcpe)
+        st = VSGAccess.vcpe_wan_up(vcpe)
         if st is False:
-            self.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
+            VSGAccess.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
         assert_equal(st, True)
         st, _ = getstatusoutput('ping -c 1 {}'.format(host))
-        self.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
+        VSGAccess.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
         assert_equal(st, 0)
 
     def test_vsg_for_external_connectivity_with_lan_interface_toggle_in_vcpe_container(self):
@@ -591,29 +215,29 @@
         assert_not_equal(vcpe, None)
         assert_not_equal(self.vcpe_dhcp, None)
         #first get dhcp on the vcpe interface
-        vcpe_ip = self.vcpe_get_dhcp(self.vcpe_dhcp, mgmt = mgmt)
+        vcpe_ip = VSGAccess.vcpe_get_dhcp(self.vcpe_dhcp, mgmt = mgmt)
         assert_not_equal(vcpe_ip, None)
         log.info('Got DHCP IP %s for %s' %(vcpe_ip, self.vcpe_dhcp))
         log.info('Sending ICMP pings to host %s' %(host))
         st, _ = getstatusoutput('ping -c 1 {}'.format(host))
         if st != 0:
-            self.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
+            VSGAccess.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
         assert_equal(st, 0)
         #bring down the lan interface and check again
-        st = self.vcpe_lan_down(vcpe)
+        st = VSGAccess.vcpe_lan_down(vcpe)
         if st is False:
-            self.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
+            VSGAccess.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
         assert_equal(st, True)
         st, _ = getstatusoutput('ping -c 1 {}'.format(host))
         if st == 0:
-            self.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
+            VSGAccess.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
         assert_not_equal(st, 0)
-        st = self.vcpe_lan_up(vcpe)
+        st = VSGAccess.vcpe_lan_up(vcpe)
         if st is False:
-            self.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
+            VSGAccess.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
         assert_equal(st, True)
         st, _ = getstatusoutput('ping -c 1 {}'.format(host))
-        self.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
+        VSGAccess.restore_interface_config(mgmt, vcpe = self.vcpe_dhcp)
         assert_equal(st, 0)
 
     def test_vsg_for_ping_from_vsg_to_external_network(self):
