diff --git a/src/test/utils/CordContainer.py b/src/test/utils/CordContainer.py
index b2ce27c..ccc59b0 100644
--- a/src/test/utils/CordContainer.py
+++ b/src/test/utils/CordContainer.py
@@ -38,14 +38,7 @@
         self.image_name = image + ':' + tag
         self.id = None
         self.command = command
-        if quagga_config is not None:
-            self.bridge = quagga_config['bridge']
-            self.ipaddress = quagga_config['ip']
-            self.mask = quagga_config['mask']
-        else:
-            self.bridge = None
-            self.ipaddress = None
-            self.mask = None
+        self.quagga_config = quagga_config
 
     @classmethod
     def build_image(cls, dockerfile, tag, force=True, nocache=False):
@@ -118,36 +111,39 @@
                                          volumes = volumes, 
                                          host_config = host_config, stdin_open=stdin_open, tty = tty)
         self.dckr.start(container=self.name)
-        if self.bridge:
+        if self.quagga_config:
             self.connect_to_br()
         self.id = ctn['Id']
         return ctn
 
     def connect_to_br(self):
+        index = 0
         with docker_netns(self.name) as pid:
-            ip = IPRoute()
-            br = ip.link_lookup(ifname=self.bridge)
-            if len(br) == 0:
-                ip.link_create(ifname=self.bridge, kind='bridge')
-                br = ip.link_lookup(ifname=self.bridge)
-            br = br[0]
-            ip.link('set', index=br, state='up')
-
-            ifs = ip.link_lookup(ifname=self.name)
-            if len(ifs) > 0:
-               ip.link_remove(ifs[0])
-
-            ip.link_create(ifname=self.name, kind='veth', peer=pid)
-            host = ip.link_lookup(ifname=self.name)[0]
-            ip.link('set', index=host, master=br)
-            ip.link('set', index=host, state='up')
-            guest = ip.link_lookup(ifname=pid)[0]
-            ip.link('set', index=guest, net_ns_fd=pid)
-            with Namespace(pid, 'net'):
+            for quagga_config in self.quagga_config:
                 ip = IPRoute()
-                ip.link('set', index=guest, ifname='eth1')
-                ip.addr('add', index=guest, address=self.ipaddress, mask=self.mask)
-                ip.link('set', index=guest, state='up')
+                br = ip.link_lookup(ifname=quagga_config['bridge'])
+                if len(br) == 0:
+                    ip.link_create(ifname=quagga_config['bridge'], kind='bridge')
+                    br = ip.link_lookup(ifname=quagga_config['bridge'])
+                br = br[0]
+                ip.link('set', index=br, state='up')
+                ifname = '{0}-{1}'.format(self.name, index)
+                ifs = ip.link_lookup(ifname=ifname)
+                if len(ifs) > 0:
+                   ip.link_remove(ifs[0])
+                peer_ifname = '{0}-{1}'.format(pid, index)
+                ip.link_create(ifname=ifname, kind='veth', peer=peer_ifname)
+                host = ip.link_lookup(ifname=ifname)[0]
+                ip.link('set', index=host, master=br)
+                ip.link('set', index=host, state='up')
+                guest = ip.link_lookup(ifname=peer_ifname)[0]
+                ip.link('set', index=guest, net_ns_fd=pid)
+                with Namespace(pid, 'net'):
+                    ip = IPRoute()
+                    ip.link('set', index=guest, ifname='eth{}'.format(index+1))
+                    ip.addr('add', index=guest, address=quagga_config['ip'], mask=quagga_config['mask'])
+                    ip.link('set', index=guest, state='up')
+                index += 1
 
     def execute(self, cmd, tty = True, stream = False, shell = False):
         res = 0
@@ -168,7 +164,7 @@
 
 class Onos(Container):
 
-    quagga_config = { 'bridge' : 'quagga-br', 'ip': '10.10.0.4', 'mask' : 16 }
+    quagga_config = ( { 'bridge' : 'quagga-br', 'ip': '10.10.0.4', 'mask' : 16 }, )
     env = { 'ONOS_APPS' : 'drivers,openflow,proxyarp,aaa,igmp,vrouter' }
     ports = [ 8181, 8101, 9876, 6653, 6633, 2000, 2620 ]
     host_config_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'setup/onos-config')
@@ -234,7 +230,9 @@
                        host_config = host_config, tty = True)
 
 class Quagga(Container):
