diff --git a/src/test/setup/cord-test.py b/src/test/setup/cord-test.py
index 2dff4e1..854c007 100755
--- a/src/test/setup/cord-test.py
+++ b/src/test/setup/cord-test.py
@@ -179,51 +179,6 @@
             print('Removing test container %s' %self.name)
             self.kill(remove=True)
 
-class Quagga(Container):
-    quagga_config = { 'bridge' : 'quagga-br', 'ip': '10.10.0.3', 'mask' : 16 }
-    ports = [ 179, 2601, 2602, 2603, 2604, 2605, 2606 ]
-    host_quagga_config = os.path.join(CordTester.tester_base, 'quagga-config')
-    guest_quagga_config = '/root/config'
-    host_guest_map = ( (host_quagga_config, guest_quagga_config), )
-
-    def __init__(self, name = 'cord-quagga', image = 'cord-test/quagga', tag = 'latest', boot_delay = 60):
-        super(Quagga, self).__init__(name, image, tag = tag, quagga_config = self.quagga_config)
-        if not self.img_exists():
-            self.build_image(image)
-        if not self.exists():
-            self.remove_container(name, force=True)
-            host_config = self.create_host_config(port_list = self.ports, 
-                                                  host_guest_map = self.host_guest_map, 
-                                                  privileged = True)
-            volumes = []
-            for _,g in self.host_guest_map:
-                volumes.append(g)
-            self.start(ports = self.ports,
-                       host_config = host_config, 
-                       volumes = volumes, tty = True)
-            print('Starting Quagga on container %s' %self.name)
-            self.execute('{}/start.sh'.format(self.guest_quagga_config))
-
-    @classmethod
-    def build_image(cls, image):
-        onos_quagga_ip = Onos.quagga_config['ip']
-        print('Building Quagga image %s' %image)
-        dockerfile = '''
-FROM ubuntu:latest
-WORKDIR /root
-RUN useradd -M quagga
-RUN mkdir /var/log/quagga && chown quagga:quagga /var/log/quagga
-RUN mkdir /var/run/quagga && chown quagga:quagga /var/run/quagga
-RUN apt-get update && apt-get install -qy git autoconf libtool gawk make telnet libreadline6-dev
-RUN git clone git://git.sv.gnu.org/quagga.git quagga && \
-(cd quagga && git checkout HEAD && ./bootstrap.sh && \
-sed -i -r 's,htonl.*?\(INADDR_LOOPBACK\),inet_addr\("{0}"\),g' zebra/zebra_fpm.c && \
-./configure --enable-fpm --disable-doc --localstatedir=/var/run/quagga && make && make install)
-RUN ldconfig
-'''.format(onos_quagga_ip)
-        super(Quagga, cls).build_image(dockerfile, image)
-        print('Done building image %s' %image)
-
 ##default onos/radius/test container images and names
 onos_image_default='onosproject/onos:latest'
 nose_image_default='cord-test/nose:latest'
diff --git a/src/test/utils/CordContainer.py b/src/test/utils/CordContainer.py
index c7a6850..68b9471 100644
--- a/src/test/utils/CordContainer.py
+++ b/src/test/utils/CordContainer.py
@@ -233,3 +233,53 @@
                        volumes = volumes, 
                        host_config = host_config, tty = True)
 
+class Quagga(Container):
+    quagga_config = { 'bridge' : 'quagga-br', 'ip': '10.10.0.3', 'mask' : 16 }
+    ports = [ 179, 2601, 2602, 2603, 2604, 2605, 2606 ]
+    host_quagga_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'setup/quagga-config')
+    guest_quagga_config = '/root/config'
+    quagga_config_file = os.path.join(guest_quagga_config, 'testrib.conf')
+    host_guest_map = ( (host_quagga_config, guest_quagga_config), )
+    
+    def __init__(self, name = 'cord-quagga', image = 'cord-test/quagga', tag = 'latest', 
+                 boot_delay = 15, restart = False, config_file = quagga_config_file):
+        super(Quagga, self).__init__(name, image, tag = tag, quagga_config = self.quagga_config)
+        if not self.img_exists():
+            self.build_image(image)
+        if restart is True and self.exists():
+            self.kill()
+        if not self.exists():
+            self.remove_container(name, force=True)
+            host_config = self.create_host_config(port_list = self.ports, 
+                                                  host_guest_map = self.host_guest_map, 
+                                                  privileged = True)
+            volumes = []
+            for _,g in self.host_guest_map:
+                volumes.append(g)
+            self.start(ports = self.ports,
+                       host_config = host_config, 
+                       volumes = volumes, tty = True)
+            print('Starting Quagga on container %s' %self.name)
+            self.execute('{0}/start.sh {1}'.format(self.guest_quagga_config, config_file))
+            time.sleep(boot_delay)
+
+    @classmethod
+    def build_image(cls, image):
+        onos_quagga_ip = Onos.quagga_config['ip']
+        print('Building Quagga image %s' %image)
+        dockerfile = '''
+FROM ubuntu:latest
+WORKDIR /root
+RUN useradd -M quagga
+RUN mkdir /var/log/quagga && chown quagga:quagga /var/log/quagga
+RUN mkdir /var/run/quagga && chown quagga:quagga /var/run/quagga
+RUN apt-get update && apt-get install -qy git autoconf libtool gawk make telnet libreadline6-dev
+RUN git clone git://git.sv.gnu.org/quagga.git quagga && \
+(cd quagga && git checkout HEAD && ./bootstrap.sh && \
+sed -i -r 's,htonl.*?\(INADDR_LOOPBACK\),inet_addr\("{0}"\),g' zebra/zebra_fpm.c && \
+./configure --enable-fpm --disable-doc --localstatedir=/var/run/quagga && make && make install)
+RUN ldconfig
+'''.format(onos_quagga_ip)
+        super(Quagga, cls).build_image(dockerfile, image)
+        print('Done building image %s' %image)
+
diff --git a/src/test/utils/CordTestServer.py b/src/test/utils/CordTestServer.py
index dbf20f3..806b36b 100644
--- a/src/test/utils/CordTestServer.py
+++ b/src/test/utils/CordTestServer.py
@@ -1,7 +1,7 @@
 import SocketServer as socketserver
 import threading
 import socket
-from CordContainer import Onos
+from CordContainer import Onos, Quagga
 from nose.tools import nottest
 
 ##Server to handle container restart requests from test container.
@@ -12,12 +12,32 @@
 
 class CordTestServer(socketserver.BaseRequestHandler):
 
+    def restart_onos(self, args):
+        print('Restarting ONOS')
+        onos = Onos(restart = True)
+        self.request.sendall('DONE')
+
+    def restart_quagga(self, args):
+        if args is None:
+            args = Quagga.quagga_config_file
+        print('Restarting QUAGGA with config file %s'%args)
+        quagga = Quagga(restart = True, config_file = args)
+        self.request.sendall('DONE')
+
+    callback_table = { 'RESTART_ONOS' : restart_onos,
+                       'RESTART_QUAGGA' : restart_quagga,
+                     }
+
     def handle(self):
         data = self.request.recv(1024).strip()
-        if data == 'RESTART_ONOS':
-            print('Restarting ONOS')
-            onos = Onos(restart = True)
-            self.request.sendall('DONE')
+        cmd = data.split()[0]
+        try:
+            args = ' '.join(data.split()[1:])
+        except:
+            args = None
+
+        if self.callback_table.has_key(cmd):
+            self.callback_table[cmd](self, args)
 
 class ThreadedTestServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
     allow_reuse_address = True
@@ -43,6 +63,21 @@
     s.connect( (CORD_TEST_HOST, CORD_TEST_PORT) )
     s.sendall('RESTART_ONOS\n')
     data = s.recv(1024).strip()
+    s.close()
+    if data == 'DONE':
+        return True
+    return False
+
+@nottest
+def cord_test_quagga_restart(config_file = None):
+    '''Send QUAGGA restart to server'''
+    if config_file is None:
+        config_file = Quagga.quagga_config_file
+    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    s.connect( (CORD_TEST_HOST, CORD_TEST_PORT) )
+    s.sendall('RESTART_QUAGGA {}\n'.format(config_file))
+    data = s.recv(1024).strip()
+    s.close()
     if data == 'DONE':
         return True
     return False
diff --git a/src/test/vrouter/vrouterTest.py b/src/test/vrouter/vrouterTest.py
index 9e9f881..37c1523 100644
--- a/src/test/vrouter/vrouterTest.py
+++ b/src/test/vrouter/vrouterTest.py
@@ -5,8 +5,8 @@
 from OltConfig import OltConfig
 from OnosFlowCtrl import OnosFlowCtrl, get_mac
 from onosclidriver import OnosCliDriver