-    quagga_config = { 'bridge' : 'quagga-br', 'ip': '10.10.0.3', 'mask' : 16 }
+    quagga_config = ( { 'bridge' : 'quagga-br', 'ip': '10.10.0.3', 'mask' : 16 }, 
+                      { 'bridge' : 'quagga-br', 'ip': '192.168.10.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'
diff --git a/src/test/vrouter/vrouterTest.py b/src/test/vrouter/vrouterTest.py
index 8fd5adb..e4778fe 100644
--- a/src/test/vrouter/vrouterTest.py
+++ b/src/test/vrouter/vrouterTest.py
@@ -43,11 +43,11 @@
     test_path = os.path.dirname(os.path.realpath(__file__))
     quagga_config_path = os.path.join(test_path, '..', 'setup/quagga-config')
     onos_config_path = os.path.join(test_path, '..', 'setup/onos-config')
-    GATEWAY = '172.17.0.50'
+    GATEWAY = '192.168.10.50'
     INGRESS_PORT = 1
     EGRESS_PORT = 2
     MAX_PORTS = 100
-    peer_list = ['172.17.0.50', '172.17.0.51']
+    peer_list = [ ('192.168.10.1', '00:00:00:00:00:01'), ('192.168.11.1', '00:00:00:00:02:01'), ]
     network_list = []
 
     @classmethod
@@ -97,7 +97,7 @@
     @classmethod
     def vrouter_host_load(cls):
         index = 1
-        for host in cls.peer_list:
+        for host,_ in cls.peer_list:
             iface = cls.port_map[index]
             index += 1
             config_cmds = ( 'ifconfig {0} {1}'.format(iface, host),
@@ -109,7 +109,7 @@
     @classmethod
     def vrouter_host_unload(cls):
         index = 1
-        for host in cls.peer_list:
+        for host,_ in cls.peer_list:
             iface = cls.port_map[index]
             index += 1
             config_cmds = ('ifconfig {} 0'.format(iface), )
@@ -181,13 +181,13 @@
     @classmethod
     def generate_vrouter_conf(cls, networks = 4, peers = 1):
         num = 0
-        start_peer = ( 172 << 24) | ( 17 << 16)  |  (0 << 8) | 100
-        end_peer =   ( 172 << 24 ) | (17 << 16)  |  (0 << 8) | 150
+        start_peer = ( 192 << 24) | ( 168 << 16)  |  (10 << 8) | 0
+        end_peer =   ( 200 << 24 ) | (168 << 16)  |  (10 << 8) | 0
         local_network = end_peer + 1
         ports_dict = { 'ports' : {} }
         interface_list = []
         peer_list = []
-        for n in xrange(start_peer, end_peer):
+        for n in xrange(start_peer, end_peer, 256):
             port_map = ports_dict['ports']
             port = num + 1 if num < cls.MAX_PORTS - 1 else cls.MAX_PORTS - 1
             device_port_key = '{0}/{1}'.format(cls.device_id, port)
@@ -196,12 +196,14 @@
             except:
                 port_map[device_port_key] = { 'interfaces' : [] }
                 interfaces = port_map[device_port_key]['interfaces']
-            ip = local_network + num
+            ip = n + 2
+            peer_ip = n + 1
             ips = '%d.%d.%d.%d/24'%( (ip >> 24) & 0xff, ( (ip >> 16) & 0xff ), ( (ip >> 8 ) & 0xff ), ip & 0xff)
-            peer = '%d.%d.%d.%d' % ( (n >> 24) & 0xff, ( ( n >> 16) & 0xff ), ( (n >> 8 ) & 0xff ), n & 0xff )
-            peer_list.append(peer)
+            peer = '%d.%d.%d.%d' % ( (peer_ip >> 24) & 0xff, ( ( peer_ip >> 16) & 0xff ), ( (peer_ip >> 8 ) & 0xff ), peer_ip & 0xff )
+            mac = RandMAC()._fix()
+            peer_list.append((peer, mac))
             if num < cls.MAX_PORTS - 1:
-                interface_dict = { 'name' : 'b1-{}'.format(port), 'ips': [ips], 'mac' : '00:00:00:00:00:01' }
+                interface_dict = { 'name' : 'b1-{}'.format(port), 'ips': [ips], 'mac' : mac }
                 interfaces.append(interface_dict)
                 interface_list.append(interface_dict['name'])
             else:
@@ -233,14 +235,13 @@
         net_list = []
         peer_list = cls.peer_list
         network_list = []
-        for n in xrange(start_network, end_network):
-            if n & 255 == 0:
-                net = '%d.%d.%d.0'%( (n >> 24) & 0xff, ( ( n >> 16) & 0xff ), ( (n >> 8 ) & 0xff ) )
-                network_list.append(net)
-                gateway = peer_list[num % len(peer_list)]
-                net_route = 'ip route {0}/24 {1}'.format(net, gateway)
-                net_list.append(net_route)
-                num += 1
+        for n in xrange(start_network, end_network, 256):
+            net = '%d.%d.%d.0'%( (n >> 24) & 0xff, ( ( n >> 16) & 0xff ), ( (n >> 8 ) & 0xff ) )
+            network_list.append(net)
+            gateway = peer_list[num % len(peer_list)][0]
+            net_route = 'ip route {0}/24 {1}'.format(net, gateway)
+            net_list.append(net_route)
+            num += 1
             if num == networks:
                 break
         cls.network_list = network_list
@@ -301,7 +302,7 @@
             for i in xrange(num_ips):
                 octets[-1] = str(int(octets[-1]) + 1)
                 dst_ip = '.'.join(octets)
-                dst_mac = '00:00:00:00:00:01'
+                dst_mac = self.peer_list[ num % peers ] [1] #'00:00:00:00:00:01'
                 port = (num % peers)
                 ingress = port + 1
                 #Since peers are on the same network
@@ -329,42 +330,62 @@
 
     def test_vrouter_1(self):
         '''Test vrouter with 5 routes'''
-        res = self.__vrouter_network_verify(5)
+        res = self.__vrouter_network_verify(5, peers = 1)
         assert_equal(res, True)
 
     def test_vrouter_2(self):
-        '''Test vrouter with 50 routes'''
-        res = self.__vrouter_network_verify(50)
+        '''Test vrouter with 5 routes with 2 peers'''
+        res = self.__vrouter_network_verify(5, peers = 2)
         assert_equal(res, True)
 
     def test_vrouter_3(self):
-        '''Test vrouter with 100 routes'''
-        res = self.__vrouter_network_verify(100)
+        '''Test vrouter with 6 routes with 3 peers'''
+        res = self.__vrouter_network_verify(6, peers = 3)
         assert_equal(res, True)
 
     def test_vrouter_4(self):
-        '''Test vrouter with 300 routes'''
-        res = self.__vrouter_network_verify(300)
+        '''Test vrouter with 50 routes'''
+        res = self.__vrouter_network_verify(50, peers = 1)
         assert_equal(res, True)
 
     def test_vrouter_5(self):
+        '''Test vrouter with 50 routes and 5 peers'''
+        res = self.__vrouter_network_verify(50, peers = 5)
+        assert_equal(res, True)
+
+    def test_vrouter_6(self):
+        '''Test vrouter with 100 routes'''
+        res = self.__vrouter_network_verify(100, peers = 1)
+        assert_equal(res, True)
+
+    def test_vrouter_7(self):
+        '''Test vrouter with 100 routes and 10 peers'''
+        res = self.__vrouter_network_verify(100, peers = 10)
+        assert_equal(res, True)
+
+    def test_vrouter_8(self):
+        '''Test vrouter with 300 routes'''
+        res = self.__vrouter_network_verify(300, peers = 1)
+        assert_equal(res, True)
+
+    def test_vrouter_9(self):
         '''Test vrouter with 1000 routes'''
-        res = self.__vrouter_network_verify(1000)
+        res = self.__vrouter_network_verify(1000, peers = 1)
         assert_equal(res, True)
     
-    def test_vrouter_6(self):
+    def test_vrouter_10(self):
         '''Test vrouter with 10000 routes'''
-        res = self.__vrouter_network_verify(10000)
+        res = self.__vrouter_network_verify(10000, peers = 1)
         assert_equal(res, True)
     
     @nottest
-    def test_vrouter_7(self):
+    def test_vrouter_11(self):
         '''Test vrouter with 100000 routes'''
-        res = self.__vrouter_network_verify(100000)
+        res = self.__vrouter_network_verify(100000, peers = 1)
         assert_equal(res, True)
 
     @nottest
-    def test_vrouter_8(self):
+    def test_vrouter_12(self):
         '''Test vrouter with 1000000 routes'''
-        res = self.__vrouter_network_verify(1000000)
+        res = self.__vrouter_network_verify(1000000, peers = 1)
         assert_equal(res, True)