-from CordContainer import Container, Onos
-from CordTestServer import cord_test_onos_restart
+from CordContainer import Container, Onos, Quagga
+from CordTestServer import cord_test_onos_restart, cord_test_quagga_restart
 from portmaps import g_subscriber_port_map
 import threading
 import time
@@ -14,13 +14,6 @@
 import json
 log.setLevel('INFO')
 
-class Quagga(Container):
-    quagga_config = '/root/config'
-    def __init__(self, name = 'cord-quagga', image = 'cord-test/quagga', tag = 'latest'):
-        super(Quagga, self).__init__(name, image, tag = tag)
-        if not self.exists():
-            raise Exception('Quagga container was not started by cord-test')
-        
 class vrouter_exchange(unittest.TestCase):
 
     apps = ('org.onosproject.vrouter', 'org.onosproject.fwd')
@@ -128,16 +121,14 @@
         return cord_test_onos_restart()
 
     @classmethod
-    def start_quagga(cls, stop = True, networks = 4, gateway = GATEWAY):
-        quagga = Quagga()
-        log.info('Starting Quagga on container %s with %d networks' %(quagga.name, networks))
-        if stop is True:
-            quagga.execute('{}/stop.sh'.format(Quagga.quagga_config))
+    def start_quagga(cls, networks = 4, gateway = GATEWAY):
+        log.info('Restarting Quagga container with configuration for %d networks' %(networks))
         config = cls.generate_conf(networks = networks, gateway = gateway)
-        with open('{}/testrib_gen.conf'.format(cls.quagga_config_path), 'w') as f:
+        host_config_file = '{}/testrib_gen.conf'.format(Quagga.host_quagga_config)
+        guest_config_file = os.path.join(Quagga.guest_quagga_config, 'testrib_gen.conf')
+        with open(host_config_file, 'w') as f:
             f.write(config)
-        quagga.execute('{0}/start.sh {1}/testrib_gen.conf'.format(Quagga.quagga_config, Quagga.quagga_config))
-        time.sleep(10)
+        cord_test_quagga_restart(config_file = guest_config_file)
 
     @classmethod
     def generate_vrouter_conf(cls, networks = 4):
@@ -209,7 +200,7 @@
         vrouter_configs = cls.vrouter_config_get(networks = networks)
         cls.start_onos(network_cfg = vrouter_configs)
         ##Start quagga
-        cls.start_quagga(networks = networks, stop = True, gateway = cls.GATEWAY)
+        cls.start_quagga(networks = networks, gateway = cls.GATEWAY)
         return vrouter_configs
     
     def vrouter_port_send_recv(self, ingress, egress, dst_mac, dst_ip):
@@ -255,7 +246,7 @@
         log.info('Discovered hosts: %s' %hosts)
         routes = json.loads(self.cli.routes(jsonFormat = True))
         log.info('Routes: %s' %routes)
-        #assert_equal(len(routes['routes4']), networks)
+        assert_equal(len(routes['routes4']), networks)
         flows = json.loads(self.cli.flows(jsonFormat = True))
         flows = filter(lambda f: f['flows'], flows)
         #log.info('Flows: %s' %flows)
@@ -270,7 +261,7 @@
         assert_equal(res, True)
 
     def test_vrouter_2(self):
-        '''Test vrouter with 20 routes'''
+        '''Test vrouter with 50 routes'''
         res = self.__vrouter_network_verify(50)
         assert_equal(res, True)
 
@@ -280,6 +271,30 @@
         assert_equal(res, True)
 
     def test_vrouter_4(self):
-        '''Test vrouter with 200 routes'''
+        '''Test vrouter with 300 routes'''
         res = self.__vrouter_network_verify(300)
         assert_equal(res, True)
+
+    @nottest
+    def test_vrouter_5(self):
+        '''Test vrouter with 1000 routes'''
+        res = self.__vrouter_network_verify(1000)
+        assert_equal(res, True)
+    
+    @nottest
+    def test_vrouter_6(self):
+        '''Test vrouter with 10000 routes'''
+        res = self.__vrouter_network_verify(10000)
+        assert_equal(res, True)
+
+    @nottest
+    def test_vrouter_7(self):
+        '''Test vrouter with 100000 routes'''
+        res = self.__vrouter_network_verify(100000)
+        assert_equal(res, True)
+
+    @nottest
+    def test_vrouter_8(self):
+        '''Test vrouter with 1000000 routes'''
+        res = self.__vrouter_network_verify(1000000)
+        assert_equal(res, True)
