diff --git a/src/test/cbench/cbenchTest.py b/src/test/cbench/cbenchTest.py
index 869b71a..4948199 100644
--- a/src/test/cbench/cbenchTest.py
+++ b/src/test/cbench/cbenchTest.py
@@ -20,7 +20,8 @@
 from nose.twistedtools import reactor, deferred
 from twisted.internet import defer
 from OnosCtrl import OnosCtrl
-from scapy.all import *
+from CordTestUtils import log_test as log
+
 log.setLevel('INFO')
 
 class cbench_exchange(unittest.TestCase):
@@ -74,7 +75,7 @@
         log.info('Starting back switch with command: \"%s\"', cmd)
         os.system(cmd)
         time.sleep(3)
-        
+
     @deferred(CBENCH_TIMEOUT)
     def test_cbench_igmp(self):
         df = defer.Deferred()
diff --git a/src/test/cli/clicommon.py b/src/test/cli/clicommon.py
index 66b1845..8b2654a 100644
--- a/src/test/cli/clicommon.py
+++ b/src/test/cli/clicommon.py
@@ -1,12 +1,12 @@
-# 
+#
 # Copyright 2016-present Ciena Corporation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 # http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -15,7 +15,7 @@
 #
 import os,sys
 from utilities import Utilities, utilities
-from scapy.all import *
+from CordTestUtils import log_test as log
 
 #log.setLevel('INFO')
 class MAIN(object):
diff --git a/src/test/cluster/clusterTest.py b/src/test/cluster/clusterTest.py
index ab919a0..ed5f84a 100644
--- a/src/test/cluster/clusterTest.py
+++ b/src/test/cluster/clusterTest.py
@@ -17,7 +17,7 @@
 from scapy.all import *
 from OnosCtrl import OnosCtrl
 from OltConfig import OltConfig
-from CordTestUtils import get_mac, get_controller, get_controllers
+from CordTestUtils import get_mac, get_controller, get_controllers, log_test
 from OnosFlowCtrl import OnosFlowCtrl
 from nose.twistedtools import reactor, deferred
 from twisted.internet import defer
@@ -39,7 +39,7 @@
 import json
 import random
 import collections
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 class cluster_exchange(CordLogger):
     test_path = os.path.dirname(os.path.realpath(__file__))
@@ -96,9 +96,9 @@
             result = None
 
         if result is None:
-            log.info('Leaders command failure for controller %s' %controller)
+            log_test.info('Leaders command failure for controller %s' %controller)
         else:
-            log.info('Leaders returned: %s' %result)
+            log_test.info('Leaders returned: %s' %result)
         self.cliExit()
         return result
 
@@ -108,7 +108,7 @@
         try:
             self.cli.shutdown(timeout = 10)
         except:
-            log.info('Graceful shutdown of ONOS failed for controller: %s' %controller)
+            log_test.info('Graceful shutdown of ONOS failed for controller: %s' %controller)
             status = False
 
         self.cliExit()
@@ -142,7 +142,7 @@
 	    while tries <= 10:
                 cluster_summary = json.loads(self.cli.summary(jsonFormat = True))
                 if cluster_summary:
-	            log.info("cluster 'summary' command output is %s"%cluster_summary)
+	            log_test.info("cluster 'summary' command output is %s"%cluster_summary)
 		    nodes = cluster_summary['nodes']
 		    if verify:
 		        if nodes == onos_instances:
@@ -175,7 +175,7 @@
             while tries <= 10:
                 cluster_nodes = json.loads(self.cli.nodes(jsonFormat = True))
                 if cluster_nodes:
-                    log.info("cluster 'nodes' output is %s"%cluster_nodes)
+                    log_test.info("cluster 'nodes' output is %s"%cluster_nodes)
                     if nodes_filter:
                         cluster_nodes = nodes_filter(cluster_nodes)
                     cluster_ips = map(lambda c: c['id'], cluster_nodes)
@@ -222,14 +222,14 @@
 	    cli = self.cliEnter(controller = controller)
 	    while tries <= 10:
 	        roles = json.loads(self.cli.roles(jsonFormat = True))
-	        log.info("cluster 'roles' command output is %s"%roles)
+	        log_test.info("cluster 'roles' command output is %s"%roles)
 	        if roles:
 	            for device in roles:
-	                log.info('Verifying device info in line %s'%device)
+	                log_test.info('Verifying device info in line %s'%device)
 	                if device['id'] == device_id:
 	                    master = str(device['master'])
 		            standbys = map(lambda d: str(d), device['standbys'])
-		            log.info('Master and standbys for device %s are %s and %s'%(device_id, master, standbys))
+		            log_test.info('Master and standbys for device %s are %s and %s'%(device_id, master, standbys))
 			    self.cliExit()
 		            return master, standbys
 		    self.cliExit()
@@ -252,13 +252,13 @@
             while tries <= 10:
 		device_dict = {}
                 roles = json.loads(self.cli.roles(jsonFormat = True))
-                log.info("cluster 'roles' command output is %s"%roles)
+                log_test.info("cluster 'roles' command output is %s"%roles)
                 if roles:
                     for device in roles:
 			device_dict[str(device['id'])]= {'master':str(device['master']),'standbys':device['standbys']}
                         for i in range(len(device_dict[device['id']]['standbys'])):
 			    device_dict[device['id']]['standbys'][i] = str(device_dict[device['id']]['standbys'][i])
-                        log.info('master and standbys for device %s are %s and %s'%(device['id'],device_dict[device['id']]['master'],device_dict[device['id']]['standbys']))
+                        log_test.info('master and standbys for device %s are %s and %s'%(device['id'],device_dict[device['id']]['master'],device_dict[device['id']]['standbys']))
                     self.cliExit()
                     return device_dict
                 else:
@@ -280,10 +280,10 @@
             while tries <= 10:
 		device_list = []
                 devices = json.loads(self.cli.devices(jsonFormat = True))
-                log.info("cluster 'devices' command output is %s"%devices)
+                log_test.info("cluster 'devices' command output is %s"%devices)
                 if devices:
                     for device in devices:
-			log.info('device id is %s'%device['id'])
+			log_test.info('device id is %s'%device['id'])
 			device_list.append(str(device['id']))
                     self.cliExit()
                     return device_list
@@ -321,7 +321,7 @@
         time.sleep(60)
         master, standbys = self.get_cluster_current_master_standbys(controller=controller,device_id=device_id)
         assert_equal(master,new_master)
-	log.info('Cluster master changed to %s successfully'%new_master)
+	log_test.info('Cluster master changed to %s successfully'%new_master)
 
     def withdraw_cluster_current_mastership(self,master_ip=None,device_id=device_id,controller=None):
 	'''current master looses its mastership and hence new master will be elected'''
@@ -332,15 +332,15 @@
         time.sleep(60)
         new_master_ip, standbys = self.get_cluster_current_master_standbys(controller=controller,device_id=device_id)
         assert_not_equal(new_master_ip,master_ip)
-	log.info('Device-role of device %s successfully changed to none for controller %s'%(device_id,master_ip))
-	log.info('Cluster new master is %s'%new_master_ip)
+	log_test.info('Device-role of device %s successfully changed to none for controller %s'%(device_id,master_ip))
+	log_test.info('Cluster new master is %s'%new_master_ip)
 	return True
 
     def cluster_controller_restarts(self, graceful = False):
         controllers = get_controllers()
         ctlr_len = len(controllers)
         if ctlr_len <= 1:
-            log.info('ONOS is not running in cluster mode. This test only works for cluster mode')
+            log_test.info('ONOS is not running in cluster mode. This test only works for cluster mode')
             assert_greater(ctlr_len, 1)
 
         #this call would verify the cluster for once
@@ -357,15 +357,15 @@
                 ##check the logs for storage exception
                 _, output = onosLog.get_log(('ERROR', 'Exception',))
                 if output and output.find('StorageException$Timeout') >= 0:
-                    log.info('\nStorage Exception Timeout found on node: %s\n' %node)
-                    log.info('Dumping the ERROR and Exception logs for node: %s\n' %node)
-                    log.info('\n' + '-' * 50 + '\n')
-                    log.info('%s' %output)
-                    log.info('\n' + '-' * 50 + '\n')
+                    log_test.info('\nStorage Exception Timeout found on node: %s\n' %node)
+                    log_test.info('Dumping the ERROR and Exception logs for node: %s\n' %node)
+                    log_test.info('\n' + '-' * 50 + '\n')
+                    log_test.info('%s' %output)
+                    log_test.info('\n' + '-' * 50 + '\n')
                     failed = self.verify_leaders(controllers)
                     if failed:
-                        log.info('Leaders command failed on nodes: %s' %failed)
-                        log.error('Test failed on ITERATION %d' %iteration)
+                        log_test.info('Leaders command failed on nodes: %s' %failed)
+                        log_test.error('Test failed on ITERATION %d' %iteration)
                         CordLogger.archive_results(self._testMethodName,
                                                    controllers = controllers,
                                                    iteration = 'FAILED',
@@ -375,21 +375,21 @@
 
             try:
                 ips = self.get_cluster_current_member_ips(controller = adjacent_controller)
-                log.info('ONOS cluster formed with controllers: %s' %ips)
+                log_test.info('ONOS cluster formed with controllers: %s' %ips)
                 st = True
             except:
                 st = False
 
             failed = self.verify_leaders(controllers)
             if failed:
-                log.error('Test failed on ITERATION %d' %iteration)
+                log_test.error('Test failed on ITERATION %d' %iteration)
                 CordLogger.archive_results(self._testMethodName,
                                            controllers = controllers,
                                            iteration = 'FAILED',
                                            archive_partition = self.ARCHIVE_PARTITION)
             assert_equal(len(failed), 0)
             if st is False:
-                log.info('No storage exception and ONOS cluster was not formed successfully')
+                log_test.info('No storage exception and ONOS cluster was not formed successfully')
             else:
                 controller = None
 
@@ -402,14 +402,14 @@
             #index = random.randrange(0, ctlr_len)
             controller_name = onos_map[controllers[index]] if next_controller is None else onos_map[next_controller]
             controller = onos_map[controller_name]
-            log.info('ITERATION: %d. Restarting Controller %s' %(num + 1, controller_name))
+            log_test.info('ITERATION: %d. Restarting Controller %s' %(num + 1, controller_name))
             try:
                 #enable debug log for the other controllers before restarting this controller
                 adjacent_controllers = list( set(controllers) - set([controller]) )
                 self.log_set(controllers = adjacent_controllers)
                 self.log_set(app = 'io.atomix', controllers = adjacent_controllers)
                 if graceful is True:
-                    log.info('Gracefully shutting down controller: %s' %controller)
+                    log_test.info('Gracefully shutting down controller: %s' %controller)
                     self.onos_shutdown(controller)
                 cord_test_onos_restart(node = controller, timeout = 0)
                 self.log_set(controllers = controller)
@@ -439,7 +439,7 @@
         controllers = get_controllers()
         ctlr_len = len(controllers)
         if ctlr_len <= 1:
-            log.info('ONOS is not running in cluster mode. This test only works for cluster mode')
+            log_test.info('ONOS is not running in cluster mode. This test only works for cluster mode')
             assert_greater(ctlr_len, 1)
 
         #this call would verify the cluster for once
@@ -455,19 +455,19 @@
                 ##check the logs for storage exception
                 _, output = onosLog.get_log(('ERROR', 'Exception',))
                 if output and output.find('StorageException$Timeout') >= 0:
-                    log.info('\nStorage Exception Timeout found on node: %s\n' %node)
-                    log.info('Dumping the ERROR and Exception logs for node: %s\n' %node)
-                    log.info('\n' + '-' * 50 + '\n')
-                    log.info('%s' %output)
-                    log.info('\n' + '-' * 50 + '\n')
+                    log_test.info('\nStorage Exception Timeout found on node: %s\n' %node)
+                    log_test.info('Dumping the ERROR and Exception logs for node: %s\n' %node)
+                    log_test.info('\n' + '-' * 50 + '\n')
+                    log_test.info('%s' %output)
+                    log_test.info('\n' + '-' * 50 + '\n')
                     storage_exceptions.append(node)
 
             failed = self.verify_leaders(controller_list)
             if failed:
-                log.info('Leaders command failed on nodes: %s' %failed)
+                log_test.info('Leaders command failed on nodes: %s' %failed)
                 if storage_exceptions:
-                    log.info('Storage exception seen on nodes: %s' %storage_exceptions)
-                    log.error('Test failed on ITERATION %d' %iteration)
+                    log_test.info('Storage exception seen on nodes: %s' %storage_exceptions)
+                    log_test.error('Test failed on ITERATION %d' %iteration)
                     CordLogger.archive_results('test_cluster_single_controller_restarts',
                                                controllers = controllers,
                                                iteration = 'FAILED',
@@ -479,11 +479,11 @@
                 ips = self.get_cluster_current_member_ips(controller = ctlr,
                                                           nodes_filter = \
                                                           lambda nodes: [ n for n in nodes if n['state'] in [ 'ACTIVE', 'READY'] ])
-                log.info('ONOS cluster on node %s formed with controllers: %s' %(ctlr, ips))
+                log_test.info('ONOS cluster on node %s formed with controllers: %s' %(ctlr, ips))
                 if controller in ips and inclusive is False:
-                    log.info('Controller %s still ACTIVE on Node %s after it was shutdown' %(controller, ctlr))
+                    log_test.info('Controller %s still ACTIVE on Node %s after it was shutdown' %(controller, ctlr))
                 if controller not in ips and inclusive is True:
-                    log.info('Controller %s still INACTIVE on Node %s after it was restarted' %(controller, ctlr))
+                    log_test.info('Controller %s still INACTIVE on Node %s after it was restarted' %(controller, ctlr))
 
             return controller
 
@@ -495,7 +495,7 @@
         self.log_set(controllers = controllers)
         self.log_set(app = 'io.atomix', controllers = controllers)
         for num in range(tries):
-            log.info('ITERATION: %d. Shutting down Controller %s' %(num + 1, controller_name))
+            log_test.info('ITERATION: %d. Shutting down Controller %s' %(num + 1, controller_name))
             try:
                 cord_test_onos_shutdown(node = controller)
                 time.sleep(20)
@@ -505,7 +505,7 @@
             #check for exceptions on the adjacent nodes
             check_exception(num, controller)
             #Now restart the controller back
-            log.info('Restarting back the controller %s' %controller_name)
+            log_test.info('Restarting back the controller %s' %controller_name)
             cord_test_onos_restart(node = controller)
             self.log_set(controllers = controller)
             self.log_set(app = 'io.atomix', controllers = controller)
@@ -522,7 +522,7 @@
         controllers = get_controllers()
         ctlr_len = len(controllers)
         if ctlr_len <= 1:
-            log.info('ONOS is not running in cluster mode. This test only works for cluster mode')
+            log_test.info('ONOS is not running in cluster mode. This test only works for cluster mode')
             assert_greater(ctlr_len, 1)
 
         #this call would verify the cluster for once
@@ -536,19 +536,19 @@
                 ##check the logs for storage exception
                 _, output = onosLog.get_log(('ERROR', 'Exception',))
                 if output and output.find('StorageException$Timeout') >= 0:
-                    log.info('\nStorage Exception Timeout found on node: %s\n' %node)
-                    log.info('Dumping the ERROR and Exception logs for node: %s\n' %node)
-                    log.info('\n' + '-' * 50 + '\n')
-                    log.info('%s' %output)
-                    log.info('\n' + '-' * 50 + '\n')
+                    log_test.info('\nStorage Exception Timeout found on node: %s\n' %node)
+                    log_test.info('Dumping the ERROR and Exception logs for node: %s\n' %node)
+                    log_test.info('\n' + '-' * 50 + '\n')
+                    log_test.info('%s' %output)
+                    log_test.info('\n' + '-' * 50 + '\n')
                     storage_exceptions.append(node)
 
             failed = self.verify_leaders(controller_list)
             if failed:
-                log.info('Leaders command failed on nodes: %s' %failed)
+                log_test.info('Leaders command failed on nodes: %s' %failed)
                 if storage_exceptions:
-                    log.info('Storage exception seen on nodes: %s' %storage_exceptions)
-                    log.error('Test failed on ITERATION %d' %iteration)
+                    log_test.info('Storage exception seen on nodes: %s' %storage_exceptions)
+                    log_test.error('Test failed on ITERATION %d' %iteration)
                     CordLogger.archive_results('test_cluster_restarts',
                                                controllers = controllers,
                                                iteration = 'FAILED',
@@ -560,9 +560,9 @@
                 ips = self.get_cluster_current_member_ips(controller = ctlr,
                                                           nodes_filter = \
                                                           lambda nodes: [ n for n in nodes if n['state'] in [ 'ACTIVE', 'READY'] ])
-                log.info('ONOS cluster on node %s formed with controllers: %s' %(ctlr, ips))
+                log_test.info('ONOS cluster on node %s formed with controllers: %s' %(ctlr, ips))
                 if len(ips) != len(controllers):
-                    log.error('Test failed on ITERATION %d' %iteration)
+                    log_test.error('Test failed on ITERATION %d' %iteration)
                     CordLogger.archive_results('test_cluster_restarts',
                                                controllers = controllers,
                                                iteration = 'FAILED',
@@ -571,12 +571,12 @@
 
         tries = self.ITERATIONS
         for num in range(tries):
-            log.info('ITERATION: %d. Restarting cluster with controllers at %s' %(num+1, controllers))
+            log_test.info('ITERATION: %d. Restarting cluster with controllers at %s' %(num+1, controllers))
             try:
                 cord_test_restart_cluster()
                 self.log_set(controllers = controllers)
                 self.log_set(app = 'io.atomix', controllers = controllers)
-                log.info('Delaying before verifying cluster status')
+                log_test.info('Delaying before verifying cluster status')
                 time.sleep(60)
             except:
                 time.sleep(10)
@@ -594,7 +594,7 @@
     def test_cluster_formation_and_verification(self,onos_instances = ONOS_INSTANCES):
 	status = self.verify_cluster_status(onos_instances = onos_instances)
 	assert_equal(status, True)
-	log.info('Cluster exists with %d ONOS instances'%onos_instances)
+	log_test.info('Cluster exists with %d ONOS instances'%onos_instances)
 
     #nottest cluster not coming up properly if member goes down
     def test_cluster_adding_members(self, add = 2, onos_instances = ONOS_INSTANCES):
@@ -602,7 +602,7 @@
 	assert_equal(status, True)
         onos_ips = self.get_cluster_current_member_ips()
 	onos_instances = len(onos_ips)+add
-        log.info('Adding %d nodes to the ONOS cluster' %add)
+        log_test.info('Adding %d nodes to the ONOS cluster' %add)
         cord_test_onos_add_cluster(count = add)
 	status = self.verify_cluster_status(onos_instances=onos_instances)
         assert_equal(status, True)
@@ -614,7 +614,7 @@
         assert_equal(len(standbys),(onos_instances-1))
         onos_names_ips =  self.get_cluster_container_names_ips()
         master_onos_name = onos_names_ips[master]
-        log.info('Removing cluster current master %s'%(master))
+        log_test.info('Removing cluster current master %s'%(master))
         cord_test_onos_shutdown(node = master)
         time.sleep(60)
         onos_instances -= 1
@@ -622,7 +622,7 @@
         assert_equal(status, True)
 	new_master, standbys = self.get_cluster_current_master_standbys(controller=standbys[0])
 	assert_not_equal(master,new_master)
-	log.info('Successfully removed clusters master instance')
+	log_test.info('Successfully removed clusters master instance')
 
     def test_cluster_removing_one_member(self, onos_instances = ONOS_INSTANCES):
         status = self.verify_cluster_status(onos_instances = onos_instances)
@@ -631,7 +631,7 @@
         assert_equal(len(standbys),(onos_instances-1))
         onos_names_ips =  self.get_cluster_container_names_ips()
         member_onos_name = onos_names_ips[standbys[0]]
-	log.info('Removing cluster member %s'%standbys[0])
+	log_test.info('Removing cluster member %s'%standbys[0])
         cord_test_onos_shutdown(node = standbys[0])
 	time.sleep(60)
 	onos_instances -= 1
@@ -646,9 +646,9 @@
         onos_names_ips =  self.get_cluster_container_names_ips()
         member1_onos_name = onos_names_ips[standbys[0]]
         member2_onos_name = onos_names_ips[standbys[1]]
-        log.info('Removing cluster member %s'%standbys[0])
+        log_test.info('Removing cluster member %s'%standbys[0])
         cord_test_onos_shutdown(node = standbys[0])
-        log.info('Removing cluster member %s'%standbys[1])
+        log_test.info('Removing cluster member %s'%standbys[1])
         cord_test_onos_shutdown(node = standbys[1])
         time.sleep(60)
         onos_instances = onos_instances - 2
@@ -663,7 +663,7 @@
         onos_names_ips =  self.get_cluster_container_names_ips()
         for i in range(remove):
 	    member_onos_name = onos_names_ips[standbys[i]]
-            log.info('Removing onos container with name %s'%standbys[i])
+            log_test.info('Removing onos container with name %s'%standbys[i])
             cord_test_onos_shutdown(node = standbys[i])
         time.sleep(60)
         onos_instances = onos_instances - remove
@@ -676,14 +676,14 @@
         assert_equal(status, True)
         onos_ips = self.get_cluster_current_member_ips()
         onos_instances = len(onos_ips)+add
-        log.info('Adding %d ONOS instances to the cluster'%add)
+        log_test.info('Adding %d ONOS instances to the cluster'%add)
         cord_test_onos_add_cluster(count = add)
         status = self.verify_cluster_status(onos_instances=onos_instances)
         assert_equal(status, True)
-        log.info('Removing %d ONOS instances from the cluster'%remove)
+        log_test.info('Removing %d ONOS instances from the cluster'%remove)
         for i in range(remove):
             name = '{}-{}'.format(Onos.NAME, onos_instances - i)
-            log.info('Removing onos container with name %s'%name)
+            log_test.info('Removing onos container with name %s'%name)
             cord_test_onos_shutdown(node = name)
         time.sleep(60)
         onos_instances = onos_instances-remove
@@ -696,15 +696,15 @@
         assert_equal(status, True)
         onos_ips = self.get_cluster_current_member_ips()
         onos_instances = onos_instances-remove
-        log.info('Removing %d ONOS instances from the cluster'%remove)
+        log_test.info('Removing %d ONOS instances from the cluster'%remove)
         for i in range(remove):
             name = '{}-{}'.format(Onos.NAME, len(onos_ips)-i)
-            log.info('Removing onos container with name %s'%name)
+            log_test.info('Removing onos container with name %s'%name)
             cord_test_onos_shutdown(node = name)
         time.sleep(60)
         status = self.verify_cluster_status(onos_instances=onos_instances)
         assert_equal(status, True)
-        log.info('Adding %d ONOS instances to the cluster'%add)
+        log_test.info('Adding %d ONOS instances to the cluster'%add)
         cord_test_onos_add_cluster(count = add)
         onos_instances = onos_instances+add
         status = self.verify_cluster_status(onos_instances=onos_instances)
@@ -713,7 +713,7 @@
     def test_cluster_restart(self, onos_instances = ONOS_INSTANCES):
 	status = self.verify_cluster_status(onos_instances = onos_instances)
         assert_equal(status, True)
-	log.info('Restarting cluster')
+	log_test.info('Restarting cluster')
 	cord_test_onos_restart()
 	status = self.verify_cluster_status(onos_instances = onos_instances)
         assert_equal(status, True)
@@ -724,11 +724,11 @@
 	master, standbys = self.get_cluster_current_master_standbys()
         onos_names_ips =  self.get_cluster_container_names_ips()
         master_onos_name = onos_names_ips[master]
-        log.info('Restarting cluster master %s'%master)
+        log_test.info('Restarting cluster master %s'%master)
         cord_test_onos_restart(node = master)
         status = self.verify_cluster_status(onos_instances = onos_instances)
         assert_equal(status, True)
-	log.info('Cluster came up after master restart as expected')
+	log_test.info('Cluster came up after master restart as expected')
 
     #test fail. master changing after restart. Need to check correct behavior.
     def test_cluster_master_ip_after_master_restart(self,onos_instances = ONOS_INSTANCES):
@@ -737,13 +737,13 @@
         master1, standbys = self.get_cluster_current_master_standbys()
         onos_names_ips =  self.get_cluster_container_names_ips()
         master_onos_name = onos_names_ips[master1]
-        log.info('Restarting cluster master %s'%master1)
+        log_test.info('Restarting cluster master %s'%master1)
         cord_test_onos_restart(node = master1)
         status = self.verify_cluster_status(onos_instances = onos_instances)
         assert_equal(status, True)
 	master2, standbys = self.get_cluster_current_master_standbys()
 	assert_equal(master1,master2)
-        log.info('Cluster master is same before and after cluster master restart as expected')
+        log_test.info('Cluster master is same before and after cluster master restart as expected')
 
     def test_cluster_one_member_restart(self,onos_instances = ONOS_INSTANCES):
         status = self.verify_cluster_status(onos_instances = onos_instances)
@@ -752,11 +752,11 @@
 	assert_equal(len(standbys),(onos_instances-1))
         onos_names_ips =  self.get_cluster_container_names_ips()
 	member_onos_name = onos_names_ips[standbys[0]]
-        log.info('Restarting cluster member %s'%standbys[0])
+        log_test.info('Restarting cluster member %s'%standbys[0])
         cord_test_onos_restart(node = standbys[0])
         status = self.verify_cluster_status(onos_instances = onos_instances)
         assert_equal(status, True)
-	log.info('Cluster came up as expected after restarting one member')
+	log_test.info('Cluster came up as expected after restarting one member')
 
     def test_cluster_two_members_restart(self,onos_instances = ONOS_INSTANCES):
         status = self.verify_cluster_status(onos_instances = onos_instances)
@@ -766,12 +766,12 @@
         onos_names_ips =  self.get_cluster_container_names_ips()
         member1_onos_name = onos_names_ips[standbys[0]]
         member2_onos_name = onos_names_ips[standbys[1]]
-        log.info('Restarting cluster members %s and %s'%(standbys[0],standbys[1]))
+        log_test.info('Restarting cluster members %s and %s'%(standbys[0],standbys[1]))
         cord_test_onos_restart(node = standbys[0])
         cord_test_onos_restart(node = standbys[1])
         status = self.verify_cluster_status(onos_instances = onos_instances)
         assert_equal(status, True)
-	log.info('Cluster came up as expected after restarting two members')
+	log_test.info('Cluster came up as expected after restarting two members')
 
     def test_cluster_state_with_N_members_restart(self, members = 2, onos_instances = ONOS_INSTANCES):
         status = self.verify_cluster_status(onos_instances = onos_instances)
@@ -781,21 +781,21 @@
         onos_names_ips =  self.get_cluster_container_names_ips()
 	for i in range(members):
             member_onos_name = onos_names_ips[standbys[i]]
-	    log.info('Restarting cluster member %s'%standbys[i])
+	    log_test.info('Restarting cluster member %s'%standbys[i])
             cord_test_onos_restart(node = standbys[i])
 
         status = self.verify_cluster_status(onos_instances = onos_instances)
         assert_equal(status, True)
-	log.info('Cluster came up as expected after restarting %d members'%members)
+	log_test.info('Cluster came up as expected after restarting %d members'%members)
 
     def test_cluster_state_with_master_change(self,onos_instances = ONOS_INSTANCES):
         status = self.verify_cluster_status(onos_instances=onos_instances)
         assert_equal(status, True)
         master, standbys = self.get_cluster_current_master_standbys()
 	assert_equal(len(standbys),(onos_instances-1))
-        log.info('Cluster current master of devices is %s'%master)
+        log_test.info('Cluster current master of devices is %s'%master)
 	self.change_master_current_cluster(new_master=standbys[0])
-        log.info('Cluster master changed successfully')
+        log_test.info('Cluster master changed successfully')
 
     #tested on single onos setup.
     def test_cluster_with_vrouter_routes_in_cluster_members(self,networks = 5,onos_instances = ONOS_INSTANCES):
@@ -822,7 +822,7 @@
                         time.sleep(1)
                 assert_equal(flag, True)
             except:
-                log.info('Exception occured while checking routes in onos instance %s'%onos_ip)
+                log_test.info('Exception occured while checking routes in onos instance %s'%onos_ip)
                 raise
 
     #tested on single onos setup.
@@ -838,7 +838,7 @@
 	assert_equal(res,True)
         cord_test_onos_shutdown(node = master)
 	time.sleep(60)
-	log.info('Verifying vrouter traffic after cluster master is down')
+	log_test.info('Verifying vrouter traffic after cluster master is down')
 	self.vrouter.vrouter_traffic_verify()
 
     #tested on single onos setup.
@@ -875,14 +875,14 @@
         onos_names_ips =  self.get_cluster_container_names_ips()
         master_onos_name = onos_names_ips[master]
         self.vrouter.setUpClass()
-	log.info('Verifying vrouter before master down')
+	log_test.info('Verifying vrouter before master down')
         res = self.vrouter.vrouter_network_verify(networks, peers = 1)
         assert_equal(res, True)
 	self.vrouter.vrouter_activate(deactivate=True)
-	log.info('Verifying vrouter traffic after app deactivated')
+	log_test.info('Verifying vrouter traffic after app deactivated')
         time.sleep(15) ## Expecting vrouter should work properly if master of cluster goes down
         self.vrouter.vrouter_traffic_verify(positive_test=False)
-	log.info('Verifying vrouter traffic after master down')
+	log_test.info('Verifying vrouter traffic after master down')
         cord_test_onos_shutdown(node = master)
 	time.sleep(60)
 	self.vrouter.vrouter_traffic_verify(positive_test=False)
@@ -896,10 +896,10 @@
         onos_names_ips =  self.get_cluster_container_names_ips()
         member_onos_name = onos_names_ips[standbys[0]]
         self.vrouter.setUpClass()
-        log.info('Verifying vrouter before cluster member down')
+        log_test.info('Verifying vrouter before cluster member down')
         res = self.vrouter.vrouter_network_verify(networks, peers = 1)
         assert_equal(res, True) # Expecting vrouter should work properly
-        log.info('Verifying vrouter after cluster member down')
+        log_test.info('Verifying vrouter after cluster member down')
         cord_test_onos_shutdown(node = standbys[0])
 	time.sleep(60)
 	self.vrouter.vrouter_traffic_verify()# Expecting vrouter should work properly if member of cluster goes down
@@ -912,11 +912,11 @@
         onos_names_ips =  self.get_cluster_container_names_ips()
         member_onos_name = onos_names_ips[standbys[1]]
         self.vrouter.setUpClass()
-        log.info('Verifying vrouter traffic before cluster member restart')
+        log_test.info('Verifying vrouter traffic before cluster member restart')
         res = self.vrouter.vrouter_network_verify(networks, peers = 1)
         assert_equal(res, True) # Expecting vrouter should work properly
         cord_test_onos_restart(node = standbys[1])
-	log.info('Verifying vrouter traffic after cluster member restart')
+	log_test.info('Verifying vrouter traffic after cluster member restart')
         self.vrouter.vrouter_traffic_verify()# Expecting vrouter should work properly if member of cluster restarts
 
     #tested on single onos setup.
@@ -924,11 +924,11 @@
         status = self.verify_cluster_status(onos_instances = onos_instances)
         assert_equal(status, True)
         self.vrouter.setUpClass()
-        log.info('Verifying vrouter traffic before cluster restart')
+        log_test.info('Verifying vrouter traffic before cluster restart')
         res = self.vrouter.vrouter_network_verify(networks, peers = 1)
         assert_equal(res, True) # Expecting vrouter should work properly
 	cord_test_onos_restart()
-        log.info('Verifying vrouter traffic after cluster restart')
+        log_test.info('Verifying vrouter traffic after cluster restart')
         self.vrouter.vrouter_traffic_verify()# Expecting vrouter should work properly if member of cluster restarts
 
 
@@ -957,7 +957,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
+                log_test.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
                 self.success = True
             sniff(timeout=2,
              lfilter = lambda p: UDP in p and p[UDP].dport == egress_map['udp_port']
@@ -966,17 +966,17 @@
 	for i in [0,1]:
 	    if i == 1:
                 cord_test_onos_shutdown(node = master)
-                log.info('Verifying flows traffic after master killed')
+                log_test.info('Verifying flows traffic after master killed')
                 time.sleep(45)
 	    else:
-		log.info('Verifying flows traffic before master killed')
+		log_test.info('Verifying flows traffic before master killed')
             t = threading.Thread(target = mac_recv_task)
             t.start()
             L2 = self.flows_eth #Ether(src = ingress_map['ether'], dst = egress_map['ether'])
             L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
             L4 = UDP(sport = ingress_map['udp_port'], dport = egress_map['udp_port'])
             pkt = L2/L3/L4
-            log.info('Sending packets to verify if flows are correct')
+            log_test.info('Sending packets to verify if flows are correct')
             sendp(pkt, count=50, iface = self.flows.port_map[ingress])
             t.join()
             assert_equal(self.success, True)
@@ -1003,7 +1003,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: IP in p and p[IP].dst == egress_map['ip'] and p[IP].src == ingress_map['ip']
@@ -1011,17 +1011,17 @@
                                 iface = self.flows.port_map[egress])
 	for i in [0,1]:
 	    if i == 1:
-		log.info('Changing cluster master to %s'%standbys[0])
+		log_test.info('Changing cluster master to %s'%standbys[0])
 		self.change_master_current_cluster(new_master=standbys[0])
-		log.info('Verifying flow traffic after cluster master chnaged')
+		log_test.info('Verifying flow traffic after cluster master chnaged')
 	    else:
-		log.info('Verifying flow traffic  before cluster master changed')
+		log_test.info('Verifying flow traffic  before cluster master changed')
             t = threading.Thread(target = mac_recv_task)
             t.start()
             L2 = self.flows_eth # Ether(src = ingress_map['ether'], dst = egress_map['ether'])
             L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'], tos = 1)
             pkt = L2/L3
-            log.info('Sending a packet to verify if flows are correct')
+            log_test.info('Sending a packet to verify if flows are correct')
             sendp(pkt, count=50, iface = self.flows.port_map[ingress])
             t.join()
             assert_equal(self.success, True)
@@ -1052,24 +1052,24 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s, Extension Header Type %s'%(pkt[IPv6].src, pkt[IPv6].dst, pkt[IPv6].nh))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s, Extension Header Type %s'%(pkt[IPv6].src, pkt[IPv6].dst, pkt[IPv6].nh))
                 self.success = True
             sniff(timeout=2,count=5,
                   lfilter = lambda p: IPv6 in p and p[IPv6].nh == 0, prn = recv_cb, iface = self.flows.port_map[egress])
 	for i in [0,1]:
 	    if i == 1:
-		log.info('Restart cluster current master %s'%master)
+		log_test.info('Restart cluster current master %s'%master)
                 Container(master_onos_name,Onos.IMAGE).restart()
                 time.sleep(45)
-	        log.info('Verifying flow traffic after master restart')
+	        log_test.info('Verifying flow traffic after master restart')
 	    else:
-		log.info('Verifying flow traffic before master restart')
+		log_test.info('Verifying flow traffic before master restart')
             t = threading.Thread(target = mac_recv_task)
             t.start()
             L2 = self.flows_eth
             L3 = IPv6(src = ingress_map['ipv6'] , dst = egress_map['ipv6'], nh = 0)
             pkt = L2/L3
-            log.info('Sending packets to verify if flows are correct')
+            log_test.info('Sending packets to verify if flows are correct')
             sendp(pkt, count=50, iface = self.flows.port_map[ingress])
             t.join()
             assert_equal(self.success, True)
@@ -1081,14 +1081,14 @@
         data = repr(monotonic.monotonic())
         sendp(eth/ip/data,count=20, iface = intf)
         pkt = (eth/ip/data)
-        log.info('multicast traffic packet %s'%pkt.show())
+        log_test.info('multicast traffic packet %s'%pkt.show())
 
     def verify_igmp_data_traffic(self, group, intf='veth0', source='1.2.3.4' ):
-        log.info('verifying multicast traffic for group %s from source %s'%(group,source))
+        log_test.info('verifying multicast traffic for group %s from source %s'%(group,source))
         self.success = False
         def recv_task():
             def igmp_recv_cb(pkt):
-                log.info('multicast data received for group %s from source %s'%(group,source))
+                log_test.info('multicast data received for group %s from source %s'%(group,source))
                 self.success = True
             sniff(prn = igmp_recv_cb,lfilter = lambda p: IP in p and p[IP].dst == group and p[IP].src == source, count=1,timeout = 2, iface='veth0')
         t = threading.Thread(target = recv_task)
@@ -1117,10 +1117,10 @@
         assert_equal(status,True)
         status = self.verify_igmp_data_traffic(groups[1],intf = self.V_INF1,source= src_list[1])
         assert_equal(status,False)
-	log.info('restarting cluster master %s'%master)
+	log_test.info('restarting cluster master %s'%master)
 	Container(master_onos_name,Onos.IMAGE).restart()
 	time.sleep(60)
-	log.info('verifying multicast data traffic after master restart')
+	log_test.info('verifying multicast data traffic after master restart')
 	status = self.verify_igmp_data_traffic(groups[0],intf=self.V_INF1,source=src_list[0])
         assert_equal(status,True)
         status = self.verify_igmp_data_traffic(groups[1],intf = self.V_INF1,source= src_list[1])
@@ -1146,12 +1146,12 @@
         assert_equal(status,True)
         status = self.verify_igmp_data_traffic(groups[1],intf = self.V_INF1,source= src_list[0])
         assert_equal(status,False)
-        log.info('Killing cluster master %s'%master)
+        log_test.info('Killing cluster master %s'%master)
         Container(master_onos_name,Onos.IMAGE).kill()
         time.sleep(60)
 	status = self.verify_cluster_status(onos_instances=onos_instances-1,controller=standbys[0])
         assert_equal(status, True)
-        log.info('Verifying multicast data traffic after cluster master down')
+        log_test.info('Verifying multicast data traffic after cluster master down')
         status = self.verify_igmp_data_traffic(groups[0],intf=self.V_INF1,source=src_list[0])
         assert_equal(status,True)
         status = self.verify_igmp_data_traffic(groups[1],intf = self.V_INF1,source= src_list[0])
@@ -1172,11 +1172,11 @@
                              iface = self.V_INF1, delay = 2)
         status = self.verify_igmp_data_traffic(groups[0],intf=self.V_INF1,source=src_list[0])
         assert_equal(status,True)
-        log.info('Killing clusters master %s'%master)
+        log_test.info('Killing clusters master %s'%master)
         Container(master_onos_name,Onos.IMAGE).kill()
 	count = 0
 	for i in range(60):
-            log.info('Verifying multicast data traffic after cluster master down')
+            log_test.info('Verifying multicast data traffic after cluster master down')
             status = self.verify_igmp_data_traffic(groups[0],intf=self.V_INF1,source=src_list[0])
 	    if status:
 		break
@@ -1184,7 +1184,7 @@
 		count += 1
 	        time.sleep(1)
 	assert_equal(status, True)
-	log.info('Time taken to recover traffic after clusters master down is %d seconds'%count)
+	log_test.info('Time taken to recover traffic after clusters master down is %d seconds'%count)
 
 
     #pass
@@ -1201,12 +1201,12 @@
                              iface = self.V_INF1, delay = 2)
         status = self.verify_igmp_data_traffic(groups[0],intf=self.V_INF1,source=src_list[0])
         assert_equal(status,True)
-	log.info('Changing cluster master %s to %s'%(master,standbys[0]))
+	log_test.info('Changing cluster master %s to %s'%(master,standbys[0]))
 	self.change_cluster_current_master(new_master=standbys[0])
-	log.info('Verifying multicast traffic after cluster master change')
+	log_test.info('Verifying multicast traffic after cluster master change')
 	status = self.verify_igmp_data_traffic(groups[0],intf=self.V_INF1,source=src_list[0])
         assert_equal(status,True)
-        log.info('Sending igmp TO_EXCLUDE message to leave the group %s'%groups[0])
+        log_test.info('Sending igmp TO_EXCLUDE message to leave the group %s'%groups[0])
         self.igmp.send_igmp_join(groups = [groups[0]], src_list = src_list,record_type = IGMP_V3_GR_TYPE_CHANGE_TO_EXCLUDE,
                              iface = self.V_INF1, delay = 1)
 	time.sleep(10)
@@ -1223,7 +1223,7 @@
         groups = [self.igmp.random_mcast_ip()]
         src_list = [self.igmp.randomsourceip()]
         self.igmp.onos_ssm_table_load(groups, src_list=src_list,controller=master)
-	log.info('Changing cluster master %s to %s'%(master,standbys[0]))
+	log_test.info('Changing cluster master %s to %s'%(master,standbys[0]))
 	self.change_cluster_current_master(new_master = standbys[0])
         self.igmp.send_igmp_join(groups = [groups[0]], src_list = src_list,record_type = IGMP_V3_GR_TYPE_INCLUDE,
                              iface = self.V_INF1, delay = 2)
@@ -1260,11 +1260,11 @@
             df.callback(0)
         for i in [0,1]:
 	    if i == 1:
-		log.info('Changing cluster master %s to %s'%(master, standbys[0]))
+		log_test.info('Changing cluster master %s to %s'%(master, standbys[0]))
 		self.change_master_current_cluster(new_master=standbys[0])
-                log.info('Verifying tls authentication after cluster master changed to %s'%standbys[0])
+                log_test.info('Verifying tls authentication after cluster master changed to %s'%standbys[0])
 	    else:
-		log.info('Verifying tls authentication before cluster master change')
+		log_test.info('Verifying tls authentication before cluster master change')
             reactor.callLater(0, eap_tls_verify, df)
         return df
 
@@ -1284,13 +1284,13 @@
             df.callback(0)
         for i in [0,1]:
             if i == 1:
-                log.info('Killing cluster current master %s'%master)
+                log_test.info('Killing cluster current master %s'%master)
                 cord_test_onos_shutdown(node = master)
 		time.sleep(20)
                 status = self.verify_cluster_status(controller=standbys[0],onos_instances=onos_instances-1,verify=True)
 		assert_equal(status, True)
-		log.info('Cluster came up with %d instances after killing master'%(onos_instances-1))
-                log.info('Verifying tls authentication after killing cluster master')
+		log_test.info('Cluster came up with %d instances after killing master'%(onos_instances-1))
+                log_test.info('Verifying tls authentication after killing cluster master')
             reactor.callLater(0, eap_tls_verify, df)
         return df
 
@@ -1306,20 +1306,20 @@
         df = defer.Deferred()
         def eap_tls_no_cert(df):
             def tls_no_cert_cb():
-                log.info('TLS authentication failed with no certificate')
+                log_test.info('TLS authentication failed with no certificate')
             tls = TLSAuthTest(fail_cb = tls_no_cert_cb, client_cert = '')
             tls.runTest()
             assert_equal(tls.failTest, True)
             df.callback(0)
 	for i in [0,1]:
 	    if i == 1:
-	        log.info('Restart cluster member %s'%standbys[0])
+	        log_test.info('Restart cluster member %s'%standbys[0])
                 Container(member_onos_name,Onos.IMAGE).restart()
                 time.sleep(20)
                 status = self.verify_cluster_status(onos_instances=onos_instances)
                 assert_equal(status, True)
-                log.info('Cluster came up with %d instances after member restart'%(onos_instances))
-                log.info('Verifying tls authentication after member restart')
+                log_test.info('Cluster came up with %d instances after member restart'%(onos_instances))
+                log_test.info('Verifying tls authentication after member restart')
         reactor.callLater(0, eap_tls_no_cert, df)
         return df
 
@@ -1335,19 +1335,19 @@
         for hostip, hostmac in hosts_config:
             self.proxyarp.proxyarp_arpreply_verify(ingress,hostip,hostmac,PositiveTest = True)
             time.sleep(1)
-	log.info('changing cluster current master from %s to %s'%(master,standbys[0]))
+	log_test.info('changing cluster current master from %s to %s'%(master,standbys[0]))
 	self.change_cluster_current_master(new_master=standbys[0])
-	log.info('verifying proxyarp after master change')
+	log_test.info('verifying proxyarp after master change')
 	for hostip, hostmac in hosts_config:
             self.proxyarp.proxyarp_arpreply_verify(ingress,hostip,hostmac,PositiveTest = True)
             time.sleep(1)
-        log.info('Deactivating proxyarp  app and expecting proxyarp functionality not to work')
+        log_test.info('Deactivating proxyarp  app and expecting proxyarp functionality not to work')
         self.proxyarp.proxyarp_activate(deactivate = True,controller=standbys[0])
 	time.sleep(3)
         for hostip, hostmac in hosts_config:
             self.proxyarp.proxyarp_arpreply_verify(ingress,hostip,hostmac,PositiveTest = False)
             time.sleep(1)
-        log.info('activating proxyarp  app and expecting to get arp reply from ONOS')
+        log_test.info('activating proxyarp  app and expecting to get arp reply from ONOS')
         self.proxyarp.proxyarp_activate(deactivate = False,controller=standbys[0])
 	time.sleep(3)
         for hostip, hostmac in hosts_config:
@@ -1368,13 +1368,13 @@
         for hostip, hostmac in hosts_config:
             self.proxyarp.proxyarp_arpreply_verify(ingress,hostip,hostmac,PositiveTest = True)
             time.sleep(1)
-	log.info('killing cluster member %s'%standbys[1])
+	log_test.info('killing cluster member %s'%standbys[1])
         Container(member_onos_name,Onos.IMAGE).kill()
         time.sleep(20)
         status = self.verify_cluster_status(onos_instances=onos_instances-1,controller=master,verify=True)
         assert_equal(status, True)
-        log.info('cluster came up with %d instances after member down'%(onos_instances-1))
-        log.info('verifying proxy arp functionality after cluster member down')
+        log_test.info('cluster came up with %d instances after member down'%(onos_instances-1))
+        log_test.info('verifying proxy arp functionality after cluster member down')
 	for hostip, hostmac in hosts_config:
             self.proxyarp.proxyarp_arpreply_verify(ingress,hostip,hostmac,PositiveTest = True)
             time.sleep(1)
@@ -1400,14 +1400,14 @@
             ingress, hostmac, hostip = r[0],r[1],r[2]
             def mac_recv_task():
                 def recv_cb(pkt):
-                    log.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
+                    log_test.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
                     success_dir[current_thread().name] = True
                 sniff(count=1, timeout=5,lfilter = lambda p: ARP in p and p[ARP].op == 2 and p[ARP].hwsrc == hostmac,
                     prn = recv_cb, iface = self.proxyarp.port_map[ingress])
             t = threading.Thread(target = mac_recv_task)
             t.start()
             pkt = (Ether(dst = 'ff:ff:ff:ff:ff:ff')/ARP(op=1,pdst= hostip))
-            log.info('Sending arp request  for dest ip %s on interface %s' %
+            log_test.info('Sending arp request  for dest ip %s on interface %s' %
                  (hostip,self.proxyarp.port_map[ingress]))
             sendp(pkt, count = 10,iface = self.proxyarp.port_map[ingress])
             t.join()
@@ -1433,17 +1433,17 @@
         acl_rule = ACLTest()
         status,code = acl_rule.adding_acl_rule('v4', srcIp=self.acl.ACL_SRC_IP, dstIp =self.acl.ACL_DST_IP, action = 'allow',controller=master)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         result = acl_rule.get_acl_rules(controller=master)
         aclRules1 = result.json()['aclRules']
-	log.info('Added acl rules is %s'%aclRules1)
+	log_test.info('Added acl rules is %s'%aclRules1)
         acl_Id = map(lambda d: d['id'], aclRules1)
-	log.info('Changing cluster current master from %s to %s'%(master,standbys[0]))
+	log_test.info('Changing cluster current master from %s to %s'%(master,standbys[0]))
 	self.change_cluster_current_master(new_master=standbys[0])
         status,code = acl_rule.remove_acl_rule(acl_Id[0],controller=standbys[0])
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
 
     #pass
@@ -1458,13 +1458,13 @@
         acl_rule = ACLTest()
         status,code = acl_rule.adding_acl_rule('v4', srcIp=self.acl.ACL_SRC_IP, dstIp =self.acl.ACL_DST_IP, action = 'allow',controller=master)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         result1 = acl_rule.get_acl_rules(controller=master)
         aclRules1 = result1.json()['aclRules']
-        log.info('Added acl rules is %s'%aclRules1)
+        log_test.info('Added acl rules is %s'%aclRules1)
         acl_Id1 = map(lambda d: d['id'], aclRules1)
-        log.info('Killing cluster current master %s'%master)
+        log_test.info('Killing cluster current master %s'%master)
 	Container(master_onos_name,Onos.IMAGE).kill()
 	time.sleep(45)
 	status = self.verify_cluster_status(onos_instances=onos_instances,controller=standbys[0])
@@ -1475,7 +1475,7 @@
         result2 = acl_rule.get_acl_rules(controller=new_master)
         aclRules2 = result2.json()['aclRules']
 	acl_Id2 = map(lambda d: d['id'], aclRules2)
-	log.info('Acl Ids before and after master down are %s and %s'%(acl_Id1,acl_Id2))
+	log_test.info('Acl Ids before and after master down are %s and %s'%(acl_Id1,acl_Id2))
 	assert_equal(acl_Id2,acl_Id1)
 
     #acl traffic scenario not working as acl rule is not getting added to onos
@@ -1494,7 +1494,7 @@
         self.acl.CURRENT_PORT_NUM += 1
         time.sleep(5)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         srcMac = '00:00:00:00:00:11'
         dstMac = host_ip_mac[0][1]
@@ -1502,10 +1502,10 @@
         status, code = acl_rule.adding_acl_rule('v4', srcIp=self.acl.ACL_SRC_IP, dstIp =self.acl.ACL_DST_IP, action = 'deny',controller=master)
         time.sleep(10)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         self.acl.acl_rule_traffic_send_recv(srcMac = srcMac, dstMac = dstMac ,srcIp =self.acl.ACL_SRC_IP, dstIp = self.acl.ACL_DST_IP,ingress =ingress, egress = egress, ip_proto = 'UDP', positive_test = False)
-	log.info('killing cluster members %s and %s'%(standbys[0],standbys[1]))
+	log_test.info('killing cluster members %s and %s'%(standbys[0],standbys[1]))
         Container(member1_onos_name, Onos.IMAGE).kill()
         Container(member2_onos_name, Onos.IMAGE).kill()
 	time.sleep(40)
@@ -1536,15 +1536,15 @@
 			 controller=master)
         self.dhcprelay.dhcp = DHCPTest(seed_ip = '10.10.100.10', iface = iface)
         cip, sip = self.dhcprelay.send_recv(mac)
-	log.info('Changing cluster current master from %s to %s'%(master, standbys[0]))
+	log_test.info('Changing cluster current master from %s to %s'%(master, standbys[0]))
 	self.change_master_current_cluster(new_master=standbys[0])
-        log.info('Releasing ip %s to server %s' %(cip, sip))
+        log_test.info('Releasing ip %s to server %s' %(cip, sip))
         assert_equal(self.dhcprelay.dhcp.release(cip), True)
-        log.info('Triggering DHCP discover again after release')
+        log_test.info('Triggering DHCP discover again after release')
         cip2, sip2 = self.dhcprelay.send_recv(mac)
-        log.info('Verifying released IP was given back on rediscover')
+        log_test.info('Verifying released IP was given back on rediscover')
         assert_equal(cip, cip2)
-        log.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
+        log_test.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
         assert_equal(self.dhcprelay.dhcp.release(cip2), True)
 	self.dhcprelay.tearDownClass(controller=standbys[0])
 
@@ -1571,15 +1571,15 @@
                          subnet = subnet,
 			 controller=master)
         self.dhcprelay.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
-        log.info('Initiating dhcp process from client %s'%mac)
+        log_test.info('Initiating dhcp process from client %s'%mac)
         cip, sip = self.dhcprelay.send_recv(mac)
-        log.info('Killing cluster current master %s'%master)
+        log_test.info('Killing cluster current master %s'%master)
 	Container(master_onos_name, Onos.IMAGE).kill()
 	time.sleep(60)
 	status = self.verify_cluster_status(onos_instances=onos_instances-1,verify=True,controller=standbys[0])
         assert_equal(status, True)
 	mac = self.dhcprelay.dhcp.get_mac(cip)[0]
-        log.info("Verifying dhcp clients gets same IP after cluster master restarts")
+        log_test.info("Verifying dhcp clients gets same IP after cluster master restarts")
         new_cip, new_sip = self.dhcprelay.dhcp.only_request(cip, mac)
         assert_equal(new_cip, cip)
 	self.dhcprelay.tearDownClass(controller=standbys[0])
@@ -1607,17 +1607,17 @@
         self.dhcprelay.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
 	cip1, sip1 = self.dhcprelay.send_recv(macs[0])
 	assert_not_equal(cip1,None)
-        log.info('Got dhcp client IP %s for mac %s when cluster master is %s'%(cip1,macs[0],master))
-        log.info('Changing cluster master from %s to %s'%(master, standbys[0]))
+        log_test.info('Got dhcp client IP %s for mac %s when cluster master is %s'%(cip1,macs[0],master))
+        log_test.info('Changing cluster master from %s to %s'%(master, standbys[0]))
 	self.change_master_current_cluster(new_master=standbys[0])
 	cip2, sip2 = self.dhcprelay.send_recv(macs[1])
 	assert_not_equal(cip2,None)
-	log.info('Got dhcp client IP %s for mac %s when cluster master is %s'%(cip2,macs[1],standbys[0]))
+	log_test.info('Got dhcp client IP %s for mac %s when cluster master is %s'%(cip2,macs[1],standbys[0]))
 	self.change_master_current_cluster(new_master=master)
-        log.info('Changing cluster master from %s to %s'%(standbys[0],master))
+        log_test.info('Changing cluster master from %s to %s'%(standbys[0],master))
         cip3, sip3 = self.dhcprelay.send_recv(macs[2])
 	assert_not_equal(cip3,None)
-	log.info('Got dhcp client IP %s for mac %s when cluster master is %s'%(cip2,macs[2],master))
+	log_test.info('Got dhcp client IP %s for mac %s when cluster master is %s'%(cip2,macs[2],master))
 	self.dhcprelay.tearDownClass(controller=standbys[0])
 
     def test_cluster_with_cord_subscriber_joining_next_channel_before_and_after_cluster_restart(self,onos_instances=ONOS_INSTANCES):
@@ -1632,9 +1632,9 @@
 		time.sleep(45)
 		status = self.verify_cluster_status(onos_instances=onos_instances)
 		assert_equal(status, True)
-		log.info('Verifying cord subscriber functionality after cluster restart')
+		log_test.info('Verifying cord subscriber functionality after cluster restart')
 	    else:
-		log.info('Verifying cord subscriber functionality before cluster restart')
+		log_test.info('Verifying cord subscriber functionality before cluster restart')
             test_status = self.subscriber.subscriber_join_verify(num_subscribers = self.subscriber.num_subscribers,
                                                     num_channels = self.subscriber.num_channels,
                                                     cbs = (self.subscriber.tls_verify, self.subscriber.dhcp_next_verify,
@@ -1658,9 +1658,9 @@
 		status=self.withdraw_cluster_current_mastership(master_ip=master)
 		asser_equal(status, True)
 		master,standbys = self.get_cluster_current_master_standbys()
-                log.info('verifying cord subscriber functionality after cluster current master withdraw mastership')
+                log_test.info('verifying cord subscriber functionality after cluster current master withdraw mastership')
             else:
-		 log.info('verifying cord subscriber functionality before cluster master withdraw mastership')
+		 log_test.info('verifying cord subscriber functionality before cluster master withdraw mastership')
             test_status = self.subscriber.subscriber_join_verify(num_subscribers = self.subscriber.num_subscribers,
                                                     num_channels = self.subscriber.num_channels,
                                                     cbs = (self.subscriber.tls_verify, self.subscriber.dhcp_next_verify,
@@ -1687,9 +1687,9 @@
 		time.sleep(30)
 		status = self.verify_cluster_status(onos_instances=onos_instances-1,verify=True,controller=master)
                 assert_equal(status, True)
-		log.info('Verifying cord subscriber functionality after cluster member %s is down'%standbys[0])
+		log_test.info('Verifying cord subscriber functionality after cluster member %s is down'%standbys[0])
 	    else:
-		log.info('Verifying cord subscriber functionality before cluster member %s is down'%standbys[0])
+		log_test.info('Verifying cord subscriber functionality before cluster member %s is down'%standbys[0])
             test_status = self.subscriber.subscriber_join_verify(num_subscribers = num_subscribers,
                                                     num_channels = num_channels,
                                                     cbs = (self.subscriber.tls_verify, self.subscriber.dhcp_verify,
@@ -1717,9 +1717,9 @@
 		time.sleep(60)
 		status = self.verify_cluster_status(onos_instances=onos_instances-2)
                 assert_equal(status, True)
-		log.info('Verifying cord subscriber funtionality after cluster two members %s and %s down'%(standbys[0],standbys[1]))
+		log_test.info('Verifying cord subscriber funtionality after cluster two members %s and %s down'%(standbys[0],standbys[1]))
 	    else:
-		log.info('Verifying cord subscriber funtionality before cluster two members %s and %s down'%(standbys[0],standbys[1]))
+		log_test.info('Verifying cord subscriber funtionality before cluster two members %s and %s down'%(standbys[0],standbys[1]))
 	    test_status = self.subscriber.subscriber_join_verify(num_subscribers = num_subscribers,
                                                     num_channels = num_channels,
                                                     cbs = (self.subscriber.tls_verify, self.subscriber.dhcp_next_verify,
@@ -1735,9 +1735,9 @@
         assert_equal(status, True)
 	device_dict = self.get_cluster_current_master_standbys_of_connected_devices()
 	for device in device_dict.keys():
-	    log.info("Device is %s"%device_dict[device])
+	    log_test.info("Device is %s"%device_dict[device])
 	    assert_not_equal(device_dict[device]['master'],'none')
-	    log.info('Master and standbys for device %s are %s and %s'%(device,device_dict[device]['master'],device_dict[device]['standbys']))
+	    log_test.info('Master and standbys for device %s are %s and %s'%(device,device_dict[device]['master'],device_dict[device]['standbys']))
 	    assert_equal(len(device_dict[device]['standbys']), onos_instances-1)
 
     #pass
@@ -1750,9 +1750,9 @@
 	    device_dict= self.get_cluster_current_master_standbys_of_connected_devices(controller = ip)
 	    assert_equal(len(device_dict.keys()),onos_instances)
             for device in device_dict.keys():
-                log.info("Device is %s"%device_dict[device])
+                log_test.info("Device is %s"%device_dict[device])
                 assert_not_equal(device_dict[device]['master'],'none')
-                log.info('Master and standbys for device %s are %s and %s'%(device,device_dict[device]['master'],device_dict[device]['standbys']))
+                log_test.info('Master and standbys for device %s are %s and %s'%(device,device_dict[device]['master'],device_dict[device]['standbys']))
                 assert_equal(len(device_dict[device]['standbys']), onos_instances-1)
 
     #pass
@@ -1761,7 +1761,7 @@
         assert_equal(status, True)
 	onos_names_ips =  self.get_cluster_container_names_ips()
 	master_count = self.get_number_of_devices_of_master()
-        log.info('Master count information is %s'%master_count)
+        log_test.info('Master count information is %s'%master_count)
 	total_devices = 0
 	for master in master_count.keys():
 	    total_devices += master_count[master]['size']
@@ -1769,11 +1769,11 @@
 		restart_ip = master
 	assert_equal(total_devices,onos_instances)
 	member_onos_name = onos_names_ips[restart_ip]
-	log.info('Restarting cluster member %s having ip %s'%(member_onos_name,restart_ip))
+	log_test.info('Restarting cluster member %s having ip %s'%(member_onos_name,restart_ip))
         Container(member_onos_name, Onos.IMAGE).restart()
 	time.sleep(40)
 	master_count = self.get_number_of_devices_of_master()
-	log.info('Master count information after restart is %s'%master_count)
+	log_test.info('Master count information after restart is %s'%master_count)
 	total_devices = 0
         for master in master_count.keys():
             total_devices += master_count[master]['size']
@@ -1787,7 +1787,7 @@
         assert_equal(status, True)
         onos_names_ips =  self.get_cluster_container_names_ips()
         master_count = self.get_number_of_devices_of_master()
-        log.info('Master count information is %s'%master_count)
+        log_test.info('Master count information is %s'%master_count)
         total_devices = 0
         for master in master_count.keys():
             total_devices += master_count[master]['size']
@@ -1795,7 +1795,7 @@
                 restart_ip = master
         assert_equal(total_devices,onos_instances)
         master_onos_name = onos_names_ips[restart_ip]
-        log.info('Shutting down cluster member %s having ip %s'%(master_onos_name,restart_ip))
+        log_test.info('Shutting down cluster member %s having ip %s'%(master_onos_name,restart_ip))
         Container(master_onos_name, Onos.IMAGE).kill()
         time.sleep(40)
 	for ip in onos_names_ips.keys():
@@ -1804,7 +1804,7 @@
 	status = self.verify_cluster_status(onos_instances=onos_instances-1,controller=controller_ip)
         assert_equal(status, True)
         master_count = self.get_number_of_devices_of_master(controller=controller_ip)
-        log.info('Master count information after restart is %s'%master_count)
+        log_test.info('Master count information after restart is %s'%master_count)
         total_devices = 0
         for master in master_count.keys():
             total_devices += master_count[master]['size']
@@ -1817,21 +1817,21 @@
         status = self.verify_cluster_status(onos_instances=onos_instances)
         assert_equal(status, True)
         master_count = self.get_number_of_devices_of_master()
-        log.info('Master count information is %s'%master_count)
+        log_test.info('Master count information is %s'%master_count)
         total_devices = 0
         for master in master_count.keys():
             total_devices += int(master_count[master]['size'])
             if master_count[master]['size'] != 0:
                 master_ip = master
-		log.info('Devices of master %s are %s'%(master_count[master]['devices'],master))
+		log_test.info('Devices of master %s are %s'%(master_count[master]['devices'],master))
 		device_id = str(master_count[master]['devices'][0])
 		device_count = master_count[master]['size']
         assert_equal(total_devices,onos_instances)
-	log.info('Withdrawing mastership of device %s for controller %s'%(device_id,master_ip))
+	log_test.info('Withdrawing mastership of device %s for controller %s'%(device_id,master_ip))
 	status=self.withdraw_cluster_current_mastership(master_ip=master_ip,device_id = device_id)
         assert_equal(status, True)
         master_count = self.get_number_of_devices_of_master()
-        log.info('Master count information after cluster mastership withdraw is %s'%master_count)
+        log_test.info('Master count information after cluster mastership withdraw is %s'%master_count)
         total_devices = 0
         for master in master_count.keys():
             total_devices += int(master_count[master]['size'])
@@ -1844,16 +1844,16 @@
         status = self.verify_cluster_status(onos_instances=onos_instances)
         assert_equal(status, True)
         master_count = self.get_number_of_devices_of_master()
-        log.info('Master count information is %s'%master_count)
+        log_test.info('Master count information is %s'%master_count)
         total_devices = 0
         for master in master_count.keys():
             total_devices += master_count[master]['size']
         assert_equal(total_devices,onos_instances)
-        log.info('Restarting cluster')
+        log_test.info('Restarting cluster')
 	cord_test_onos_restart()
 	time.sleep(60)
         master_count = self.get_number_of_devices_of_master()
-        log.info('Master count information after restart is %s'%master_count)
+        log_test.info('Master count information after restart is %s'%master_count)
         total_devices = 0
         for master in master_count.keys():
             total_devices += master_count[master]['size']
diff --git a/src/test/cordSubscriber/cordSubscriberTest.py b/src/test/cordSubscriber/cordSubscriberTest.py
index cce1fdd..6039ebd 100644
--- a/src/test/cordSubscriber/cordSubscriberTest.py
+++ b/src/test/cordSubscriber/cordSubscriberTest.py
@@ -17,7 +17,6 @@
 from nose.tools import *
 from nose.twistedtools import reactor, deferred
 from twisted.internet import defer
-from scapy.all import *
 import time, monotonic
 import os, sys
 import tempfile
@@ -35,9 +34,10 @@
 from portmaps import g_subscriber_port_map
 from OltConfig import *
 from CordTestServer import cord_test_onos_restart, cord_test_shell
+from CordTestUtils import log_test
 from CordLogger import CordLogger
 
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 class Subscriber(Channels):
       PORT_TX_DEFAULT = 2
@@ -64,7 +64,7 @@
                   self.tx_intf = self.port_map[self.PORT_TX_DEFAULT]
                   self.rx_intf = self.port_map[self.PORT_RX_DEFAULT]
 
-            log.info('Subscriber %s, rx interface %s, uplink interface %s' %(name, self.rx_intf, self.tx_intf))
+            log_test.info('Subscriber %s, rx interface %s, uplink interface %s' %(name, self.rx_intf, self.tx_intf))
             Channels.__init__(self, num, channel_start = channel_start,
                               iface = self.rx_intf, iface_mcast = self.tx_intf, mcast_cb = mcast_cb)
             self.name = name
@@ -135,20 +135,20 @@
                         self.join_map[c][stats_type].update(packets = packets, t = t)
 
       def channel_receive(self, chan, cb = None, count = 1, timeout = 5):
-            log.info('Subscriber %s on port %s receiving from group %s, channel %d' %
+            log_test.info('Subscriber %s on port %s receiving from group %s, channel %d' %
                      (self.name, self.rx_intf, self.gaddr(chan), chan))
             r = self.recv(chan, cb = cb, count = count, timeout = timeout)
             if len(r) == 0:
-                  log.info('Subscriber %s on port %s timed out' %(self.name, self.rx_intf))
+                  log_test.info('Subscriber %s on port %s timed out' %(self.name, self.rx_intf))
             else:
-                  log.info('Subscriber %s on port %s received %d packets' %(self.name, self.rx_intf, len(r)))
+                  log_test.info('Subscriber %s on port %s received %d packets' %(self.name, self.rx_intf, len(r)))
             if self.recv_timeout:
                   ##Negative test case is disabled for now
                   assert_equal(len(r), 0)
 
       def recv_channel_cb(self, pkt):
             ##First verify that we have received the packet for the joined instance
-            log.info('Packet received for group %s, subscriber %s, port %s' %
+            log_test.info('Packet received for group %s, subscriber %s, port %s' %
                      (pkt[IP].dst, self.name, self.rx_intf))
             if self.recv_timeout:
                   return
@@ -159,7 +159,7 @@
             delta = recv_time - join_time
             self.join_rx_stats.update(packets=1, t = delta, usecs = True)
             self.channel_update(chan, self.STATS_RX, 1, t = delta)
-            log.debug('Packet received in %.3f usecs for group %s after join' %(delta, pkt[IP].dst))
+            log_test.debug('Packet received in %.3f usecs for group %s after join' %(delta, pkt[IP].dst))
 
 class subscriber_pool:
 
@@ -174,9 +174,9 @@
                         if self.test_status is not True:
                            ## This is chaning for other sub status has to check again
                            self.test_status = True
-                           log.info('This service is failed and other services will not run for this subscriber')
+                           log_test.info('This service is failed and other services will not run for this subscriber')
                            break
-            log.info('This Subscriber is tested for multiple service eligibility ')
+            log_test.info('This Subscriber is tested for multiple service eligibility ')
             self.test_status = True
 
 
@@ -320,7 +320,7 @@
             ##Uninstall the existing app if any
             OnosCtrl.uninstall_app(cls.table_app)
             time.sleep(2)
-            log.info('Installing the multi table app %s for subscriber test' %(cls.table_app_file))
+            log_test.info('Installing the multi table app %s for subscriber test' %(cls.table_app_file))
             OnosCtrl.install_app(cls.table_app_file)
             time.sleep(3)
             #onos_ctrl = OnosCtrl(cls.vtn_app)
@@ -331,7 +331,7 @@
             ##Uninstall the table app on class exit
             OnosCtrl.uninstall_app(cls.table_app)
             time.sleep(2)
-            log.info('Installing back the cord igmp app %s for subscriber test on exit' %(cls.app_file))
+            log_test.info('Installing back the cord igmp app %s for subscriber test on exit' %(cls.app_file))
             OnosCtrl.install_app(cls.app_file)
             #onos_ctrl = OnosCtrl(cls.vtn_app)
             #onos_ctrl.activate()
@@ -339,7 +339,7 @@
       @classmethod
       def start_onos(cls, network_cfg = None):
             if cls.onos_restartable is False:
-                  log.info('ONOS restart is disabled. Skipping ONOS restart')
+                  log_test.info('ONOS restart is disabled. Skipping ONOS restart')
                   return
             if network_cfg is None:
                   network_cfg = cls.device_dict
@@ -351,7 +351,7 @@
                   config = dict(res)
             else:
                   config = network_cfg
-            log.info('Restarting ONOS with new network configuration')
+            log_test.info('Restarting ONOS with new network configuration')
             return cord_test_onos_restart(config = config)
 
       @classmethod
@@ -410,7 +410,7 @@
       def onos_load_config(self, app, config):
           status, code = OnosCtrl.config(config)
           if status is False:
-             log.info('JSON config request for app %s returned status %d' %(app, code))
+             log_test.info('JSON config request for app %s returned status %d' %(app, code))
              assert_equal(status, True)
           time.sleep(2)
 
@@ -418,7 +418,7 @@
             cip, sip = dhcp.discover(update_seed = update_seed)
             assert_not_equal(cip, None)
             assert_not_equal(sip, None)
-            log.info('Got dhcp client IP %s from server %s for mac %s' %
+            log_test.info('Got dhcp client IP %s from server %s for mac %s' %
                      (cip, sip, dhcp.get_mac(cip)[0]))
             return cip,sip
 
@@ -440,7 +440,7 @@
             delta = recv_time - join_time
             self.subscriber.join_rx_stats.update(packets=1, t = delta, usecs = True)
             self.subscriber.channel_update(chan, self.subscriber.STATS_RX, 1, t = delta)
-            log.debug('Packet received in %.3f usecs for group %s after join' %(delta, pkt[IP].dst))
+            log_test.debug('Packet received in %.3f usecs for group %s after join' %(delta, pkt[IP].dst))
             self.test_status = True
 
       def traffic_verify(self, subscriber):
@@ -449,10 +449,10 @@
                   resp = requests.get(url)
                   self.test_status = resp.ok
                   if resp.ok == False:
-                        log.info('Subscriber %s failed get from url %s with status code %d'
+                        log_test.info('Subscriber %s failed get from url %s with status code %d'
                                  %(subscriber.name, url, resp.status_code))
                   else:
-                        log.info('GET request from %s succeeded for subscriber %s'
+                        log_test.info('GET request from %s succeeded for subscriber %s'
                                  %(url, subscriber.name))
                   return self.test_status
 
@@ -460,7 +460,7 @@
             if subscriber.has_service('TLS'):
                   time.sleep(2)
                   tls = TLSAuthTest(intf = subscriber.rx_intf)
-                  log.info('Running subscriber %s tls auth test' %subscriber.name)
+                  log_test.info('Running subscriber %s tls auth test' %subscriber.name)
                   tls.runTest()
                   self.test_status = True
                   return self.test_status
@@ -471,7 +471,7 @@
       def dhcp_verify(self, subscriber):
             if subscriber.has_service('DHCP'):
                   cip, sip = self.dhcp_request(subscriber, update_seed = True)
-                  log.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
+                  log_test.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
                   subscriber.src_list = [cip]
                   self.test_status = True
                   return self.test_status
@@ -483,7 +483,7 @@
       def dhcp_jump_verify(self, subscriber):
             if subscriber.has_service('DHCP'):
                   cip, sip = self.dhcp_request(subscriber, seed_ip = '10.10.200.1')
-                  log.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
+                  log_test.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
                   subscriber.src_list = [cip]
                   self.test_status = True
                   return self.test_status
@@ -495,7 +495,7 @@
       def dhcp_next_verify(self, subscriber):
             if subscriber.has_service('DHCP'):
                   cip, sip = self.dhcp_request(subscriber, seed_ip = '10.10.150.1')
-                  log.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
+                  log_test.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
                   subscriber.src_list = [cip]
                   self.test_status = True
                   return self.test_status
@@ -514,20 +514,20 @@
                   self.num_joins += 1
                   while self.num_joins < self.num_subscribers:
                         time.sleep(5)
-                  log.info('All subscribers have joined the channel')
+                  log_test.info('All subscribers have joined the channel')
                   for i in range(10):
                         subscriber.channel_receive(chan, cb = subscriber.recv_channel_cb, count = 10)
-                        log.info('Leaving channel %d for subscriber %s' %(chan, subscriber.name))
+                        log_test.info('Leaving channel %d for subscriber %s' %(chan, subscriber.name))
                         subscriber.channel_leave(chan)
                         time.sleep(5)
-                        log.info('Interface %s Join RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name,subscriber.join_rx_stats))
+                        log_test.info('Interface %s Join RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name,subscriber.join_rx_stats))
                         #Should not receive packets for this subscriber
                         self.recv_timeout = True
                         subscriber.recv_timeout = True
                         subscriber.channel_receive(chan, cb = subscriber.recv_channel_cb, count = 10)
                         subscriber.recv_timeout = False
                         self.recv_timeout = False
-                        log.info('Joining channel %d for subscriber %s' %(chan, subscriber.name))
+                        log_test.info('Joining channel %d for subscriber %s' %(chan, subscriber.name))
                         subscriber.channel_join(chan, delay = 0)
                   self.test_status = True
                   return self.test_status
@@ -535,12 +535,12 @@
       def igmp_jump_verify(self, subscriber):
             if subscriber.has_service('IGMP'):
                   for i in xrange(subscriber.num):
-                        log.info('Subscriber %s jumping channel' %subscriber.name)
+                        log_test.info('Subscriber %s jumping channel' %subscriber.name)
                         chan = subscriber.channel_jump(delay=0)
                         subscriber.channel_receive(chan, cb = subscriber.recv_channel_cb, count = 1)
-                        log.info('Verified receive for channel %d, subscriber %s' %(chan, subscriber.name))
+                        log_test.info('Verified receive for channel %d, subscriber %s' %(chan, subscriber.name))
                         time.sleep(3)
-                  log.info('Interface %s Jump RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name, subscriber.join_rx_stats))
+                  log_test.info('Interface %s Jump RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name, subscriber.join_rx_stats))
                   self.test_status = True
                   return self.test_status
 
@@ -551,11 +551,11 @@
                               chan = subscriber.channel_join_next(delay=0)
                         else:
                               chan = subscriber.channel_join(i, delay=0)
-                        log.info('Joined next channel %d for subscriber %s' %(chan, subscriber.name))
+                        log_test.info('Joined next channel %d for subscriber %s' %(chan, subscriber.name))
                         subscriber.channel_receive(chan, cb = subscriber.recv_channel_cb, count=1)
-                        log.info('Verified receive for channel %d, subscriber %s' %(chan, subscriber.name))
+                        log_test.info('Verified receive for channel %d, subscriber %s' %(chan, subscriber.name))
                         time.sleep(3)
-                  log.info('Interface %s Join Next RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name, subscriber.join_rx_stats))
+                  log_test.info('Interface %s Join Next RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name, subscriber.join_rx_stats))
                   self.test_status = True
                   return self.test_status
 
@@ -629,7 +629,7 @@
       def tls_invalid_cert(self, subscriber):
           if subscriber.has_service('TLS'):
              time.sleep(2)
-             log.info('Running subscriber %s tls auth test' %subscriber.name)
+             log_test.info('Running subscriber %s tls auth test' %subscriber.name)
              tls = TLSAuthTest(client_cert = self.CLIENT_CERT_INVALID)
              tls.runTest()
              if tls.failTest == True:
@@ -642,7 +642,7 @@
       def tls_no_cert(self, subscriber):
           if subscriber.has_service('TLS'):
              time.sleep(2)
-             log.info('Running subscriber %s tls auth test' %subscriber.name)
+             log_test.info('Running subscriber %s tls auth test' %subscriber.name)
              tls = TLSAuthTest(client_cert = '')
              tls.runTest()
              if tls.failTest == True:
@@ -655,7 +655,7 @@
       def tls_self_signed_cert(self, subscriber):
           if subscriber.has_service('TLS'):
              time.sleep(2)
-             log.info('Running subscriber %s tls auth test' %subscriber.name)
+             log_test.info('Running subscriber %s tls auth test' %subscriber.name)
              tls = TLSAuthTest(client_cert = self.CLIENT_CERT)
              tls.runTest()
              if tls.failTest == False:
@@ -668,7 +668,7 @@
       def tls_non_ca_authrized_cert(self, subscriber):
           if subscriber.has_service('TLS'):
              time.sleep(2)
-             log.info('Running subscriber %s tls auth test' %subscriber.name)
+             log_test.info('Running subscriber %s tls auth test' %subscriber.name)
              tls = TLSAuthTest(client_cert = self.CLIENT_CERT_NON_CA_AUTHORIZED)
              tls.runTest()
              if tls.failTest == False:
@@ -678,11 +678,10 @@
               self.test_status = True
               return self.test_status
 
-
       def tls_Nsubscribers_use_same_valid_cert(self, subscriber):
           if subscriber.has_service('TLS'):
              time.sleep(2)
-             log.info('Running subscriber %s tls auth test' %subscriber.name)
+             log_test.info('Running subscriber %s tls auth test' %subscriber.name)
              num_users = 3
              for i in xrange(num_users):
                  tls = TLSAuthTest(intf = 'veth{}'.format(i*2))
@@ -697,7 +696,7 @@
       def dhcp_discover_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
              time.sleep(2)
-             log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+             log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
              t1 = self.subscriber_dhcp_1release()
              self.test_status = True
              return self.test_status
@@ -707,26 +706,25 @@
               return self.test_status
 
       def subscriber_dhcp_1release(self, iface = INTF_RX_DEFAULT):
-             config = {'startip':'10.10.100.20', 'endip':'10.10.100.21',
-                       'ip':'10.10.100.2', 'mac': "ca:fe:ca:fe:8a:fe",
-                       'subnet': '255.255.255.0', 'broadcast':'10.10.100.255', 'router':'10.10.100.1'}
-             self.onos_dhcp_table_load(config)
-             self.dhcp = DHCPTest(seed_ip = '10.10.100.10', iface = iface)
-             cip, sip = self.send_recv()
-             log.info('Releasing ip %s to server %s' %(cip, sip))
-             assert_equal(self.dhcp.release(cip), True)
-             log.info('Triggering DHCP discover again after release')
-             cip2, sip2 = self.send_recv(update_seed = True)
-             log.info('Verifying released IP was given back on rediscover')
-             assert_equal(cip, cip2)
-             log.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
-             assert_equal(self.dhcp.release(cip2), True)
-
+            config = {'startip':'10.10.100.20', 'endip':'10.10.100.21',
+                      'ip':'10.10.100.2', 'mac': "ca:fe:ca:fe:8a:fe",
+                      'subnet': '255.255.255.0', 'broadcast':'10.10.100.255', 'router':'10.10.100.1'}
+            self.onos_dhcp_table_load(config)
+            self.dhcp = DHCPTest(seed_ip = '10.10.100.10', iface = iface)
+            cip, sip = self.send_recv()
+            log_test.info('Releasing ip %s to server %s' %(cip, sip))
+            assert_equal(self.dhcp.release(cip), True)
+            log_test.info('Triggering DHCP discover again after release')
+            cip2, sip2 = self.send_recv(update_seed = True)
+            log_test.info('Verifying released IP was given back on rediscover')
+            assert_equal(cip, cip2)
+            log_test.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
+            assert_equal(self.dhcp.release(cip2), True)
 
       def dhcp_client_reboot_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                   time.sleep(2)
-                  log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                  log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                   tl = self.subscriber_dhcp_client_request_after_reboot()
                   self.test_status = True
                   return self.test_status
@@ -744,39 +742,39 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
 
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
 
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
 
           else:
                 new_cip, new_sip = self.dhcp.only_request(cip, mac)
                 if new_cip == None:
-                        log.info("Got DHCP server NAK.")
+                        log_test.info("Got DHCP server NAK.")
                 os.system('ifconfig '+iface+' down')
-                log.info('Client goes down.')
-                log.info('Delay for 5 seconds.')
+                log_test.info('Client goes down.')
+                log_test.info('Delay for 5 seconds.')
 
                 time.sleep(5)
 
                 os.system('ifconfig '+iface+' up')
-                log.info('Client is up now.')
+                log_test.info('Client is up now.')
 
                 new_cip, new_sip = self.dhcp.only_request(cip, mac)
                 if new_cip == None:
-                        log.info("Got DHCP server NAK.")
+                        log_test.info("Got DHCP server NAK.")
                         assert_not_equal(new_cip, None)
                 elif new_cip != None:
-                        log.info("Got DHCP ACK.")
+                        log_test.info("Got DHCP ACK.")
 
       def dhcp_client_renew_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_client_renew_time()
                 self.test_status = True
                 return self.test_status
@@ -792,35 +790,35 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
           cip, sip, mac , lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
 
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
           elif cip and sip and mac:
-                log.info("Triggering DHCP Request.")
+                log_test.info("Triggering DHCP Request.")
                 new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, renew_time = True)
                 if new_cip and new_sip and lval:
-                        log.info("Client 's Renewal time is :%s",lval)
-                        log.info("Generating delay till renewal time.")
+                        log_test.info("Client 's Renewal time is :%s",lval)
+                        log_test.info("Generating delay till renewal time.")
                         time.sleep(lval)
-                        log.info("Client Sending Unicast DHCP request.")
+                        log_test.info("Client Sending Unicast DHCP request.")
                         latest_cip, latest_sip = self.dhcp.only_request(new_cip, mac, unicast = True)
                         if latest_cip and latest_sip:
-                                log.info("Got DHCP Ack. Lease Renewed for ip %s and mac %s from server %s." %
+                                log_test.info("Got DHCP Ack. Lease Renewed for ip %s and mac %s from server %s." %
                                                 (latest_cip, mac, latest_sip) )
 
                         elif latest_cip == None:
-                                log.info("Got DHCP NAK. Lease not renewed.")
+                                log_test.info("Got DHCP NAK. Lease not renewed.")
                 elif new_cip == None or new_sip == None or lval == None:
-                        log.info("Got DHCP NAK.")
+                        log_test.info("Got DHCP NAK.")
 
       def dhcp_server_reboot_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_server_after_reboot()
                 self.test_status = True
                 return self.test_status
@@ -837,51 +835,51 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
           else:
                 new_cip, new_sip = self.dhcp.only_request(cip, mac)
                 if new_cip == None:
-                        log.info("Got DHCP server NAK.")
+                        log_test.info("Got DHCP server NAK.")
                         assert_not_equal(new_cip, None)
-                log.info('Getting DHCP server Down.')
+                log_test.info('Getting DHCP server Down.')
                 onos_ctrl = OnosCtrl(self.dhcp_app)
                 onos_ctrl.deactivate()
                 for i in range(0,4):
-                        log.info("Sending DHCP Request.")
-                        log.info('')
+                        log_test.info("Sending DHCP Request.")
+                        log_test.info('')
                         new_cip, new_sip = self.dhcp.only_request(cip, mac)
                         if new_cip == None and new_sip == None:
-                                log.info('')
-                                log.info("DHCP Request timed out.")
+                                log_test.info('')
+                                log_test.info("DHCP Request timed out.")
                         elif new_cip and new_sip:
-                                log.info("Got Reply from DHCP server.")
+                                log_test.info("Got Reply from DHCP server.")
                                 assert_equal(new_cip,None) #Neagtive Test Case
-                log.info('Getting DHCP server Up.')
+                log_test.info('Getting DHCP server Up.')
 #               self.activate_apps(self.dhcp_app)
                 onos_ctrl = OnosCtrl(self.dhcp_app)
                 status, _ = onos_ctrl.activate()
                 assert_equal(status, True)
                 time.sleep(3)
                 for i in range(0,4):
-                        log.info("Sending DHCP Request after DHCP server is up.")
-                        log.info('')
+                        log_test.info("Sending DHCP Request after DHCP server is up.")
+                        log_test.info('')
                         new_cip, new_sip = self.dhcp.only_request(cip, mac)
                         if new_cip == None and new_sip == None:
-                                log.info('')
-                                log.info("DHCP Request timed out.")
+                                log_test.info('')
+                                log_test.info("DHCP Request timed out.")
                         elif new_cip and new_sip:
-                                log.info("Got Reply from DHCP server.")
+                                log_test.info("Got Reply from DHCP server.")
                                 assert_equal(new_cip,None) #Neagtive Test Case
 
       def dhcp_client_rebind_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_client_rebind_time()
                 self.test_status = True
                 return self.test_status
@@ -897,37 +895,37 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
           elif cip and sip and mac:
-                log.info("Triggering DHCP Request.")
+                log_test.info("Triggering DHCP Request.")
                 new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, rebind_time = True)
                 if new_cip and new_sip and lval:
-                        log.info("Client 's Rebind time is :%s",lval)
-                        log.info("Generating delay till rebind time.")
+                        log_test.info("Client 's Rebind time is :%s",lval)
+                        log_test.info("Generating delay till rebind time.")
                         time.sleep(lval)
-                        log.info("Client Sending broadcast DHCP requests for renewing lease or for getting new ip.")
+                        log_test.info("Client Sending broadcast DHCP requests for renewing lease or for getting new ip.")
                         self.dhcp.after_T2 = True
                         for i in range(0,4):
                                 latest_cip, latest_sip = self.dhcp.only_request(new_cip, mac)
                                 if latest_cip and latest_sip:
-                                        log.info("Got DHCP Ack. Lease Renewed for ip %s and mac %s from server %s." %
+                                        log_test.info("Got DHCP Ack. Lease Renewed for ip %s and mac %s from server %s." %
                                                         (latest_cip, mac, latest_sip) )
                                         break
                                 elif latest_cip == None:
-                                        log.info("Got DHCP NAK. Lease not renewed.")
+                                        log_test.info("Got DHCP NAK. Lease not renewed.")
                         assert_not_equal(latest_cip, None)
                 elif new_cip == None or new_sip == None or lval == None:
-                        log.info("Got DHCP NAK.Lease not Renewed.")
+                        log_test.info("Got DHCP NAK.Lease not Renewed.")
 
       def dhcp_starvation_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_starvation()
                 self.test_status = True
                 return self.test_status
@@ -943,11 +941,11 @@
                     'subnet': '255.255.255.0', 'broadcast':'182.17.0.255', 'router':'182.17.0.1'}
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '182.17.0.1', iface = iface)
-          log.info('Verifying 1 ')
+          log_test.info('Verifying 1 ')
           for x in xrange(50):
               mac = RandMAC()._fix()
               self.send_recv(mac = mac)
-          log.info('Verifying 2 ')
+          log_test.info('Verifying 2 ')
           cip, sip = self.send_recv(update_seed = True, validate = False)
           assert_equal(cip, None)
           assert_equal(sip, None)
@@ -955,7 +953,7 @@
       def dhcp_same_client_multi_discovers_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_same_client_multiple_discover()
                 self.test_status = True
                 return self.test_status
@@ -972,22 +970,22 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s . Not going to send DHCPREQUEST.' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s . Not going to send DHCPREQUEST.' %
                   (cip, sip, mac) )
-          log.info('Triggering DHCP discover again.')
+          log_test.info('Triggering DHCP discover again.')
           new_cip, new_sip, new_mac , lval = self.dhcp.only_discover()
           if cip == new_cip:
-                 log.info('Got same ip for 2nd DHCP discover for client IP %s from server %s for mac %s. Triggering DHCP Request. '
+                 log_test.info('Got same ip for 2nd DHCP discover for client IP %s from server %s for mac %s. Triggering DHCP Request. '
                           % (new_cip, new_sip, new_mac) )
           elif cip != new_cip:
-                log.info('Ip after 1st discover %s' %cip)
-                log.info('Map after 2nd discover %s' %new_cip)
+                log_test.info('Ip after 1st discover %s' %cip)
+                log_test.info('Map after 2nd discover %s' %new_cip)
                 assert_equal(cip, new_cip)
 
       def dhcp_same_client_multi_request_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_same_client_multiple_request()
                 self.test_status = True
                 return self.test_status
@@ -1003,16 +1001,16 @@
                     'subnet': '255.255.255.0', 'broadcast':'10.10.10.255', 'router':'10.10.10.1'}
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
-          log.info('Sending DHCP discover and DHCP request.')
+          log_test.info('Sending DHCP discover and DHCP request.')
           cip, sip = self.send_recv()
           mac = self.dhcp.get_mac(cip)[0]
-          log.info("Sending DHCP request again.")
+          log_test.info("Sending DHCP request again.")
           new_cip, new_sip = self.dhcp.only_request(cip, mac)
           if (new_cip,new_sip) == (cip,sip):
-                log.info('Got same ip for 2nd DHCP Request for client IP %s from server %s for mac %s.'
+                log_test.info('Got same ip for 2nd DHCP Request for client IP %s from server %s for mac %s.'
                           % (new_cip, new_sip, mac) )
           elif (new_cip,new_sip):
-                log.info('No DHCP ACK')
+                log_test.info('No DHCP ACK')
                 assert_equal(new_cip, None)
                 assert_equal(new_sip, None)
           else:
@@ -1021,7 +1019,7 @@
       def dhcp_client_desired_ip_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_client_desired_address()
                 self.test_status = True
                 return self.test_status
@@ -1038,21 +1036,21 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.31', iface = iface)
           cip, sip, mac , lval = self.dhcp.only_discover(desired = True)
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
           if cip == self.dhcp.seed_ip:
-                log.info('Got dhcp client IP %s from server %s for mac %s as desired .' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s as desired .' %
                   (cip, sip, mac) )
           elif cip != self.dhcp.seed_ip:
-                log.info('Got dhcp client IP %s from server %s for mac %s .' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
-                log.info('The desired ip was: %s .' % self.dhcp.seed_ip)
+                log_test.info('The desired ip was: %s .' % self.dhcp.seed_ip)
                 assert_equal(cip, self.dhcp.seed_ip)
 
       def dhcp_client_request_pkt_with_non_offered_ip_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_server_nak_packet()
                 self.test_status = True
                 return self.test_status
@@ -1068,22 +1066,22 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
           else:
                 new_cip, new_sip = self.dhcp.only_request('20.20.20.31', mac)
                 if new_cip == None:
-                        log.info("Got DHCP server NAK.")
+                        log_test.info("Got DHCP server NAK.")
                         assert_equal(new_cip, None)  #Negative Test Case
 
       def dhcp_client_requested_out_pool_ip_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_client_desired_address_out_of_pool()
                 self.test_status = True
                 return self.test_status
@@ -1100,26 +1098,26 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.35', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover(desired = True)
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
           if cip == self.dhcp.seed_ip:
-                log.info('Got dhcp client IP %s from server %s for mac %s as desired .' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s as desired .' %
                   (cip, sip, mac) )
                 assert_equal(cip, self.dhcp.seed_ip) #Negative Test Case
 
           elif cip != self.dhcp.seed_ip:
-                log.info('Got dhcp client IP %s from server %s for mac %s .' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
-                log.info('The desired ip was: %s .' % self.dhcp.seed_ip)
+                log_test.info('The desired ip was: %s .' % self.dhcp.seed_ip)
                 assert_not_equal(cip, self.dhcp.seed_ip)
 
           elif cip == None:
-                log.info('Got DHCP NAK')
+                log_test.info('Got DHCP NAK')
 
       def dhcp_client_specific_lease_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_specific_lease_packet()
                 self.test_status = True
                 return self.test_status
@@ -1135,15 +1133,15 @@
                    'subnet': '255.255.255.0', 'broadcast':'20.20.20.255', 'router':'20.20.20.1'}
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
-          log.info('Sending DHCP discover with lease time of 700')
+          log_test.info('Sending DHCP discover with lease time of 700')
           cip, sip, mac, lval = self.dhcp.only_discover(lease_time = True)
 
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet.")
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
           elif lval != 700:
-                log.info('Getting dhcp client IP %s from server %s for mac %s with lease time %s. That is not 700.' %
+                log_test.info('Getting dhcp client IP %s from server %s for mac %s with lease time %s. That is not 700.' %
                          (cip, sip, mac, lval) )
                 assert_not_equal(lval, 700)
 
diff --git a/src/test/cordvtn/cordvtnTest.py b/src/test/cordvtn/cordvtnTest.py
index edcedc0..8c2f49b 100644
--- a/src/test/cordvtn/cordvtnTest.py
+++ b/src/test/cordvtn/cordvtnTest.py
@@ -25,12 +25,11 @@
 from neutronclient.v2_0 import client as neutron_client
 import neutronclient.v2_0.client as neutronclient
 from nose.tools import assert_equal
-from CordTestUtils import get_mac
+from CordTestUtils import get_mac, log_test
 from OnosCtrl import OnosCtrl
 from CordLogger import CordLogger
 from TestManifest import TestManifest
 from OnosFlowCtrl import OnosFlowCtrl
-from scapy.all import *
 from credentials import *
 from VSGAccess import VSGAccess
 from SSHTestAgent import SSHTestAgent
@@ -136,7 +135,7 @@
     def onos_load_config(cls, cordvtn_conf_file):
         status, code = OnosCtrl.config(cordvtn_conf_file)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         time.sleep(3)
 
@@ -153,7 +152,7 @@
     def get_compute_nodes(cls):
         credentials = get_nova_credentials_v2()
         novaclient = nova_client.Client('2', **credentials)
-        print novaclient.hypervisors.list()
+        print(novaclient.hypervisors.list())
         return novaclient.hypervisors.list()
 
     def create_network(i):
@@ -164,10 +163,10 @@
         while True:
            try:
               net = neutron.create_network(body=json)
-              print '\nnetwork-' + str(i) + ' created'
+              print('\nnetwork-' + str(i) + ' created')
               return net
            except Exception as e:
-              print e
+              print(e)
               continue
 
     def create_tenant(tenant_name):
@@ -183,7 +182,7 @@
             user_name = tenant_name + '-user-' + str(j)
             user_data.append(create_user(user_name, tenant_id))
 
-        print " Tenant and User Created"
+        print(" Tenant and User Created")
 
         tenant_data = {'tenant_name': tenant_name,
                        'tenant_id': tenant_id,
@@ -443,7 +442,7 @@
                  match = True
                  return match
         if match is True:
-           print"Network search is successful"
+           print("Network search is successful")
         return match
 
     def get_key_value(self, d, key = None, value = None,):
@@ -459,7 +458,7 @@
                   if type(d[i]) is dict:
                      match,ret_k,ret_v = self.get_key_value(d[i], key, value)
                      if match is True:
-                        print "Network creation is successful"
+                        print("Network creation is successful")
                         break
         else:
            for k, v in d.items():
@@ -563,7 +562,7 @@
         image = nova_obj.images.find(name=image_name)
         flavor = nova_obj.flavors.find(name=flavor_id)
         network = nova_obj.networks.find(label=net_name)
-        print network.id
+        print(network.id)
 
         server = nova_obj.servers.create(name = instance_name,
                                          image = image.id,
@@ -626,7 +625,7 @@
            if check_type == "Ping_from_source_tenant":
               cmd = "ping -c 3 {0}".format(target_tenants_details.addresses)
               ssh_cmd = 'ssh {} {}'.format(source_tenants_details.addresses, cmd)
-              print ssh_cmd
+              print(ssh_cmd)
               ssh_agent = SSHTestAgent(host = compute_ip)
               status, output = ssh_agent.run_cmd(cmd, timeout = 5)
 
@@ -636,10 +635,10 @@
            status, output = ssh_agent.run_cmd(cmd, timeout = 5)
 
         if status == True and output:
-           print "Ping is successful"
+           print("Ping is successful")
            output = output.strip()
         else:
-           print "Ping is not successful"
+           print("Ping is not successful")
            output = None
         return [status, output]
 
@@ -647,9 +646,9 @@
     def nova_instance_deletion(self, nova_obj, server_details):
         results_nova_instance_deletion=nova_obj.servers.delete(server_details.id)
         if results_nova_instance_deletion == None:
-           print"Nova instance is deleted"
+           print("Nova instance is deleted")
         else:
-           print"Nova instance is not deleted"
+           print("Nova instance is not deleted")
         return results_nova_instance_deletion
 
     def test_cordvtn_neutron_network_creation_and_validation_on_head_node_with_neutron_service(self):
@@ -775,12 +774,12 @@
               if data['ServiceNetworks'][i]['name'] == 'vtn_test_6_net_management':
                  sub_net_id = self.get_key_value(d=data['ServiceNetworks'][i], key = 'subnet')
                  if sub_net_id[2] == " ":
-                    log.info('Sub network is not successful')
+                    log_test.info('Sub network is not successful')
                     self.neutron_network_deletion('vtn_test_6_net_management')
                     assert_equal(False, True)
                     break
                  elif sub_net_id[2] == cidr:
-                    log.info('Sub network is successful')
+                    log_test.info('Sub network is successful')
                     self.neutron_network_deletion('vtn_test_6_net_management')
                     assert_equal(sub_net_id[0], True)
                     break
@@ -812,11 +811,11 @@
               if data['ServiceNetworks'][i]['name'] == test_net_name:
                  sub_net_id = self.get_key_value(d=data['ServiceNetworks'][i], key = 'subnet')
                  if sub_net_id[2] == " ":
-                    log.info('Sub network is not successful')
+                    log_test.info('Sub network is not successful')
                     assert_equal(False, True)
                     break
                  elif sub_net_id[2] == test_sub_net_cidr[1]:
-                    log.info('Sub network is successful')
+                    log_test.info('Sub network is successful')
                     assert_equal(sub_net_id[0], True)
                     break
 
@@ -935,11 +934,11 @@
               if data['ServiceNetworks'][i]['name'] == test_net_name:
                  sub_net_id = self.get_key_value(d=data['ServiceNetworks'][i], key = 'subnet')
                  if sub_net_id[2] == " ":
-                    log.info('Sub network is not successful')
+                    log_test.info('Sub network is not successful')
                     assert_equal(False, True)
                     break
                  elif sub_net_id[2] == test_sub_net_cidr[1]:
-                    log.info('Sub network is successful')
+                    log_test.info('Sub network is successful')
                     assert_equal(sub_net_id[0], True)
                     break
 
@@ -1059,11 +1058,11 @@
               if data['ServiceNetworks'][i]['name'] == test_net_name:
                  sub_net_id = self.get_key_value(d=data['ServiceNetworks'][i], key = 'subnet')
                  if sub_net_id[2] == " ":
-                    log.info('Sub network is not successful')
+                    log_test.info('Sub network is not successful')
                     assert_equal(False, True)
                     break
                  elif sub_net_id[2] == "192.168.160.0/24":
-                    log.info('Sub network is successful')
+                    log_test.info('Sub network is successful')
                     assert_equal(sub_net_id[0], True)
                     break
 
@@ -1133,7 +1132,7 @@
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
         #assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print new_instance_details.addresses
+        print(new_instance_details.addresses)
         status, output = self.nova_instance_tenants_access_check(new_instance_details)
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
@@ -1169,7 +1168,7 @@
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
         #assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print new_instance_details.addresses
+        print(new_instance_details.addresses)
         status, output = self.nova_instance_tenants_access_check(new_instance_details, check_type = "Ping_to_external")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
@@ -1210,9 +1209,9 @@
         #assert_equal(first_instance_details.status, 'ACTIVE')
         #assert_equal(second_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print 'New nova instance ip addresses are '
-        print first_nova_instance_details.addresses
-        print second_nova_instance_details.addresses
+        print('New nova instance ip addresses are ')
+        print(first_nova_instance_details.addresses)
+        print(second_nova_instance_details.addresses)
         status, output = self.nova_instance_tenants_access_check(first_nova_instance_details,source_tenants_details = second_nova_instance_details, check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, first_nova_instance_details)
@@ -1246,9 +1245,9 @@
         #assert_equal(nova_instance_details_netA.status, 'ACTIVE')
         #assert_equal(nova_instance_details_netB.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print 'New nova instance ip addresses are '
-        print nova_instance_details_netA.addresses
-        print nova_instance_details_netB.addresses
+        print('New nova instance ip addresses are ')
+        print(nova_instance_details_netA.addresses)
+        print(nova_instance_details_netB.addresses)
         status, output = self.nova_instance_tenants_access_check(nova_instance_details_netA, source_tenants_details = nova_instance_details_netB,check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_netA_name)
         self.nova_instance_deletion(nova_netA, nova_instance_details_netA)
@@ -1287,7 +1286,7 @@
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
         #assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print new_instance_details.addresses
+        print(new_instance_details.addresses)
         status, output = self.nova_instance_tenants_access_check(new_instance_details)
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
@@ -1323,7 +1322,7 @@
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
         #assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print new_instance_details.addresses
+        print(new_instance_details.addresses)
         status, output = self.nova_instance_tenants_access_check(new_instance_details, check_type = "Ping_to_external")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
@@ -1365,9 +1364,9 @@
         #assert_equal(first_instance_details.status, 'ACTIVE')
         #assert_equal(second_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print 'New nova instance ip addresses are '
-        print first_nova_instance_details.addresses
-        print second_nova_instance_details.addresses
+        print('New nova instance ip addresses are ')
+        print(first_nova_instance_details.addresses)
+        print(second_nova_instance_details.addresses)
         status, output = self.nova_instance_tenants_access_check(first_nova_instance_details,source_tenants_details = second_nova_instance_details, check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, first_nova_instance_details)
@@ -1401,9 +1400,9 @@
         #assert_equal(nova_instance_details_netA.status, 'ACTIVE')
         #assert_equal(nova_instance_details_netB.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print 'New nova instance ip addresses are '
-        print nova_instance_details_netA.addresses
-        print nova_instance_details_netB.addresses
+        print('New nova instance ip addresses are ')
+        print(nova_instance_details_netA.addresses)
+        print(nova_instance_details_netB.addresses)
         status, output = self.nova_instance_tenants_access_check(nova_instance_details_netA, source_tenants_details = nova_instance_details_netB,check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_netA_name)
         self.nova_instance_deletion(nova_netA, nova_instance_details_netA)
@@ -1441,7 +1440,7 @@
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
         #assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print new_instance_details.addresses
+        print(new_instance_details.addresses)
         status, output = self.nova_instance_tenants_access_check(new_instance_details)
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
@@ -1477,7 +1476,7 @@
         new_instance_details = self.nova_instance_creation_and_validation(test_net_name,nova,instance_vm_name,image_name,flavor_id)
         #assert_equal(new_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print new_instance_details.addresses
+        print(new_instance_details.addresses)
         status, output = self.nova_instance_tenants_access_check(new_instance_details, check_type = "Ping_to_external")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, new_instance_details)
@@ -1518,9 +1517,9 @@
         #assert_equal(first_instance_details.status, 'ACTIVE')
         #assert_equal(second_instance_details.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print 'New nova instance ip addresses are '
-        print first_nova_instance_details.addresses
-        print second_nova_instance_details.addresses
+        print('New nova instance ip addresses are ')
+        print(first_nova_instance_details.addresses)
+        print(second_nova_instance_details.addresses)
         status, output = self.nova_instance_tenants_access_check(first_nova_instance_details,source_tenants_details = second_nova_instance_details, check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_net_name)
         self.nova_instance_deletion(nova, first_nova_instance_details)
@@ -1554,9 +1553,9 @@
         #assert_equal(nova_instance_details_netA.status, 'ACTIVE')
         #assert_equal(nova_instance_details_netB.status, 'ACTIVE')
         compute_details = self.get_compute_nodes()
-        print 'New nova instance ip addresses are '
-        print nova_instance_details_netA.addresses
-        print nova_instance_details_netB.addresses
+        print('New nova instance ip addresses are ')
+        print(nova_instance_details_netA.addresses)
+        print(nova_instance_details_netB.addresses)
         status, output = self.nova_instance_tenants_access_check(nova_instance_details_netA, source_tenants_details = nova_instance_details_netB,check_type = "Ping_from_source_tenant")
         self.neutron_network_deletion(test_netA_name)
         self.nova_instance_deletion(nova_netA, nova_instance_details_netA)
@@ -1679,11 +1678,11 @@
 
         tenant_1= create_tenant("CORD_Subscriber_Test_Tenant_1")
         if tenant1 != 0:
-           print "Creation of CORD Subscriber Test Tenant 1"
+           print("Creation of CORD Subscriber Test Tenant 1")
 
         tenant_2 = create_tenant("CORD_Subscriber_Test_Tenant_2")
         if tenant2 != 0:
-           print "Creation of CORD Subscriber Test Tenant 2"
+           print("Creation of CORD Subscriber Test Tenant 2")
 
         create_net(tenant_1,"a1")
         create_subnet(tenant_1,"a1","as1","10.0.1.0/24")
@@ -1725,31 +1724,31 @@
 
         ret1 = create_tenant(netA)
         if ret1 != 0:
-           print "Creation of Tenant netA Failed"
+           print("Creation of Tenant netA Failed")
 
         ret2 = create_tenant(netB)
         if ret2 != 0:
-           print "Creation of Tenant netB Failed"
+           print("Creation of Tenant netB Failed")
         network = {'name': self.network_name, 'admin_state_up': True}
         self.neutron.create_network({'network':network})
-        log.info("Created network:{0}".format(self.network_name))
+        log_test.info("Created network:{0}".format(self.network_name))
         status = validate_vtn_flows()
         assert_equal(status, True)
 
     def test_cordvtn_to_create_net_work_with_subnet(self):
         ret1 = create_tenant(netA)
         if ret1 != 0:
-           print "Creation of Tenant netA Failed"
+           print("Creation of Tenant netA Failed")
 
         ret2 = create_tenant(netB)
         if ret2 != 0:
-           print "Creation of Tenant netB Failed"
+           print("Creation of Tenant netB Failed")
         network_name = self.network_name
         network = {'name': network_name, 'admin_state_up': True}
         network_info = self.neutron.create_network({'network':network})
         network_id = network_info['network']['id']
 
-        log.info("Created network:{0}".format(network_id))
+        log_test.info("Created network:{0}".format(network_id))
         self.network_ids.append(network_id)
         subnet_count = 1
         for cidr in self.subnet_cidrs:
@@ -1759,9 +1758,9 @@
                       "host_routes":[{"destination":"0.0.0.0/0", "nexthop":gateway_ip}]
                      }
             subnet = {"name":"subnet-"+str(subnet_count), "network_id": network_id, "ip_version":4, "cidr":str(cidr), "enable_dhcp":True}
-            print subnet
+            print(subnet)
             self.neutron.create_subnet({'subnet':subnet})
-            log.info("Created subnet:{0}".format(str(cidr)))
+            log_test.info("Created subnet:{0}".format(str(cidr)))
             if not self.number_of_subnet - 1:
                 break
         self.number_of_subnet -= 1
@@ -1772,15 +1771,15 @@
     def test_cordvtn_subnet_limit(self):
         ret1 = create_tenant(netA)
         if ret1 != 0:
-           print "Creation of Tenant netA Failed"
+           print("Creation of Tenant netA Failed")
 
         ret2 = create_tenant(netB)
         if ret2 != 0:
-           print "Creation of Tenant netB Failed"
+           print("Creation of Tenant netB Failed")
         network_name = uuid.uuid4().get_hex()
         network = {'name': network_name, 'admin_state_up': True}
         network_info = self.neutron.create_network({'network':network})
-        log.info("Created network:{0}".format(network_name))
+        log_test.info("Created network:{0}".format(network_name))
         network_id = network_info['network']['id']
         self.network_ids.append(network_id)
         subnet_cidrs = ['11.2.2.0/29',  '11.2.2.8/29']
@@ -1788,13 +1787,13 @@
             subnet = {"network_id": network_id, "ip_version":4, "cidr": cidr}
             subnet_info = self.neutron.create_subnet({'subnet':subnet})
             subnet_id = subnet_info['subnet']['id']
-            log.info("Created subnet:{0}".format(cidr))
+            log_test.info("Created subnet:{0}".format(cidr))
         while True:
             port = {"network_id": network_id, "admin_state_up": True}
             port_info = self.neutron.create_port({'port':port})
             port_id = port_info['port']['id']
             self.port_ids.append(port_id)
-            log.info("Created Port:{0}".format(port_info['port']['id']))
+            log_test.info("Created Port:{0}".format(port_info['port']['id']))
             if not self.quota_limit:
                break
             self.quota_limit -= 1
@@ -1802,19 +1801,18 @@
         assert_equal(status, True)
 
     def test_cordvtn_floatingip_limit(self):
-
         ret1 = create_tenant(netA)
         if ret1 != 0:
-           print "Creation of Tenant netA Failed"
+           print("Creation of Tenant netA Failed")
 
         ret2 = create_tenant(netB)
         if ret2 != 0:
-           print "Creation of Tenant netB Failed"
+           print("Creation of Tenant netB Failed")
         while True:
             floatingip = {"floating_network_id": self.floating_nw_id}
             fip_info = self.neutron.create_floatingip({'floatingip':floatingip})
             fip_id = fip_info['floatingip']['id']
-            log.info("Created Floating IP:{0}".format(fip_id))
+            log_test.info("Created Floating IP:{0}".format(fip_id))
             self.fip_ids.append(fip_id)
             if not self.quota_limit:
                break
@@ -1825,15 +1823,15 @@
     def test_cordvtn_for_10_neutron_networks(self):
         ret1 = create_tenant(netA)
         if ret1 != 0:
-           print "Creation of Tenant netA Failed"
+           print("Creation of Tenant netA Failed")
 
         ret2 = create_tenant(netB)
         if ret2 != 0:
-           print "Creation of Tenant netB Failed"
+           print("Creation of Tenant netB Failed")
         pool = Pool(processes=10)
         ret = os.system("neutron quote-update --network 15")
         if ret1 != 0:
-           print "Neutron network install failed"
+           print("Neutron network install failed")
         for i in range(1, 11):
             pool.apply_async(create_network, (i, ))
 
@@ -1845,16 +1843,16 @@
     def test_cordvtn_for_100_neutron_networks(self):
         ret1 = create_tenant(netA)
         if ret1 != 0:
-           print "Creation of Tenant netA Failed"
+           print("Creation of Tenant netA Failed")
 
         ret2 = create_tenant(netB)
         if ret2 != 0:
-           print "Creation of Tenant netB Failed"
+           print("Creation of Tenant netB Failed")
         pool = Pool(processes=10)
 
         ret = os.system("neutron quote-update --network 105")
         if ret1 != 0:
-           print "Neutron network install failed"
+           print("Neutron network install failed")
         for i in range(1, 101):
             pool.apply_async(create_network, (i, ))
 
diff --git a/src/test/dhcp/dhcpTest.py b/src/test/dhcp/dhcpTest.py
index b81e3cf..c6a3d0d 100644
--- a/src/test/dhcp/dhcpTest.py
+++ b/src/test/dhcp/dhcpTest.py
@@ -17,7 +17,6 @@
 from nose.tools import *
 from nose.twistedtools import reactor, deferred
 from twisted.internet import defer
-from scapy.all import *
 import time
 import copy
 from DHCP import DHCPTest
@@ -26,7 +25,8 @@
 from portmaps import g_subscriber_port_map
 from CordLogger import CordLogger
 from CordTestConfig import setup_module
-log.setLevel('INFO')
+from CordTestUtils import log_test
+log_test.setLevel('INFO')
 
 class dhcp_exchange(CordLogger):
 
@@ -92,7 +92,7 @@
     def onos_load_config(self, config):
         status, code = OnosCtrl.config(config)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         time.sleep(3)
 
@@ -107,12 +107,12 @@
 
     def send_recv(self, mac = None, update_seed = False, validate = True):
         cip, sip = self.dhcp.discover(mac = mac, update_seed = update_seed)
-        log.info("discover cip %s"%(cip))
-        log.info("discover sip %s"%(sip))
+        log_test.info("discover cip %s"%(cip))
+        log_test.info("discover sip %s"%(sip))
         if validate:
             assert_not_equal(cip, None)
             assert_not_equal(sip, None)
-            log.info('Got dhcp client IP %s from server %s for mac %s' %
+            log_test.info('Got dhcp client IP %s from server %s for mac %s' %
                      (cip, sip, self.dhcp.get_mac(cip)[0]))
         return cip,sip
 
@@ -133,7 +133,7 @@
 	while self.diff <= 60:
 	    if only_discover:
 		cip, sip, mac, _ = self.dhcp.only_discover(multiple = True)
-                log.info('Got dhcp client IP %s from server %s for mac %s' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s' %
                           (cip, sip, mac))
             else:
                 cip, sip = self.send_recv(update_seed = True, validate = False)
@@ -142,7 +142,7 @@
 	    	self.ip_count +=1
 	    elif cip == None:
 		self.failure_count += 1
-                log.info('Failed to get ip')
+                log_test.info('Failed to get ip')
 		if success_rate and self.ip_count > 0:
 		   break
 	    self.diff = round(time.time() - self.start_time, 0)
@@ -168,7 +168,7 @@
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = self.iface)
 	cip, sip, mac, _ = self.dhcp.only_discover(mac='ff:ff:ff:ff:ff:ff')
 	assert_equal(cip,None)
-	log.info('ONOS dhcp server rejected client discover with invalid source mac as expected')
+	log_test.info('ONOS dhcp server rejected client discover with invalid source mac as expected')
 
     def test_dhcp_1request_with_invalid_source_mac_multicast(self):
         config = {'startip':'10.10.10.20', 'endip':'10.10.10.69',
@@ -178,7 +178,7 @@
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = self.iface)
         cip, sip, mac, _ = self.dhcp.only_discover(mac='01:80:c2:91:02:e4')
         assert_equal(cip,None)
-        log.info('ONOS dhcp server rejected client discover with invalid source mac as expected')
+        log_test.info('ONOS dhcp server rejected client discover with invalid source mac as expected')
 
     def test_dhcp_1request_with_invalid_source_mac_zero(self):
         config = {'startip':'10.10.10.20', 'endip':'10.10.10.69',
@@ -188,7 +188,7 @@
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = self.iface)
         cip, sip, mac, _ = self.dhcp.only_discover(mac='00:00:00:00:00:00')
         assert_equal(cip,None)
-        log.info('ONOS dhcp server rejected client discover with invalid source mac as expected')
+        log_test.info('ONOS dhcp server rejected client discover with invalid source mac as expected')
 
     def test_dhcp_Nrequest(self, requests=10):
         config = {'startip':'192.168.1.20', 'endip':'192.168.1.69',
@@ -200,7 +200,7 @@
         for i in range(requests):
             cip, sip = self.send_recv(update_seed = True)
             if ip_map.has_key(cip):
-                log.info('IP %s given out multiple times' %cip)
+                log_test.info('IP %s given out multiple times' %cip)
                 assert_equal(False, ip_map.has_key(cip))
             ip_map[cip] = sip
 
@@ -211,13 +211,13 @@
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '10.10.100.10', iface = self.iface)
         cip, sip = self.send_recv()
-        log.info('Releasing ip %s to server %s' %(cip, sip))
+        log_test.info('Releasing ip %s to server %s' %(cip, sip))
         assert_equal(self.dhcp.release(cip), True)
-        log.info('Triggering DHCP discover again after release')
+        log_test.info('Triggering DHCP discover again after release')
         cip2, sip2 = self.send_recv(update_seed = True)
-        log.info('Verifying released IP was given back on rediscover')
+        log_test.info('Verifying released IP was given back on rediscover')
         assert_equal(cip, cip2)
-        log.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
+        log_test.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
         assert_equal(self.dhcp.release(cip2), True)
 
     def test_dhcp_Nrelease(self):
@@ -230,24 +230,24 @@
         for i in range(10):
             cip, sip = self.send_recv(update_seed = True)
             if ip_map.has_key(cip):
-                log.info('IP %s given out multiple times' %cip)
+                log_test.info('IP %s given out multiple times' %cip)
                 assert_equal(False, ip_map.has_key(cip))
             ip_map[cip] = sip
 
         for ip in ip_map.keys():
-            log.info('Releasing IP %s' %ip)
+            log_test.info('Releasing IP %s' %ip)
             assert_equal(self.dhcp.release(ip), True)
 
         ip_map2 = {}
-        log.info('Triggering DHCP discover again after release')
+        log_test.info('Triggering DHCP discover again after release')
         for i in range(len(ip_map.keys())):
             cip, sip = self.send_recv(update_seed = True)
             ip_map2[cip] = sip
 
-        log.info('Verifying released IPs were given back on rediscover')
+        log_test.info('Verifying released IPs were given back on rediscover')
         if ip_map != ip_map2:
-            log.info('Map before release %s' %ip_map)
-            log.info('Map after release %s' %ip_map2)
+            log_test.info('Map before release %s' %ip_map)
+            log_test.info('Map after release %s' %ip_map2)
         assert_equal(ip_map, ip_map2)
 
 
@@ -261,7 +261,7 @@
         for i in range(10):
             cip, sip = self.send_recv(update_seed = True)
             if ip_map.has_key(cip):
-                log.info('IP %s given out multiple times' %cip)
+                log_test.info('IP %s given out multiple times' %cip)
                 assert_equal(False, ip_map.has_key(cip))
             ip_map[cip] = sip
 
@@ -272,11 +272,11 @@
                   'subnet': '255.255.255.0', 'broadcast':'182.17.0.255', 'router':'182.17.0.1'}
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '182.17.0.1', iface = self.iface)
-        log.info('Verifying passitive case')
+        log_test.info('Verifying passitive case')
         for x in xrange(50):
             mac = RandMAC()._fix()
             self.send_recv(mac = mac)
-        log.info('Verifying negative case')
+        log_test.info('Verifying negative case')
         cip, sip = self.send_recv(update_seed = True, validate = False)
         assert_equal(cip, None)
         assert_equal(sip, None)
@@ -289,13 +289,13 @@
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = self.iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s . Not going to send DHCPREQUEST.' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s . Not going to send DHCPREQUEST.' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
-	log.info('Triggering DHCP discover again.')
+	log_test.info('Triggering DHCP discover again.')
 	new_cip, new_sip, new_mac, _ = self.dhcp.only_discover()
 	assert_equal(new_cip, cip)
-	log.info('client got same IP as expected when sent 2nd discovery')
+	log_test.info('client got same IP as expected when sent 2nd discovery')
 
 
     def test_dhcp_same_client_multiple_request(self):
@@ -304,13 +304,13 @@
                  'subnet': '255.255.255.0', 'broadcast':'10.10.10.255', 'router':'10.10.10.1'}
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = self.iface)
-	log.info('Sending DHCP discover and DHCP request.')
+	log_test.info('Sending DHCP discover and DHCP request.')
 	cip, sip = self.send_recv()
 	mac = self.dhcp.get_mac(cip)[0]
-	log.info("Sending DHCP request again.")
+	log_test.info("Sending DHCP request again.")
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip,cip)
-	log.info('server offered same IP to clain for multiple requests, as expected')
+	log_test.info('server offered same IP to clain for multiple requests, as expected')
 
     def test_dhcp_client_desired_address(self):
 	config = {'startip':'20.20.20.30', 'endip':'20.20.20.69',
@@ -320,10 +320,10 @@
         self.dhcp = DHCPTest(seed_ip = '20.20.20.50', iface = self.iface)
 	cip, sip, mac, _ = self.dhcp.only_discover(desired = True)
 	assert_not_equal(cip, None)
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac))
 	assert_equal(cip,self.dhcp.seed_ip)
-	log.info('ONOS dhcp server offered client requested IP %s as expected'%self.dhcp.seed_ip)
+	log_test.info('ONOS dhcp server offered client requested IP %s as expected'%self.dhcp.seed_ip)
 
     #test failing, server not returns NAK when requested out of pool IP
     def test_dhcp_client_desired_address_out_of_pool(self):
@@ -334,10 +334,10 @@
         self.dhcp = DHCPTest(seed_ip = '20.20.20.75', iface = self.iface)
 	cip, sip, mac, _ = self.dhcp.only_discover(desired = True)
 	assert_not_equal(cip, None)
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip,self.dhcp.seed_ip)
-	log.info('server offered IP from its pool of IPs when requested out of pool IP, as expected')
+	log_test.info('server offered IP from its pool of IPs when requested out of pool IP, as expected')
 
 
     def test_dhcp_server_nak_packet(self):
@@ -347,12 +347,12 @@
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	new_cip, new_sip = self.dhcp.only_request('20.20.20.31', mac)
         assert_equal(new_cip, None)  #Negative Test Case
-	log.info('dhcp servers sent NAK as expected when requested different IP from  same client')
+	log_test.info('dhcp servers sent NAK as expected when requested different IP from  same client')
 
 
     #test_dhcp_lease_packet
@@ -363,10 +363,10 @@
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
 	self.dhcp.return_option = 'lease'
-	log.info('Sending DHCP discover with lease time of 700')
+	log_test.info('Sending DHCP discover with lease time of 700')
 	cip, sip, mac, lval = self.dhcp.only_discover(lease_time = True, lease_value = lease_time)
         assert_equal(lval, 700)
-	log.info('dhcp server offered IP address with client requested lease  time')
+	log_test.info('dhcp server offered IP address with client requested lease  time')
 
     def test_dhcp_client_request_after_reboot(self):
 	config = {'startip':'20.20.20.30', 'endip':'20.20.20.69',
@@ -375,17 +375,17 @@
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip,None)
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
-	log.info('verifying client IP after reboot')
+	log_test.info('verifying client IP after reboot')
 	os.system('ifconfig '+self.iface+' down')
 	time.sleep(5)
 	os.system('ifconfig '+self.iface+' up')
 	new_cip, new_sip = self.dhcp.only_request(cip, mac, cl_reboot = True)
 	assert_equal(new_cip,cip)
-	log.info('client got same ip after reboot, as expected')
+	log_test.info('client got same ip after reboot, as expected')
 
 
     def test_dhcp_server_after_reboot(self):
@@ -395,7 +395,7 @@
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
@@ -407,7 +407,7 @@
 	time.sleep(3)
 	new_cip2, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip2,cip)
-	log.info('client got same ip after server reboot, as expected')
+	log_test.info('client got same ip after server reboot, as expected')
 
     def test_dhcp_specific_lease_time_only_in_discover_but_not_in_request_packet(self,lease_time=700):
 	config = {'startip':'20.20.20.30', 'endip':'20.20.20.69',
@@ -415,15 +415,15 @@
                  'subnet': '255.255.255.0', 'broadcast':'20.20.20.255', 'router':'20.20.20.1'}
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
-	log.info('Sending DHCP discover with lease time of 700')
+	log_test.info('Sending DHCP discover with lease time of 700')
 	cip, sip, mac, _ = self.dhcp.only_discover(lease_time = True,lease_value=lease_time)
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, lease_time = True)
 	assert_equal(new_cip,cip)
 	assert_not_equal(lval, lease_time) #Negative Test Case
-	log.info('client requested lease time only in discover but not in request, not seen in server ACK packet as expected')
+	log_test.info('client requested lease time only in discover but not in request, not seen in server ACK packet as expected')
 
 
     def test_dhcp_specific_lease_time_only_in_request_but_not_in_discover_packet(self,lease_time=800):
@@ -433,12 +433,12 @@
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, lease_time = True, lease_value=lease_time)
 	assert_equal(lval, lease_time)
-	log.info('client requested lease time in request packet, seen in server ACK packet as expected')
+	log_test.info('client requested lease time in request packet, seen in server ACK packet as expected')
 
     def test_dhcp_client_renew_time(self):
 
@@ -448,15 +448,15 @@
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, renew_time = True)
-	log.info('waiting renew  time %d seconds to send next request packet'%lval)
+	log_test.info('waiting renew  time %d seconds to send next request packet'%lval)
 	time.sleep(lval)
 	latest_cip, latest_sip, lval = self.dhcp.only_request(cip, mac, renew_time = True)
 	assert_equal(latest_cip,cip)
-	log.info('client got same IP after renew time, as expected')
+	log_test.info('client got same IP after renew time, as expected')
 
     def test_dhcp_client_rebind_time(self):
 
@@ -466,15 +466,15 @@
         self.onos_dhcp_table_load(config)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, rebind_time = True)
-	log.info('waiting rebind time %d seconds to send next request packet'%lval)
+	log_test.info('waiting rebind time %d seconds to send next request packet'%lval)
 	time.sleep(lval)
 	latest_cip, latest_sip = self.dhcp.only_request(new_cip, mac)
 	assert_equal(latest_cip,cip)
-	log.info('client got same IP after rebind time, as expected')
+	log_test.info('client got same IP after rebind time, as expected')
 
     def test_dhcp_client_expected_subnet_mask(self):
 
@@ -488,9 +488,9 @@
 	cip, sip, mac, subnet_mask = self.dhcp.only_discover()
 	assert_equal(subnet_mask, expected_subnet)
 	assert_not_equal(cip, None)
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
-	log.info('seen expected subnet mask %s in dhcp offer packet'%subnet_mask)
+	log_test.info('seen expected subnet mask %s in dhcp offer packet'%subnet_mask)
 
     def test_dhcp_client_sends_dhcp_request_with_wrong_subnet_mask(self):
 
@@ -501,13 +501,13 @@
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
 
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	self.dhcp.send_different_option = 'subnet'
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip, cip)
-	log.info("Got DHCP Ack despite of specifying wrong Subnet Mask in DHCP Request.")
+	log_test.info("Got DHCP Ack despite of specifying wrong Subnet Mask in DHCP Request.")
 
 
     def test_dhcp_client_expected_router_address(self):
@@ -521,11 +521,11 @@
 	self.dhcp.return_option = 'router'
 
 	cip, sip, mac, router_address_ip = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	assert_equal(expected_router_address, router_address_ip)
-	log.info('seen expected rouer address %s ip in dhcp offer packet'%router_address_ip)
+	log_test.info('seen expected rouer address %s ip in dhcp offer packet'%router_address_ip)
 
     def test_dhcp_client_sends_dhcp_request_with_wrong_router_address(self):
 
@@ -536,13 +536,13 @@
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
 
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	self.dhcp.send_different_option = 'router'
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip, cip)
-	log.info("Got DHCP Ack despite of specifying wrong Router Address in DHCP Request.")
+	log_test.info("Got DHCP Ack despite of specifying wrong Router Address in DHCP Request.")
 
 
     def test_dhcp_client_expected_broadcast_address(self):
@@ -556,11 +556,11 @@
 	self.dhcp.return_option = 'broadcast_address'
 
 	cip, sip, mac, broadcast_address = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	assert_equal(expected_broadcast_address, broadcast_address)
-	log.info('seen expected broadcast address %s in dhcp offer packet'%broadcast_address)
+	log_test.info('seen expected broadcast address %s in dhcp offer packet'%broadcast_address)
 
     def test_dhcp_client_sends_dhcp_request_with_wrong_broadcast_address(self):
 
@@ -571,13 +571,13 @@
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = self.iface)
 
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	self.dhcp.send_different_option = 'broadcast_address'
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip, cip)
-	log.info("Got DHCP Ack despite of specifying wrong Broadcast Address in DHCP Request.")
+	log_test.info("Got DHCP Ack despite of specifying wrong Broadcast Address in DHCP Request.")
 
     def test_dhcp_client_expected_dns_address(self):
 
@@ -591,10 +591,10 @@
 
 	cip, sip, mac, dns_address = self.dhcp.only_discover()
 	assert_not_equal(cip, None)
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_equal(expected_dns_address, dns_address)
-	log.info('seen expected DNS ip address %s in dhcp offer packet'%dns_address)
+	log_test.info('seen expected DNS ip address %s in dhcp offer packet'%dns_address)
 
     def test_dhcp_client_sends_request_with_wrong_dns_address(self):
 
@@ -606,96 +606,95 @@
 
 	cip, sip, mac, _ = self.dhcp.only_discover()
 	assert_not_equal(cip, None)
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	self.dhcp.send_different_option = 'dns'
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip, cip)
-	log.info("Got DHCP Ack despite of specifying wrong DNS Address in DHCP Request.")
+	log_test.info("Got DHCP Ack despite of specifying wrong DNS Address in DHCP Request.")
 
     def test_dhcp_server_transactions_per_second(self):
 
 	for i in range(1,4):
 		self.stats()
-		log.info("Stats for run %d",i)
-		log.info("----------------------------------------------------------------------------------")
-		log.info("No. of transactions     No. of successes     No. of failures     Running Time ")
-	        log.info("    %d                    %d                     %d                  %d" %(self.ip_count+self.failure_count, 		               self.ip_count, self.failure_count, self.diff))
-		log.info("----------------------------------------------------------------------------------")
-		log.info("No. of transactions per second in run %d:%f" %(i, self.transaction_count))
+		log_test.info("Stats for run %d",i)
+		log_test.info("----------------------------------------------------------------------------------")
+		log_test.info("No. of transactions     No. of successes     No. of failures     Running Time ")
+	        log_test.info("    %d                    %d                     %d                  %d" %(self.ip_count+self.failure_count, 		               self.ip_count, self.failure_count, self.diff))
+		log_test.info("----------------------------------------------------------------------------------")
+		log_test.info("No. of transactions per second in run %d:%f" %(i, self.transaction_count))
 
-	log.info("Final Statistics for total transactions")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
-	log.info("    %d                     %d                         %d                        %d" %(self.transactions,
+	log_test.info("Final Statistics for total transactions")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
+	log_test.info("    %d                     %d                         %d                        %d" %(self.transactions,
                  self.total_success, self.total_failure, self.running_time))
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of transactions per second: %d", round(self.transactions/self.running_time,0))
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of transactions per second: %d", round(self.transactions/self.running_time,0))
 
     def test_dhcp_server_consecutive_successes_per_second(self):
 
 	for i in range(1,4):
 		self.stats(success_rate = True)
-		log.info("Stats for run %d",i)
-		log.info("----------------------------------------------------------------------------------")
-		log.info("No. of consecutive successful transactions          Running Time ")
-	        log.info("                   %d                                   %d        " %(self.ip_count, self.diff))
-		log.info("----------------------------------------------------------------------------------")
-		log.info("No. of successful transactions per second in run %d:%f" %(i, self.transaction_count))
-		log.info("----------------------------------------------------------------------------------")
+		log_test.info("Stats for run %d",i)
+		log_test.info("----------------------------------------------------------------------------------")
+		log_test.info("No. of consecutive successful transactions          Running Time ")
+	        log_test.info("                   %d                                   %d        " %(self.ip_count, self.diff))
+		log_test.info("----------------------------------------------------------------------------------")
+		log_test.info("No. of successful transactions per second in run %d:%f" %(i, self.transaction_count))
+		log_test.info("----------------------------------------------------------------------------------")
 
-	log.info("Final Statistics for total successful transactions")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of consecutive successes         Running Time ")
-	log.info("    %d                                 %d                             %d        " %(self.transactions,
+	log_test.info("Final Statistics for total successful transactions")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of consecutive successes         Running Time ")
+	log_test.info("    %d                                 %d                             %d        " %(self.transactions,
                  self.total_success, self.running_time))
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of consecutive successful transactions per second: %d", round(self.total_success/self.running_time,0))
-	log.info("----------------------------------------------------------------------------------")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of consecutive successful transactions per second: %d", round(self.total_success/self.running_time,0))
+	log_test.info("----------------------------------------------------------------------------------")
 
 
     def test_dhcp_server_client_transactions_per_second(self):
 
         for i in range(1,4):
 		self.stats(only_discover = True)
-		log.info("----------------------------------------------------------------------------------")
-		log.info("Stats for run %d of sending only DHCP Discover",i)
-		log.info("----------------------------------------------------------------------------------")
-		log.info("No. of transactions     No. of successes     No. of failures     Running Time ")
-	        log.info("    %d                    %d                     %d                  %d" %(self.ip_count+self.failure_count, 		               self.ip_count, self.failure_count, self.diff))
-		log.info("----------------------------------------------------------------------------------")
-		log.info("No. of clients per second in run %d:%f                                      "
+		log_test.info("----------------------------------------------------------------------------------")
+		log_test.info("Stats for run %d of sending only DHCP Discover",i)
+		log_test.info("----------------------------------------------------------------------------------")
+		log_test.info("No. of transactions     No. of successes     No. of failures     Running Time ")
+	        log_test.info("    %d                    %d                     %d                  %d" %(self.ip_count+self.failure_count, 		               self.ip_count, self.failure_count, self.diff))
+		log_test.info("----------------------------------------------------------------------------------")
+		log_test.info("No. of clients per second in run %d:%f                                      "
 			%(i, self.transaction_count))
-		log.info("----------------------------------------------------------------------------------")
-	log.info("Final Statistics for total transactions of sending only DHCP Discover")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
-	log.info("    %d                     %d                         %d                        %d" %(self.transactions,
+		log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Final Statistics for total transactions of sending only DHCP Discover")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
+	log_test.info("    %d                     %d                         %d                        %d" %(self.transactions,
                  self.total_success, self.total_failure, self.running_time))
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of clients per second: %d                                        ",
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of clients per second: %d                                        ",
 		round(self.transactions/self.running_time,0))
-	log.info("----------------------------------------------------------------------------------")
+	log_test.info("----------------------------------------------------------------------------------")
 
     def test_dhcp_server_consecutive_successful_clients_per_second(self):
 
         for i in range(1,4):
 		self.stats(success_rate = True, only_discover = True)
-		log.info("----------------------------------------------------------------------------------")
-		log.info("Stats for run %d for sending only DHCP Discover",i)
-		log.info("----------------------------------------------------------------------------------")
-		log.info("No. of consecutive successful transactions          Running Time ")
-	        log.info("                   %d                                   %d        " %(self.ip_count, self.diff))
-		log.info("----------------------------------------------------------------------------------")
-		log.info("No. of consecutive successful clients per second in run %d:%f" %(i, self.transaction_count))
-		log.info("----------------------------------------------------------------------------------")
+		log_test.info("----------------------------------------------------------------------------------")
+		log_test.info("Stats for run %d for sending only DHCP Discover",i)
+		log_test.info("----------------------------------------------------------------------------------")
+		log_test.info("No. of consecutive successful transactions          Running Time ")
+	        log_test.info("                   %d                                   %d        " %(self.ip_count, self.diff))
+		log_test.info("----------------------------------------------------------------------------------")
+		log_test.info("No. of consecutive successful clients per second in run %d:%f" %(i, self.transaction_count))
+		log_test.info("----------------------------------------------------------------------------------")
 
-	log.info("Final Statistics for total successful transactions")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of consecutive successes         Running Time ")
-	log.info("    %d                                 %d                             %d        " %(self.transactions,
+	log_test.info("Final Statistics for total successful transactions")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of consecutive successes         Running Time ")
+	log_test.info("    %d                                 %d                             %d        " %(self.transactions,
                  self.total_success, self.running_time))
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of consecutive successful clients per second: %d", round(self.total_success/self.running_time,0))
-	log.info("----------------------------------------------------------------------------------")
-
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of consecutive successful clients per second: %d", round(self.total_success/self.running_time,0))
+	log_test.info("----------------------------------------------------------------------------------")
diff --git a/src/test/dhcprelay/dhcprelayTest.py b/src/test/dhcprelay/dhcprelayTest.py
index 2cfb4be..20d3097 100644
--- a/src/test/dhcprelay/dhcprelayTest.py
+++ b/src/test/dhcprelay/dhcprelayTest.py
@@ -17,11 +17,10 @@
 from nose.tools import *
 from nose.twistedtools import reactor, deferred
 from twisted.internet import defer
-from scapy.all import *
 import time
 import os, sys
 from DHCP import DHCPTest
-from CordTestUtils import get_mac
+from CordTestUtils import get_mac, log_test
 from OnosCtrl import OnosCtrl
 from OltConfig import OltConfig
 from CordTestServer import cord_test_onos_restart
@@ -29,7 +28,7 @@
 from portmaps import g_subscriber_port_map
 import threading, random
 from threading import current_thread
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 class dhcprelay_exchange(CordLogger):
 
@@ -136,14 +135,14 @@
         for config in cls.configs.items():
             OnosCtrl.delete(config)
         # if cls.onos_restartable is True:
-        #     log.info('Cleaning up dhcp relay config by restarting ONOS with default network cfg')
+        #     log_test.info('Cleaning up dhcp relay config by restarting ONOS with default network cfg')
         #     return cord_test_onos_restart(config = {})
 
     @classmethod
     def onos_load_config(cls, config):
         status, code = OnosCtrl.config(config)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         time.sleep(3)
 
@@ -246,7 +245,7 @@
 
         intf_str = ','.join(intf_list)
         dhcpd_cmd = '/usr/sbin/dhcpd -4 --no-pid -cf {0} -lf {1} {2}'.format(conf_file, lease_file, intf_str)
-        log.info('Starting DHCPD server with command: %s' %dhcpd_cmd)
+        log_test.info('Starting DHCPD server with command: %s' %dhcpd_cmd)
         ret = os.system(dhcpd_cmd)
         assert_equal(ret, 0)
         time.sleep(3)
@@ -297,7 +296,7 @@
 
 	    if only_discover:
 		cip, sip, mac, _ = self.dhcp.only_discover(multiple = True)
-                log.info('Got dhcp client IP %s from server %s for mac %s' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s' %
                         (cip, sip, mac))
 	    else:
 	        cip, sip = self.send_recv(mac=mac, update_seed = True, validate = False)
@@ -306,7 +305,7 @@
                 self.ip_count +=1
 	    elif cip == None:
 		self.failure_count += 1
-                log.info('Failed to get ip')
+                log_test.info('Failed to get ip')
 		if success_rate and self.ip_count > 0:
 			break
 
@@ -323,7 +322,7 @@
         if validate:
             assert_not_equal(cip, None)
             assert_not_equal(sip, None)
-        log.info('Got dhcp client IP %s from server %s for mac %s' %
+        log_test.info('Got dhcp client IP %s from server %s for mac %s' %
                 (cip, sip, self.dhcp.get_mac(cip)[0]))
         return cip,sip
 
@@ -359,7 +358,7 @@
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
 	cip, sip, mac, _ = self.dhcp.only_discover(mac='ff:ff:ff:ff:ff:ff')
         assert_equal(cip,None)
-	log.info('dhcp server rejected client discover with invalid source mac, as expected')
+	log_test.info('dhcp server rejected client discover with invalid source mac, as expected')
 
     def test_dhcpRelay_1request_with_invalid_source_mac_multicast(self, iface = 'veth0'):
         mac = self.get_mac(iface)
@@ -377,7 +376,7 @@
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
         cip, sip, mac, _ = self.dhcp.only_discover(mac='01:80:c2:01:98:05')
         assert_equal(cip,None)
-	log.info('dhcp server rejected client discover with invalid source mac, as expected')
+	log_test.info('dhcp server rejected client discover with invalid source mac, as expected')
 
     def test_dhcpRelay_1request_with_invalid_source_mac_zero(self, iface = 'veth0'):
         mac = self.get_mac(iface)
@@ -395,7 +394,7 @@
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
         cip, sip, mac, _ = self.dhcp.only_discover(mac='00:00:00:00:00:00')
         assert_equal(cip,None)
-        log.info('dhcp server rejected client discover with invalid source mac, as expected')
+        log_test.info('dhcp server rejected client discover with invalid source mac, as expected')
 
     def test_dhcpRelay_Nrequest(self, iface = 'veth0',requests=10):
         mac = self.get_mac(iface)
@@ -414,10 +413,10 @@
         ip_map = {}
         for i in range(requests):
             #mac = RandMAC()._fix()
-	    #log.info('mac is %s'%mac)
+	    #log_test.info('mac is %s'%mac)
             cip, sip = self.send_recv(update_seed = True)
             if ip_map.has_key(cip):
-                log.info('IP %s given out multiple times' %cip)
+                log_test.info('IP %s given out multiple times' %cip)
                 assert_equal(False, ip_map.has_key(cip))
             ip_map[cip] = sip
 	    time.sleep(1)
@@ -437,13 +436,13 @@
                          subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '10.10.100.10', iface = iface)
         cip, sip = self.send_recv(mac=mac)
-        log.info('Releasing ip %s to server %s' %(cip, sip))
+        log_test.info('Releasing ip %s to server %s' %(cip, sip))
         assert_equal(self.dhcp.release(cip), True)
-        log.info('Triggering DHCP discover again after release')
+        log_test.info('Triggering DHCP discover again after release')
         cip2, sip2 = self.send_recv(mac=mac)
-        log.info('Verifying released IP was given back on rediscover')
+        log_test.info('Verifying released IP was given back on rediscover')
         assert_equal(cip, cip2)
-        log.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
+        log_test.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
         assert_equal(self.dhcp.release(cip2), True)
 
     def test_dhcpRelay_Nrelease(self, iface = 'veth0'):
@@ -464,25 +463,25 @@
         for i in range(10):
             cip, sip = self.send_recv(mac=mac, update_seed = True)
             if ip_map.has_key(cip):
-                log.info('IP %s given out multiple times' %cip)
+                log_test.info('IP %s given out multiple times' %cip)
                 assert_equal(False, ip_map.has_key(cip))
             ip_map[cip] = sip
 
         for ip in ip_map.keys():
-            log.info('Releasing IP %s' %ip)
+            log_test.info('Releasing IP %s' %ip)
             assert_equal(self.dhcp.release(ip), True)
 
         ip_map2 = {}
-        log.info('Triggering DHCP discover again after release')
+        log_test.info('Triggering DHCP discover again after release')
         self.dhcp = DHCPTest(seed_ip = '192.170.1.10', iface = iface)
         for i in range(len(ip_map.keys())):
             cip, sip = self.send_recv(mac=mac, update_seed = True)
             ip_map2[cip] = sip
 
-        log.info('Verifying released IPs were given back on rediscover')
+        log_test.info('Verifying released IPs were given back on rediscover')
         if ip_map != ip_map2:
-            log.info('Map before release %s' %ip_map)
-            log.info('Map after release %s' %ip_map2)
+            log_test.info('Map before release %s' %ip_map)
+            log_test.info('Map after release %s' %ip_map2)
         assert_equal(ip_map, ip_map2)
 
     def test_dhcpRelay_starvation(self, iface = 'veth0'):
@@ -499,7 +498,7 @@
                          options = options,
                          subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '182.17.0.1', iface = iface)
-        log.info('Verifying 1 ')
+        log_test.info('Verifying 1 ')
 	count = 0
         while True:
             #mac = RandMAC()._fix()
@@ -509,7 +508,7 @@
 	    else:
 		count += 1
 	assert_equal(count,91)
-        log.info('Verifying 2 ')
+        log_test.info('Verifying 2 ')
         cip, sip = self.send_recv(mac=mac, update_seed = True, validate = False)
         assert_equal(cip, None)
         assert_equal(sip, None)
@@ -529,13 +528,13 @@
                          subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s . Not going to send DHCPREQUEST.' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s . Not going to send DHCPREQUEST.' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
-	log.info('Triggering DHCP discover again.')
+	log_test.info('Triggering DHCP discover again.')
 	new_cip, new_sip, new_mac, _ = self.dhcp.only_discover()
 	assert_equal(new_cip, cip)
-	log.info('got same ip to smae the client when sent discover again, as expected')
+	log_test.info('got same ip to smae the client when sent discover again, as expected')
 
     def test_dhcpRelay_same_client_multiple_request(self, iface = 'veth0'):
         mac = self.get_mac(iface)
@@ -551,13 +550,13 @@
                          options = options,
                          subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
-	log.info('Sending DHCP discover and DHCP request.')
+	log_test.info('Sending DHCP discover and DHCP request.')
 	cip, sip = self.send_recv(mac=mac)
 	mac = self.dhcp.get_mac(cip)[0]
-	log.info("Sending DHCP request again.")
+	log_test.info("Sending DHCP request again.")
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip, cip)
-	log.info('got same ip to smae the client when sent request again, as expected')
+	log_test.info('got same ip to smae the client when sent request again, as expected')
 
     def test_dhcpRelay_client_desired_address(self, iface = 'veth0'):
         mac = self.get_mac(iface)
@@ -575,7 +574,7 @@
         self.dhcp = DHCPTest(seed_ip = '192.168.1.31', iface = iface)
 	cip, sip, mac, _ = self.dhcp.only_discover(desired = True)
 	assert_equal(cip,self.dhcp.seed_ip)
-	log.info('Got dhcp client desired IP %s from server %s for mac %s as expected' %
+	log_test.info('Got dhcp client desired IP %s from server %s for mac %s as expected' %
 		  (cip, sip, mac) )
 
     def test_dhcpRelay_client_desired_address_out_of_pool(self, iface = 'veth0'):
@@ -596,7 +595,7 @@
 	cip, sip, mac, _ = self.dhcp.only_discover(desired = True)
 	assert_not_equal(cip,None)
 	assert_not_equal(cip,self.dhcp.seed_ip)
-	log.info('server offered IP from its pool when requested out of pool IP, as expected')
+	log_test.info('server offered IP from its pool when requested out of pool IP, as expected')
 
     def test_dhcpRelay_nak_packet(self, iface = 'veth0'):
         mac = self.get_mac(iface)
@@ -613,12 +612,12 @@
                          subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	new_cip, new_sip = self.dhcp.only_request('20.20.20.31', mac)
 	assert_equal(new_cip, None)
-	log.info('server sent NAK packet when requested other IP than that server offered')
+	log_test.info('server sent NAK packet when requested other IP than that server offered')
 
 
     def test_dhcpRelay_client_requests_specific_lease_time_in_discover(self, iface = 'veth0',lease_time=700):
@@ -638,7 +637,7 @@
 	self.dhcp.return_option = 'lease'
 	cip, sip, mac, lval = self.dhcp.only_discover(lease_time=True,lease_value=lease_time)
 	assert_equal(lval, lease_time)
-	log.info('dhcp server offered IP address with client requested lease time')
+	log_test.info('dhcp server offered IP address with client requested lease time')
 
     def test_dhcpRelay_client_request_after_reboot(self, iface = 'veth0'):
         mac = self.get_mac(iface)
@@ -655,17 +654,17 @@
                          subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
-	log.info('client rebooting...')
+	log_test.info('client rebooting...')
 	os.system('ifconfig '+iface+' down')
 	time.sleep(5)
 	os.system('ifconfig '+iface+' up')
 	new_cip2, new_sip = self.dhcp.only_request(cip, mac, cl_reboot = True)
 	assert_equal(new_cip2, cip)
-	log.info('client got same IP after reboot, as expected')
+	log_test.info('client got same IP after reboot, as expected')
 
 
     def test_dhcpRelay_after_server_reboot(self, iface = 'veth0'):
@@ -683,18 +682,18 @@
                          subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip, None)
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
-	log.info('server rebooting...')
+	log_test.info('server rebooting...')
 	self.tearDownClass()
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip,None)
 	self.setUpClass()
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip, cip)
-	log.info('client got same IP after server rebooted, as expected')
+	log_test.info('client got same IP after server rebooted, as expected')
 
 
     def test_dhcpRelay_specific_lease_time_only_in_discover_but_not_in_request_packet(self, iface = 'veth0',lease_time=700):
@@ -712,13 +711,13 @@
                          subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
 	self.dhcp.return_option = 'lease'
-	log.info('Sending DHCP discover with lease time of 700')
+	log_test.info('Sending DHCP discover with lease time of 700')
 	cip, sip, mac, lval = self.dhcp.only_discover(lease_time = True, lease_value=lease_time)
 	assert_equal(lval,lease_time)
 	new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, lease_time = True)
 	assert_equal(new_cip,cip)
 	assert_not_equal(lval, lease_time) #Negative Test Case
-	log.info('client requested lease time in discover packer is not seen in server ACK packet as expected')
+	log_test.info('client requested lease time in discover packer is not seen in server ACK packet as expected')
 
     def test_dhcpRelay_specific_lease_time_only_in_request_but_not_in_discover_packet(self, iface = 'veth0',lease_time=800):
         mac = self.get_mac(iface)
@@ -738,7 +737,7 @@
 	new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, lease_time = True,lease_value=lease_time)
 	assert_equal(new_cip,cip)
 	assert_equal(lval, lease_time)
-	log.info('client requested lease time in request packet seen in servre replied ACK packet as expected')
+	log_test.info('client requested lease time in request packet seen in servre replied ACK packet as expected')
 
     def test_dhcpRelay_client_renew_time(self, iface = 'veth0'):
         mac = self.get_mac(iface)
@@ -756,15 +755,15 @@
                          subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip,None)
 	new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, renew_time = True)
-	log.info('waiting for  renew  time..')
+	log_test.info('waiting for  renew  time..')
 	time.sleep(lval)
 	latest_cip, latest_sip = self.dhcp.only_request(new_cip, mac, unicast = True)
 	assert_equal(latest_cip, cip)
-	log.info('server renewed client IP when client sends request after renew time, as expected')
+	log_test.info('server renewed client IP when client sends request after renew time, as expected')
 
 
     def test_dhcpRelay_client_rebind_time(self, iface = 'veth0'):
@@ -783,15 +782,15 @@
                          subnet = subnet)
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip,None)
 	new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, rebind_time = True)
-	log.info('waiting for  rebind  time..')
+	log_test.info('waiting for  rebind  time..')
 	time.sleep(lval)
 	latest_cip, latest_sip = self.dhcp.only_request(new_cip, mac)
 	assert_equal(latest_cip, cip)
-        log.info('server renewed client IP when client sends request after rebind time, as expected')
+        log_test.info('server renewed client IP when client sends request after rebind time, as expected')
 
 
     def test_dhcpRelay_client_expected_subnet_mask(self, iface = 'veth0'):
@@ -812,10 +811,10 @@
 	self.dhcp.return_option = 'subnet'
 
 	cip, sip, mac, subnet_mask = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_equal(subnet_mask,expected_subnet)
-	log.info('subnet mask in server offer packet is same as configured subnet mask in dhcp server')
+	log_test.info('subnet mask in server offer packet is same as configured subnet mask in dhcp server')
 
 
     def test_dhcpRelay_client_sends_dhcp_request_with_wrong_subnet_mask(self, iface = 'veth0'):
@@ -834,13 +833,13 @@
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
 
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip,None)
 	self.dhcp.send_different_option = 'subnet'
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip, cip)
-	log.info("Got DHCP Ack despite of specifying wrong Subnet Mask in DHCP Request.")
+	log_test.info("Got DHCP Ack despite of specifying wrong Subnet Mask in DHCP Request.")
 
 
     def test_dhcpRelay_client_expected_router_address(self, iface = 'veth0'):
@@ -863,10 +862,10 @@
 	self.dhcp.return_option = 'router'
 
 	cip, sip, mac, router_address_value = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_equal(expected_router_address, router_address_value)
-	log.info('router address in server offer packet is same as configured router address in dhcp server')
+	log_test.info('router address in server offer packet is same as configured router address in dhcp server')
 
 
     def test_dhcpRelay_client_sends_dhcp_request_with_wrong_router_address(self, iface = 'veth0'):
@@ -885,13 +884,13 @@
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
 
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip,None)
 	self.dhcp.send_different_option = 'router'
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip, cip)
-	log.info("Got DHCP Ack despite of specifying wrong Router Address in DHCP Request.")
+	log_test.info("Got DHCP Ack despite of specifying wrong Router Address in DHCP Request.")
 
 
     def test_dhcpRelay_client_expected_broadcast_address(self, iface = 'veth0'):
@@ -912,10 +911,10 @@
 	self.dhcp.return_option = 'broadcast_address'
 
 	cip, sip, mac, broadcast_address_value = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_equal(expected_broadcast_address, broadcast_address_value)
-	log.info('broadcast address in server offer packet is same as configured broadcast address in dhcp server')
+	log_test.info('broadcast address in server offer packet is same as configured broadcast address in dhcp server')
 
     def test_dhcpRelay_client_sends_dhcp_request_with_wrong_broadcast_address(self, iface = 'veth0'):
         mac = self.get_mac(iface)
@@ -933,13 +932,13 @@
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
 
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip,None)
 	self.dhcp.send_different_option = 'broadcast_address'
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip, cip)
-	log.info("Got DHCP Ack despite of specifying wrong Broadcast Address in DHCP Request.")
+	log_test.info("Got DHCP Ack despite of specifying wrong Broadcast Address in DHCP Request.")
 
 
     def test_dhcpRelay_client_expected_dns_address(self, iface = 'veth0'):
@@ -960,10 +959,10 @@
 	self.dhcp.return_option = 'dns'
 
 	cip, sip, mac, dns_address_value = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_equal(expected_dns_address, dns_address_value)
-	log.info('dns address in server offer packet is same as configured dns address in dhcp server')
+	log_test.info('dns address in server offer packet is same as configured dns address in dhcp server')
 
     def test_dhcpRelay_client_sends_request_with_wrong_dns_address(self, iface = 'veth0'):
         mac = self.get_mac(iface)
@@ -981,100 +980,100 @@
         self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
 
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s .' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
 		  (cip, sip, mac) )
 	assert_not_equal(cip,None)
 	self.dhcp.send_different_option = 'dns'
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	assert_equal(new_cip, cip)
-	log.info("Got DHCP Ack despite of specifying wrong DNS Address in DHCP Request.")
+	log_test.info("Got DHCP Ack despite of specifying wrong DNS Address in DHCP Request.")
 
 
     def test_dhcpRelay_transactions_per_second(self, iface = 'veth0'):
 
 	for i in range(1,4):
 	    self.stats()
-	    log.info("Statistics for run %d",i)
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of transactions     No. of successes     No. of failures     Running Time ")
-	    log.info("    %d                    %d                     %d                  %d" %(self.ip_count+self.failure_count, 		               self.ip_count, self.failure_count, self.diff))
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of transactions per second in run %d:%f" %(i, self.transaction_count))
+	    log_test.info("Statistics for run %d",i)
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of transactions     No. of successes     No. of failures     Running Time ")
+	    log_test.info("    %d                    %d                     %d                  %d" %(self.ip_count+self.failure_count, 		               self.ip_count, self.failure_count, self.diff))
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of transactions per second in run %d:%f" %(i, self.transaction_count))
 
-	log.info("Final Statistics for total transactions")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
-	log.info("    %d                     %d                         %d                        %d" %(self.transactions,
+	log_test.info("Final Statistics for total transactions")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
+	log_test.info("    %d                     %d                         %d                        %d" %(self.transactions,
                  self.total_success, self.total_failure, self.running_time))
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of transactions per second: %d", round(self.transactions/self.running_time,0))
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of transactions per second: %d", round(self.transactions/self.running_time,0))
 
     def test_dhcpRelay_consecutive_successes_per_second(self, iface = 'veth0'):
 
 	for i in range(1,4):
 	    self.stats(success_rate = True)
-	    log.info("Statistics for run %d",i)
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of consecutive successful transactions          Running Time ")
-	    log.info("                   %d                                   %d        " %(self.ip_count, self.diff))
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of successful transactions per second in run %d:%f" %(i, self.transaction_count))
-	    log.info("----------------------------------------------------------------------------------")
+	    log_test.info("Statistics for run %d",i)
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of consecutive successful transactions          Running Time ")
+	    log_test.info("                   %d                                   %d        " %(self.ip_count, self.diff))
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of successful transactions per second in run %d:%f" %(i, self.transaction_count))
+	    log_test.info("----------------------------------------------------------------------------------")
 
-	log.info("Final Statistics for total successful transactions")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of consecutive successes         Running Time ")
-	log.info("    %d                                 %d                             %d        " %(self.transactions,
+	log_test.info("Final Statistics for total successful transactions")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of consecutive successes         Running Time ")
+	log_test.info("    %d                                 %d                             %d        " %(self.transactions,
                  self.total_success, self.running_time))
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of consecutive successful transactions per second: %d", round(self.total_success/self.running_time,0))
-	log.info("----------------------------------------------------------------------------------")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of consecutive successful transactions per second: %d", round(self.total_success/self.running_time,0))
+	log_test.info("----------------------------------------------------------------------------------")
 
 
     def test_dhcpRelay_clients_per_second(self, iface = 'veth0'):
 
 	for i in range(1,4):
 	    self.stats(only_discover = True)
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("Statistics for run %d of sending only DHCP Discover",i)
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of transactions     No. of successes     No. of failures     Running Time ")
-	    log.info("    %d                    %d                     %d                  %d" %(self.ip_count+self.failure_count, 		               self.ip_count, self.failure_count, self.diff))
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of clients per second in run %d:%f                                      "
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("Statistics for run %d of sending only DHCP Discover",i)
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of transactions     No. of successes     No. of failures     Running Time ")
+	    log_test.info("    %d                    %d                     %d                  %d" %(self.ip_count+self.failure_count, 		               self.ip_count, self.failure_count, self.diff))
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of clients per second in run %d:%f                                      "
 		    %(i, self.transaction_count))
-	    log.info("----------------------------------------------------------------------------------")
-	log.info("Final Statistics for total transactions of sending only DHCP Discover")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
-	log.info("    %d                     %d                         %d                        %d" %(self.transactions,
+	    log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Final Statistics for total transactions of sending only DHCP Discover")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
+	log_test.info("    %d                     %d                         %d                        %d" %(self.transactions,
                  self.total_success, self.total_failure, self.running_time))
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of clients per second: %d                                        ",
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of clients per second: %d                                        ",
 		round(self.transactions/self.running_time,0))
-	log.info("----------------------------------------------------------------------------------")
+	log_test.info("----------------------------------------------------------------------------------")
 
     def test_dhcpRelay_consecutive_successful_clients_per_second(self, iface = 'veth0'):
 
 	for i in range(1,4):
 	    self.stats(success_rate = True, only_discover = True)
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("Statistics for run %d for sending only DHCP Discover",i)
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of consecutive successful transactions          Running Time ")
-	    log.info("                   %d                                   %d        " %(self.ip_count, self.diff))
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of consecutive successful clients per second in run %d:%f" %(i, self.transaction_count))
-	    log.info("----------------------------------------------------------------------------------")
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("Statistics for run %d for sending only DHCP Discover",i)
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of consecutive successful transactions          Running Time ")
+	    log_test.info("                   %d                                   %d        " %(self.ip_count, self.diff))
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of consecutive successful clients per second in run %d:%f" %(i, self.transaction_count))
+	    log_test.info("----------------------------------------------------------------------------------")
 
-	log.info("Final Statistics for total successful transactions")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of consecutive successes         Running Time ")
-	log.info("    %d                                 %d                             %d        " %(self.transactions,
+	log_test.info("Final Statistics for total successful transactions")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of consecutive successes         Running Time ")
+	log_test.info("    %d                                 %d                             %d        " %(self.transactions,
                  self.total_success, self.running_time))
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of consecutive successful clients per second: %d", round(self.total_success/self.running_time,0))
-	log.info("----------------------------------------------------------------------------------")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of consecutive successful clients per second: %d", round(self.total_success/self.running_time,0))
+	log_test.info("----------------------------------------------------------------------------------")
 
     def test_dhcpRelay_concurrent_transactions_per_second(self, iface = 'veth0'):
 
@@ -1099,7 +1098,7 @@
 	def thread_fun(i):
 	    mac = self.get_mac('veth{}'.format(i))
 	    cip, sip = DHCPTest(iface = 'veth{}'.format(i)).discover(mac = mac)
-	    log.info('Got dhcp client IP %s from server %s for mac %s'%(cip, sip, mac))
+	    log_test.info('Got dhcp client IP %s from server %s for mac %s'%(cip, sip, mac))
 	    self.lock.acquire()
 
 	    if cip:
@@ -1151,26 +1150,26 @@
 	    self.total_failure += self.failure_count
 
 
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("Statistics for run %d",i)
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of transactions     No. of successes     No. of failures     Running Time ")
-	    log.info("    %d                    %d                     %d                  %d"
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("Statistics for run %d",i)
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of transactions     No. of successes     No. of failures     Running Time ")
+	    log_test.info("    %d                    %d                     %d                  %d"
 			    %(self.ip_count+self.failure_count,self.ip_count, self.failure_count, self.diff))
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of transactions per second in run %d:%f" %(i, self.transaction_count))
-	    log.info("----------------------------------------------------------------------------------")
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of transactions per second in run %d:%f" %(i, self.transaction_count))
+	    log_test.info("----------------------------------------------------------------------------------")
 
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Final Statistics for total transactions")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
-	log.info("    %d                     %d                         %d                        %d" %(self.transactions,
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Final Statistics for total transactions")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
+	log_test.info("    %d                     %d                         %d                        %d" %(self.transactions,
                  self.total_success, self.total_failure, self.running_time))
 
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of transactions per second: %d", round(self.transactions/self.running_time,0))
-	log.info("----------------------------------------------------------------------------------")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of transactions per second: %d", round(self.transactions/self.running_time,0))
+	log_test.info("----------------------------------------------------------------------------------")
 
     def test_dhcpRelay_concurrent_consecutive_successes_per_second(self, iface = 'veth0'):
 
@@ -1194,13 +1193,13 @@
 	    self.host_load(g_subscriber_port_map[key])
 
 	def thread_fun(i, j):
-#		log.info("Thread Name:%s",current_thread().name)
+#		log_test.info("Thread Name:%s",current_thread().name)
 #		failure_dir[current_thread().name] = True
 	    while failure_dir.has_key(current_thread().name) is False:
 		  mac = RandMAC()._fix()
 		  cip, sip = DHCPTest(iface = 'veth{}'.format(i)).discover(mac = mac)
 		  i += 2
-		  log.info('Got dhcp client IP %s from server %s for mac %s'%(cip, sip, mac))
+		  log_test.info('Got dhcp client IP %s from server %s for mac %s'%(cip, sip, mac))
 		  self.lock.acquire()
 
 		  if cip:
@@ -1256,22 +1255,22 @@
 	    self.total_failure += self.failure_count
 
 
-	    log.info("Statistics for run %d",i)
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of consecutive successful transactions          Running Time ")
-	    log.info("                   %d                                   %d        " %(self.ip_count, self.diff))
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of successful transactions per second in run %d:%f" %(i, self.transaction_count))
-	    log.info("----------------------------------------------------------------------------------")
+	    log_test.info("Statistics for run %d",i)
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of consecutive successful transactions          Running Time ")
+	    log_test.info("                   %d                                   %d        " %(self.ip_count, self.diff))
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of successful transactions per second in run %d:%f" %(i, self.transaction_count))
+	    log_test.info("----------------------------------------------------------------------------------")
 
-	log.info("Final Statistics for total successful transactions")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of consecutive successes         Running Time ")
-	log.info("    %d                                 %d                             %d        " %(self.transactions,
+	log_test.info("Final Statistics for total successful transactions")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of consecutive successes         Running Time ")
+	log_test.info("    %d                                 %d                             %d        " %(self.transactions,
                  self.total_success, self.running_time))
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of consecutive successful transactions per second: %d", round(self.total_success/self.running_time,2))
-	log.info("----------------------------------------------------------------------------------")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of consecutive successful transactions per second: %d", round(self.total_success/self.running_time,2))
+	log_test.info("----------------------------------------------------------------------------------")
 
     def test_dhcpRelay_concurrent_clients_per_second(self, iface = 'veth0'):
 
@@ -1296,7 +1295,7 @@
 	def thread_fun(i):
 #		mac = self.get_mac('veth{}'.format(i))
 	    cip, sip, mac, _ = DHCPTest(iface = 'veth{}'.format(i)).only_discover(mac = RandMAC()._fix())
-	    log.info('Got dhcp client IP %s from server %s for mac %s'%(cip, sip, mac))
+	    log_test.info('Got dhcp client IP %s from server %s for mac %s'%(cip, sip, mac))
 	    self.lock.acquire()
 
 	    if cip:
@@ -1344,25 +1343,25 @@
 	    self.total_success += self.ip_count
 	    self.total_failure += self.failure_count
 
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("Statistics for run %d of sending only DHCP Discover",i)
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of transactions     No. of successes     No. of failures     Running Time ")
-	    log.info("    %d                    %d                     %d                  %d" %(self.ip_count+self.failure_count, 		               self.ip_count, self.failure_count, self.diff))
-	    log.info("----------------------------------------------------------------------------------")
-	    log.info("No. of clients per second in run %d:%f                                      "
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("Statistics for run %d of sending only DHCP Discover",i)
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of transactions     No. of successes     No. of failures     Running Time ")
+	    log_test.info("    %d                    %d                     %d                  %d" %(self.ip_count+self.failure_count, 		               self.ip_count, self.failure_count, self.diff))
+	    log_test.info("----------------------------------------------------------------------------------")
+	    log_test.info("No. of clients per second in run %d:%f                                      "
 		    %(i, self.transaction_count))
-	    log.info("----------------------------------------------------------------------------------")
+	    log_test.info("----------------------------------------------------------------------------------")
 
-	log.info("Final Statistics for total transactions of sending only DHCP Discover")
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
-	log.info("    %d                     %d                         %d                        %d" %(self.transactions,
+	log_test.info("Final Statistics for total transactions of sending only DHCP Discover")
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Total transactions     Total No. of successes     Total No. of failures     Running Time ")
+	log_test.info("    %d                     %d                         %d                        %d" %(self.transactions,
                  self.total_success, self.total_failure, self.running_time))
-	log.info("----------------------------------------------------------------------------------")
-	log.info("Average no. of clients per second: %d                                        ",
+	log_test.info("----------------------------------------------------------------------------------")
+	log_test.info("Average no. of clients per second: %d                                        ",
 		round(self.transactions/self.running_time,0))
-	log.info("----------------------------------------------------------------------------------")
+	log_test.info("----------------------------------------------------------------------------------")
 
 
     def test_dhcpRelay_client_conflict(self, iface = 'veth0'):
@@ -1370,20 +1369,20 @@
         self.host_load(iface)
         self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
 	cip, sip, mac, _ = self.dhcp.only_discover()
-	log.info('Got dhcp client IP %s from server %s for mac %s.' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s.' %
 		  (cip, sip, mac) )
         self.dhcp1 = DHCPTest(seed_ip = cip, iface = iface)
 	new_cip, new_sip, new_mac, _ = self.dhcp1.only_discover(desired = True)
 	new_cip, new_sip = self.dhcp1.only_request(new_cip, new_mac)
-	log.info('Got dhcp client IP %s from server %s for mac %s.' %
+	log_test.info('Got dhcp client IP %s from server %s for mac %s.' %
 		  (new_cip, new_sip, new_mac) )
-	log.info("IP %s alredy consumed by mac %s." % (new_cip, new_mac))
-	log.info("Now sending DHCP Request for old DHCP discover.")
+	log_test.info("IP %s alredy consumed by mac %s." % (new_cip, new_mac))
+	log_test.info("Now sending DHCP Request for old DHCP discover.")
 	new_cip, new_sip = self.dhcp.only_request(cip, mac)
 	if new_cip is None:
-	   log.info('Got dhcp client IP %s from server %s for mac %s.Which is expected behavior.'
+	   log_test.info('Got dhcp client IP %s from server %s for mac %s.Which is expected behavior.'
                     %(new_cip, new_sip, new_mac) )
 	elif new_cip:
-	   log.info('Got dhcp client IP %s from server %s for mac %s.Which is not expected behavior as IP %s is already consumed.'
+	   log_test.info('Got dhcp client IP %s from server %s for mac %s.Which is not expected behavior as IP %s is already consumed.'
 		    %(new_cip, new_sip, new_mac, new_cip) )
 	   assert_equal(new_cip, None)
diff --git a/src/test/fabric/fabricTest.py b/src/test/fabric/fabricTest.py
index ec17e49..9cfe586 100644
--- a/src/test/fabric/fabricTest.py
+++ b/src/test/fabric/fabricTest.py
@@ -1,12 +1,12 @@
-# 
+#
 # Copyright 2016-present Ciena Corporation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 # http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -19,7 +19,7 @@
 from twisted.internet import defer
 from TestManifest import TestManifest
 from Fabric import FabricMAAS, Fabric
-from scapy.all import *
+from CordTestUtils import log_test as log
 import os
 log.setLevel('INFO')
 
diff --git a/src/test/flows/flowsTest.py b/src/test/flows/flowsTest.py
index dc8bf79..d754415 100644
--- a/src/test/flows/flowsTest.py
+++ b/src/test/flows/flowsTest.py
@@ -26,10 +26,11 @@
 from OnosFlowCtrl import OnosFlowCtrl
 from OltConfig import OltConfig
 from CordLogger import CordLogger
+from CordTestUtils import log_test
 import random
 from threading import current_thread
 import collections
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 class flows_exchange(CordLogger):
 
@@ -128,7 +129,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+                log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
                 self.success = True
             sniff(count=2, timeout=5, lfilter = lambda p: p.src == ingress_mac,
                   prn = recv_cb, iface = self.port_map[egress])
@@ -136,7 +137,7 @@
         t = threading.Thread(target = mac_recv_task)
         t.start()
         pkt = Ether(src = ingress_mac, dst = egress_mac)/IP()
-        log.info('Sending a packet to verify if flows are correct')
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -161,7 +162,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: IP in p and p[IP].dst == egress_map['ip'] and p[IP].src == ingress_map['ip'],
@@ -172,7 +173,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
         pkt = L2/L3
-        log.info('Sending a packet to verify if flows are correct')
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -196,7 +197,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
+                log_test.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
                 self.success = True
             sniff(count=2, timeout=5, lfilter = lambda p: TCP in p and p[TCP].dport == egress_map['tcp_port']
 			and p[TCP].sport == ingress_map['tcp_port'], prn = recv_cb, iface = self.port_map[egress])
@@ -207,7 +208,7 @@
         L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
         L4 = TCP(sport = ingress_map['tcp_port'], dport = egress_map['tcp_port'])
         pkt = L2/L3/L4
-        log.info('Sending packets to verify if flows are correct')
+        log_test.info('Sending packets to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -230,7 +231,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
+                log_test.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
                 self.success = True
             sniff(count=2, timeout=5,
              lfilter = lambda p: UDP in p and p[UDP].dport == egress_map['udp_port']
@@ -242,7 +243,7 @@
         L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
         L4 = UDP(sport = ingress_map['udp_port'], dport = egress_map['udp_port'])
         pkt = L2/L3/L4
-        log.info('Sending packets to verify if flows are correct')
+        log_test.info('Sending packets to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -266,8 +267,8 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
-                log.info('Pkt:%s', pkt.show())
+                log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+                log_test.info('Pkt:%s', pkt.show())
                 self.success = True
             sniff(count=2, timeout=5, lfilter = lambda p:p.src == ingress_mac,
                   prn = recv_cb, iface = self.port_map[egress])
@@ -275,8 +276,8 @@
         t = threading.Thread(target = mac_recv_task)
         t.start()
         pkt = Ether(src = ingress_mac, dst = egress_mac)/Dot1Q(vlan = 0x10)/IP()
-	log.info("Sending Packet:%s",pkt.show())
-        log.info('Sending a packet to verify if flows are correct')
+	log_test.info("Sending Packet:%s",pkt.show())
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -301,7 +302,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IPv6].src, pkt[IPv6].dst))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IPv6].src, pkt[IPv6].dst))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: IPv6 in p and p[IPv6].dst == egress_map['ipv6'] and p[IPv6].src == ingress_map['ipv6'],
@@ -312,7 +313,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IPv6(src = ingress_map['ipv6'] , dst = egress_map['ipv6'])
         pkt = L2/L3
-        log.info('Sending a packet to verify if flows are correct')
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -335,7 +336,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s with flow label %s' %(pkt[IPv6].src, pkt[IPv6].dst, pkt[IPv6].fl))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s with flow label %s' %(pkt[IPv6].src, pkt[IPv6].dst, pkt[IPv6].fl))
                 self.success = True
             sniff(count=2, timeout=5, lfilter = lambda p: IPv6 in p and p[IPv6].dst == egress_map['ipv6']
 		and p[IPv6].src == ingress_map['ipv6'] and p[IPv6].fl == 25, prn = recv_cb, iface = self.port_map[egress])
@@ -345,7 +346,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IPv6(src = ingress_map['ipv6'] , dst = egress_map['ipv6'], fl = 25)
         pkt = L2/L3
-        log.info('Sending a packet to verify if flows are correct')
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -368,7 +369,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s, Extension Header Type %s' %(pkt[IPv6].src, pkt[IPv6].dst, pkt[IPv6].nh))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s, Extension Header Type %s' %(pkt[IPv6].src, pkt[IPv6].dst, pkt[IPv6].nh))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: IPv6 in p and p[IPv6].nh == 0, prn = recv_cb, iface = self.port_map[egress])
@@ -378,7 +379,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IPv6(src = ingress_map['ipv6'] , dst = egress_map['ipv6'], nh = 0)
         pkt = L2/L3
-        log.info('Sending packets to verify if flows are correct')
+        log_test.info('Sending packets to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -401,7 +402,7 @@
 	    time.sleep(1)
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s, Extension Header Type %s' %(pkt[IPv6].src, pkt[IPv6].dst, pkt[IPv6].nh))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s, Extension Header Type %s' %(pkt[IPv6].src, pkt[IPv6].dst, pkt[IPv6].nh))
                 self.success = True
             sniff(count=2, timeout=5, lfilter = lambda p: IPv6 in p and p[IPv6].nh == i,
 		    prn = recv_cb, iface = self.port_map[egress])
@@ -413,7 +414,7 @@
 	    L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	    L3 = IPv6(src = ingress_map['ipv6'] , dst = egress_map['ipv6'], nh = i)
 	    pkt = L2/L3
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 	    assert_equal(self.success, True)
@@ -436,7 +437,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: IP in p and p[IP].dst == egress_map['ip'] and p[IP].src == ingress_map['ip']
@@ -447,7 +448,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'], tos = 32)
         pkt = L2/L3
-        log.info('Sending a packet to verify if flows are correct')
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -471,7 +472,7 @@
 
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: IP in p and p[IP].dst == egress_map['ip'] and p[IP].src == ingress_map['ip']
@@ -484,7 +485,7 @@
 	        L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	        L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'], tos = i)
 	        pkt = L2/L3
-	        log.info('Sending a packet to verify if flows are correct')
+	        log_test.info('Sending a packet to verify if flows are correct')
 	        sendp(pkt, count=50, iface = self.port_map[ingress])
 	        t.join()
 	        assert_equal(self.success, True)
@@ -506,7 +507,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: IP in p and p[IP].dst == egress_map['ip'] and p[IP].src == ingress_map['ip']
@@ -518,7 +519,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'], tos = 1)
         pkt = L2/L3
-        log.info('Sending a packet to verify if flows are correct')
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -541,7 +542,7 @@
 	        time.sleep(1)
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: IP in p and p[IP].dst == egress_map['ip'] and p[IP].src == ingress_map['ip']
@@ -555,7 +556,7 @@
 	        L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	        L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'], tos = i)
 	        pkt = L2/L3
-	        log.info('Sending a packet to verify if flows are correct')
+	        log_test.info('Sending a packet to verify if flows are correct')
 	        sendp(pkt, count=50, iface = self.port_map[ingress])
 	        t.join()
 	        assert_equal(self.success, True)
@@ -581,7 +582,7 @@
 
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s and Type of Service %s' %(pkt[IP].src, pkt[IP].dst, pkt[IP].tos))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: IP in p and p[IP].tos == int(bin(i).split('b')[1]+ bin(j).split('b')[1],2)
@@ -596,7 +597,7 @@
 			L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 			L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'], tos = int(bin(i).split('b')[1]+ bin(j).split('b')[1],2))
 			pkt = L2/L3
-			log.info('Sending packets to verify if flows are correct')
+			log_test.info('Sending packets to verify if flows are correct')
 			sendp(pkt, count=50, iface = self.port_map[ingress])
 			t.join()
 			assert_equal(self.success, True)
@@ -620,7 +621,7 @@
 
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ICMP type %s, ICMP code %s' %(pkt[ICMP].type, pkt[ICMP].code))
+                log_test.info('Pkt seen with ICMP type %s, ICMP code %s' %(pkt[ICMP].type, pkt[ICMP].code))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: ICMP in p and p[ICMP].type == 3 and p[ICMP].code == 8,
@@ -631,7 +632,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])/ICMP(type = 3, code = 8)
         pkt = L2/L3
-        log.info('Sending a packet to verify if flows are correct')
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -671,7 +672,7 @@
 
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ICMP type %s, ICMP code %s' %(pkt[ICMP].type, pkt[ICMP].code))
+                log_test.info('Pkt seen with ICMP type %s, ICMP code %s' %(pkt[ICMP].type, pkt[ICMP].code))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: ICMP in p and p[ICMP].type == 3 and p[ICMP].code == 8,
@@ -682,7 +683,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])/ICMP(type = 3, code = 8)
         pkt = L2/L3
-        log.info('Sending a packet to verify if flows are correct')
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -705,7 +706,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6EchoRequest].type, pkt[ICMPv6EchoRequest].code))
+                log_test.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6EchoRequest].type, pkt[ICMPv6EchoRequest].code))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: ICMPv6EchoRequest in p and p[ICMPv6EchoRequest].type == 128 and p[ICMPv6EchoRequest].code == 0,
@@ -716,7 +717,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IPv6(src = ingress_map['ipv6'], dst = egress_map['ipv6'])/ICMPv6EchoRequest()
         pkt = L2/L3
-        log.info('Sending a packet to verify if flows are correct')
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -739,7 +740,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6EchoReply].type, pkt[ICMPv6EchoReply].code))
+                log_test.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6EchoReply].type, pkt[ICMPv6EchoReply].code))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: ICMPv6EchoReply in p and p[ICMPv6EchoReply].type == 129 and p[ICMPv6EchoReply].code == 0,
@@ -750,7 +751,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IPv6(src = ingress_map['ipv6'], dst = egress_map['ipv6'])/ICMPv6EchoReply()
         pkt = L2/L3
-        log.info('Sending packets to verify if flows are correct')
+        log_test.info('Sending packets to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -776,7 +777,7 @@
 	        self.success = False
 	        def mac_recv_task():
 	            def recv_cb(pkt):
-	                log.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6DestUnreach].type, pkt[ICMPv6DestUnreach].code))
+	                log_test.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6DestUnreach].type, pkt[ICMPv6DestUnreach].code))
 	                self.success = True
 	            sniff(count=2, timeout=5,
 	                  lfilter = lambda p: ICMPv6DestUnreach in p and p[ICMPv6DestUnreach].type == 1 and p[ICMPv6DestUnreach].code == i,
@@ -787,7 +788,7 @@
 	        L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	        L3 = IPv6(src = ingress_map['ipv6'], dst = egress_map['ipv6'])/ICMPv6DestUnreach(code = i)
 	        pkt = L2/L3
-	        log.info('Sending packets to verify if flows are correct')
+	        log_test.info('Sending packets to verify if flows are correct')
 	        sendp(pkt, count=50, iface = self.port_map[ingress])
 	        t.join()
 	        assert_equal(self.success, True)
@@ -810,7 +811,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6PacketTooBig].type, pkt[ICMPv6PacketTooBig].code))
+                log_test.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6PacketTooBig].type, pkt[ICMPv6PacketTooBig].code))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: ICMPv6PacketTooBig in p and p[ICMPv6PacketTooBig].type == 2 and p[ICMPv6PacketTooBig].code == 0,
@@ -821,7 +822,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IPv6(src = ingress_map['ipv6'], dst = egress_map['ipv6'])/ICMPv6PacketTooBig()
         pkt = L2/L3
-        log.info('Sending packets to verify if flows are correct')
+        log_test.info('Sending packets to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -846,7 +847,7 @@
 	        self.success = False
 	        def mac_recv_task():
 	            def recv_cb(pkt):
-	                log.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6TimeExceeded].type, pkt[ICMPv6TimeExceeded].code))
+	                log_test.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6TimeExceeded].type, pkt[ICMPv6TimeExceeded].code))
 	                self.success = True
 	            sniff(count=2, timeout=5,
 	                  lfilter = lambda p: ICMPv6TimeExceeded in p and p[ICMPv6TimeExceeded].type == 3 and p[ICMPv6TimeExceeded].code == i,
@@ -857,7 +858,7 @@
 	        L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	        L3 = IPv6(src = ingress_map['ipv6'], dst = egress_map['ipv6'])/ICMPv6TimeExceeded(code = i)
 	        pkt = L2/L3
-	        log.info('Sending packets to verify if flows are correct')
+	        log_test.info('Sending packets to verify if flows are correct')
 	        sendp(pkt, count=50, iface = self.port_map[ingress])
 	        t.join()
 	        assert_equal(self.success, True)
@@ -882,7 +883,7 @@
 	        self.success = False
 	        def mac_recv_task():
 	            def recv_cb(pkt):
-	                log.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6ParamProblem].type, pkt[ICMPv6ParamProblem].code))
+	                log_test.info('Pkt seen with ICMPv6 type %s, ICMPv6 code %s' %(pkt[ICMPv6ParamProblem].type, pkt[ICMPv6ParamProblem].code))
 	                self.success = True
 	            sniff(count=2, timeout=5,
 	                  lfilter = lambda p: ICMPv6ParamProblem in p and p[ICMPv6ParamProblem].type == 4 and p[ICMPv6ParamProblem].code == i,
@@ -893,7 +894,7 @@
 	        L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	        L3 = IPv6(src = ingress_map['ipv6'], dst = egress_map['ipv6'])/ICMPv6ParamProblem(code = i)
 	        pkt = L2/L3
-	        log.info('Sending packets to verify if flows are correct')
+	        log_test.info('Sending packets to verify if flows are correct')
 	        sendp(pkt, count=50, iface = self.port_map[ingress])
 	        t.join()
 	        assert_equal(self.success, True)
@@ -913,7 +914,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ICMPv6 Neighbor Discovery type %s, target address %s' %(pkt[ICMPv6ND_NS].type, pkt[ICMPv6ND_NS].tgt))
+                log_test.info('Pkt seen with ICMPv6 Neighbor Discovery type %s, target address %s' %(pkt[ICMPv6ND_NS].type, pkt[ICMPv6ND_NS].tgt))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: ICMPv6ND_NS in p and p[ICMPv6ND_NS].tgt == '2001:db8:a0b:12f0:1010:1010:1010:1001',
@@ -924,7 +925,7 @@
         L2 = Ether(src = ingress_map['ether'])
         L3 = IPv6(src = ingress_map['ipv6'])/ICMPv6ND_NS(tgt = '2001:db8:a0b:12f0:1010:1010:1010:1001')
         pkt = L2/L3
-        log.info('Sending packets to verify if flows are correct')
+        log_test.info('Sending packets to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -945,7 +946,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ICMPv6 Neighbor Discovery type %s, Source Link Layer address %s' %(pkt[ICMPv6ND_NS].type, pkt[ICMPv6NDOptSrcLLAddr].lladdr))
+                log_test.info('Pkt seen with ICMPv6 Neighbor Discovery type %s, Source Link Layer address %s' %(pkt[ICMPv6ND_NS].type, pkt[ICMPv6NDOptSrcLLAddr].lladdr))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: ICMPv6NDOptSrcLLAddr in p and p[ICMPv6NDOptSrcLLAddr].lladdr == ingress_map['ether'],
@@ -956,7 +957,7 @@
         L2 = Ether(src = ingress_map['ether'])#, dst = ingress_map['ether'])
         L3 = IPv6(src = ingress_map['ipv6'], dst = egress_map['ipv6'])/ICMPv6ND_NS(tgt =  egress_map['ipv6'])/ICMPv6NDOptSrcLLAddr(lladdr = ingress_map['ether'])
         pkt = L2/L3
-        log.info('Sending packets to verify if flows are correct')
+        log_test.info('Sending packets to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -977,7 +978,7 @@
         self.success = False
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ICMPv6 Neighbor Advertisement type %s, Target Link Layer address %s' %(pkt[ICMPv6ND_NA].type, pkt[ICMPv6NDOptDstLLAddr].lladdr))
+                log_test.info('Pkt seen with ICMPv6 Neighbor Advertisement type %s, Target Link Layer address %s' %(pkt[ICMPv6ND_NA].type, pkt[ICMPv6NDOptDstLLAddr].lladdr))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: ICMPv6NDOptDstLLAddr in p and p[ICMPv6NDOptDstLLAddr].lladdr == ingress_map['ether'],
@@ -988,7 +989,7 @@
         L2 = Ether(src = ingress_map['ether'])#, dst = ingress_map['ether'])
         L3 = IPv6(src = ingress_map['ipv6'], dst = egress_map['ipv6'])/ICMPv6ND_NA(tgt =  ingress_map['ipv6'])/ICMPv6NDOptDstLLAddr(lladdr = ingress_map['ether'])
         pkt = L2/L3
-        log.info('Sending packets to verify if flows are correct')
+        log_test.info('Sending packets to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -1016,7 +1017,7 @@
 
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IPv6].src, pkt[IPv6].dst))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IPv6].src, pkt[IPv6].dst))
                 self.success = True
             sniff(count=2, timeout=5,
                   lfilter = lambda p: IPv6 in p and p[IPv6].dst == egress_map['ipv6'] and p[IPv6].src == ingress_map['ipv6']
@@ -1027,7 +1028,7 @@
         L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
         L3 = IPv6(src = ingress_map['ipv6'] , dst = egress_map['ipv6'])/ICMPv6EchoRequest()
         pkt = L2/L3
-        log.info('Sending a packet to verify if flows are correct')
+        log_test.info('Sending a packet to verify if flows are correct')
         sendp(pkt, count=50, iface = self.port_map[ingress])
         t.join()
         assert_equal(self.success, True)
@@ -1051,12 +1052,12 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = False
 
 	def mac_recv_task():
 	    def recv_cb(pkt):
-		log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		self.success = True
 	    sniff(count=2, timeout=5, lfilter = lambda p: p.src == '00:00:00:00:00:02',
 		    prn = recv_cb, iface = self.port_map[egress])
@@ -1064,7 +1065,7 @@
 	t = threading.Thread(target = mac_recv_task)
 	t.start()
 	pkt = Ether(src = '00:00:00:00:00:02', dst = egress_mac)/IP()
-	log.info('Sending packets to verify if flows are correct')
+	log_test.info('Sending packets to verify if flows are correct')
 	sendp(pkt, count=50, iface = self.port_map[ingress])
 	t.join()
         assert_equal(self.success, True)
@@ -1089,14 +1090,14 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
 	self.success = True
 
 	def verify_flow(*r):
 	    random_src = ''.join(r)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		    log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5, lfilter = lambda p: p.src == random_src,
 			prn = recv_cb, iface = self.port_map[egress])
@@ -1104,7 +1105,7 @@
 		t = threading.Thread(target = mac_recv_task)
 		t.start()
 		pkt = Ether(src = random_src, dst = egress_mac)/IP()
-		log.info('Sending packets to verify if flows are correct')
+		log_test.info('Sending packets to verify if flows are correct')
 		sendp(pkt, count=50, iface = self.port_map[ingress])
 		t.join()
 
@@ -1150,14 +1151,14 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
         def verify_flow(*r):
 	    random_src = ''.join(r)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		    log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5, lfilter = lambda p: p.src == random_src,
 			prn = recv_cb, iface = self.port_map[egress])
@@ -1165,7 +1166,7 @@
 	    t = threading.Thread(target = mac_recv_task)
 	    t.start()
 	    pkt = Ether(src = random_src, dst = egress_mac)/IP()
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -1227,14 +1228,14 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
         def verify_flow(*r):
 	    random_src = ''.join(r)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		    log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5, lfilter = lambda p: p.src == random_src,
 			prn = recv_cb, iface = self.port_map[egress])
@@ -1242,7 +1243,7 @@
 	    t = threading.Thread(target = mac_recv_task)
 	    t.start()
 	    pkt = Ether(src = random_src, dst = egress_mac)/IP()
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -1310,14 +1311,14 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
         def verify_flow(*r):
 	    random_src = ''.join(r)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		    log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5, lfilter = lambda p: p.src == random_src,
 			prn = recv_cb, iface = self.port_map[egress])
@@ -1325,7 +1326,7 @@
 	    t = threading.Thread(target = mac_recv_task)
 	    t.start()
 	    pkt = Ether(src = random_src, dst = egress_mac)/IP()
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -1394,14 +1395,14 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
         def verify_flow(*r):
 	    random_src = ''.join(r)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		    log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5, lfilter = lambda p: p.src == random_src,
 			prn = recv_cb, iface = self.port_map[egress])
@@ -1409,7 +1410,7 @@
 	    t = threading.Thread(target = mac_recv_task)
 	    t.start()
 	    pkt = Ether(src = random_src, dst = egress_mac)/IP()
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -1475,12 +1476,12 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = False
 
 	def mac_recv_task():
 	    def recv_cb(pkt):
-		log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		self.success = True
 	    sniff(count=2, timeout=5, lfilter = lambda p: p.src == '00:00:00:00:00:01' and p.dst == '00:00:00:00:01:02',
 		    prn = recv_cb, iface = self.port_map[egress])
@@ -1488,7 +1489,7 @@
 	t = threading.Thread(target = mac_recv_task)
 	t.start()
 	pkt = Ether(src = ingress_mac, dst =  '00:00:00:00:01:02')/IP()
-	log.info('Sending packets to verify if flows are correct')
+	log_test.info('Sending packets to verify if flows are correct')
 	sendp(pkt, count=50, iface = self.port_map[ingress])
 	t.join()
         assert_equal(self.success, True)
@@ -1513,14 +1514,14 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
         def verify_flow(*r):
 	    random_src = ''.join(r)
 
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		    log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5, lfilter = lambda p: p.src == random_src,
 			prn = recv_cb, iface = self.port_map[egress])
@@ -1528,7 +1529,7 @@
 	    t = threading.Thread(target = mac_recv_task)
 	    t.start()
 	    pkt = Ether(src = random_src, dst =  self.to_egress_mac(random_src))/IP()
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -1572,13 +1573,13 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
         def verify_flow(*r):
 	    random_src = ''.join(r)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		    log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5, lfilter = lambda p: p.src == random_src,
 			prn = recv_cb, iface = self.port_map[egress])
@@ -1586,7 +1587,7 @@
 	    t = threading.Thread(target = mac_recv_task)
 	    t.start()
             pkt = Ether(src = random_src, dst =  self.to_egress_mac(random_src))/IP()
-            log.info('Sending packets to verify if flows are correct')
+            log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -1648,13 +1649,13 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
         def verify_flow(*r):
 	    random_src = ''.join(r)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		    log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5, lfilter = lambda p: p.src == random_src,
 			prn = recv_cb, iface = self.port_map[egress])
@@ -1662,7 +1663,7 @@
 	    t = threading.Thread(target = mac_recv_task)
 	    t.start()
 	    pkt = Ether(src = random_src, dst = self.to_egress_mac(random_src))/IP()
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -1730,14 +1731,14 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
         def verify_flow(*r):
 	    random_src = ''.join(r)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		    log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5, lfilter = lambda p: p.src == random_src,
 			prn = recv_cb, iface = self.port_map[egress])
@@ -1745,7 +1746,7 @@
 	    t = threading.Thread(target = mac_recv_task)
 	    t.start()
 	    pkt = Ether(src = random_src, dst = self.to_egress_mac(random_src))/IP()
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -1813,14 +1814,14 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
         def verify_flow(*r):
 	    random_src = ''.join(r)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+		    log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5, lfilter = lambda p: p.src == random_src,
 			prn = recv_cb, iface = self.port_map[egress])
@@ -1828,7 +1829,7 @@
 	    t = threading.Thread(target = mac_recv_task)
 	    t.start()
 	    pkt = Ether(src = random_src, dst = egress_mac)/IP()
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -1901,24 +1902,24 @@
 		flows_added += 1
 	##wait for flows to be added to ONOS
 		time.sleep(1)
-		log.info("%d flow added.",j+1)
+		log_test.info("%d flow added.",j+1)
 	    end_time = time.time()
 	    stats_dir['run '+str(i)] =  round((end_time - start_time),2)
 	for t in stats_dir.items():
-		log.info("----------------------------------------------")
-		log.info("Statics for %s",t[0])
-		log.info("----------------------------------------------")
-		log.info("No. of flows added               Running Time ")
-		log.info("       %d                             %s     " %(100, t[1]))
+		log_test.info("----------------------------------------------")
+		log_test.info("Statics for %s",t[0])
+		log_test.info("----------------------------------------------")
+		log_test.info("No. of flows added               Running Time ")
+		log_test.info("       %d                             %s     " %(100, t[1]))
 		running_time += float(t[1])
 
-	log.info("-------------------------------------------------------------------------------------------------------")
-	log.info("Final Statics")
-	log.info("-------------------------------------------------------------------------------------------------------")
-	log.info("Total No. of flows added               Total Running Time               Average no. of flows per second ")
-	log.info("       %d                                %s second                               %d                     "
+	log_test.info("-------------------------------------------------------------------------------------------------------")
+	log_test.info("Final Statics")
+	log_test.info("-------------------------------------------------------------------------------------------------------")
+	log_test.info("Total No. of flows added               Total Running Time               Average no. of flows per second ")
+	log_test.info("       %d                                %s second                               %d                     "
 		%(flows_added, running_time, round(flows_added/running_time,0)))
-	log.info("-------------------------------------------------------------------------------------------------------")
+	log_test.info("-------------------------------------------------------------------------------------------------------")
 
 
 
@@ -1948,24 +1949,24 @@
 		flows_added += 1
 	##wait for flows to be added to ONOS
 		time.sleep(1)
-		log.info("%d flow added.",j+1)
+		log_test.info("%d flow added.",j+1)
 	    end_time = time.time()
 	    stats_dir['run '+str(i)] =  round((end_time - start_time),2)
 	for t in stats_dir.items():
-	    log.info("----------------------------------------------")
-	    log.info("Statics for %s",t[0])
-	    log.info("----------------------------------------------")
-	    log.info("No. of flows added               Running Time ")
-	    log.info("       %d                             %s     " %(500, t[1]))
+	    log_test.info("----------------------------------------------")
+	    log_test.info("Statics for %s",t[0])
+	    log_test.info("----------------------------------------------")
+	    log_test.info("No. of flows added               Running Time ")
+	    log_test.info("       %d                             %s     " %(500, t[1]))
 	    running_time += float(t[1])
 
-	log.info("-------------------------------------------------------------------------------------------------------")
-	log.info("Final Statics")
-	log.info("-------------------------------------------------------------------------------------------------------")
-	log.info("Total No. of flows added               Total Running Time               Average no. of flows per second ")
-	log.info("       %d                                %s second                               %d                     "
+	log_test.info("-------------------------------------------------------------------------------------------------------")
+	log_test.info("Final Statics")
+	log_test.info("-------------------------------------------------------------------------------------------------------")
+	log_test.info("Total No. of flows added               Total Running Time               Average no. of flows per second ")
+	log_test.info("       %d                                %s second                               %d                     "
 		%(flows_added, running_time, round(flows_added/running_time,0)))
-	log.info("-------------------------------------------------------------------------------------------------------")
+	log_test.info("-------------------------------------------------------------------------------------------------------")
 
     def test_rate_1k_flow_mac(self):
         egress = 1
@@ -1993,24 +1994,24 @@
 		flows_added += 1
 	    ##wait for flows to be added to ONOS
 		time.sleep(1)
-		log.info("%d flow added.",j+1)
+		log_test.info("%d flow added.",j+1)
 	    end_time = time.time()
 	    stats_dir['run '+str(i)] =  round((end_time - start_time),2)
 	for t in stats_dir.items():
-	    log.info("----------------------------------------------")
-	    log.info("Statics for %s",t[0])
-	    log.info("----------------------------------------------")
-	    log.info("No. of flows added               Running Time ")
-	    log.info("       %d                             %s     " %(1000, t[1]))
+	    log_test.info("----------------------------------------------")
+	    log_test.info("Statics for %s",t[0])
+	    log_test.info("----------------------------------------------")
+	    log_test.info("No. of flows added               Running Time ")
+	    log_test.info("       %d                             %s     " %(1000, t[1]))
 	    running_time += float(t[1])
 
-	log.info("-------------------------------------------------------------------------------------------------------")
-	log.info("Final Statics")
-	log.info("-------------------------------------------------------------------------------------------------------")
-	log.info("Total No. of flows added               Total Running Time               Average no. of flows per second ")
-	log.info("       %d                                %s second                               %d                     "
+	log_test.info("-------------------------------------------------------------------------------------------------------")
+	log_test.info("Final Statics")
+	log_test.info("-------------------------------------------------------------------------------------------------------")
+	log_test.info("Total No. of flows added               Total Running Time               Average no. of flows per second ")
+	log_test.info("       %d                                %s second                               %d                     "
 		%(flows_added, running_time, round(flows_added/running_time,0)))
-	log.info("-------------------------------------------------------------------------------------------------------")
+	log_test.info("-------------------------------------------------------------------------------------------------------")
 
 
     def test_500_flow_ip(self):
@@ -2036,7 +2037,7 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
 	def verify_flow(*r):
@@ -2045,7 +2046,7 @@
 
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+		    log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
 		    success_dir[current_thread().name] = True
 
 		sniff(count=2, timeout=5,  lfilter = lambda p: IP in p and p[IP].dst == random_dst and p[IP].src == random_src
@@ -2056,7 +2057,7 @@
 	    L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	    L3 = IP(src = random_src, dst = random_dst)
 	    pkt = L2/L3
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -2106,7 +2107,7 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
 	def verify_flow(*r):
@@ -2115,7 +2116,7 @@
 
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+		    log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
 		    success_dir[current_thread().name] = True
 
 		sniff(count=2, timeout=5,  lfilter = lambda p: IP in p and p[IP].dst == random_dst and p[IP].src == random_src
@@ -2126,7 +2127,7 @@
 	    L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	    L3 = IP(src = random_src, dst = random_dst)
 	    pkt = L2/L3
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -2192,7 +2193,7 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
 	def verify_flow(*r):
@@ -2201,7 +2202,7 @@
 
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+		    log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5,  lfilter = lambda p: IP in p and p[IP].dst == random_dst and p[IP].src == random_src
 		      ,prn = recv_cb, iface = self.port_map[egress])
@@ -2211,7 +2212,7 @@
 	    L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	    L3 = IP(src = random_src, dst = random_dst)
 	    pkt = L2/L3
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -2278,7 +2279,7 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
 	def verify_flow(*r):
@@ -2286,7 +2287,7 @@
 	    random_dst = self.to_egress_ip(random_src)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+		    log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5,  lfilter = lambda p: IP in p and p[IP].dst == random_dst and p[IP].src == random_src
 			,prn = recv_cb, iface = self.port_map[egress])
@@ -2296,7 +2297,7 @@
 	    L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	    L3 = IP(src = random_src, dst = random_dst)
 	    pkt = L2/L3
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -2364,7 +2365,7 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
         self.success = True
 
 	def verify_flow(*r):
@@ -2372,7 +2373,7 @@
 	    random_dst = self.to_egress_ip(random_src)
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+		    log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
 		    success_dir[current_thread().name] = True
 
 		sniff(count=2, timeout=5,  lfilter = lambda p: IP in p and p[IP].dst == random_dst and p[IP].src == random_src
@@ -2383,7 +2384,7 @@
 	    L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
 	    L3 = IP(src = random_src, dst = random_dst)
 	    pkt = L2/L3
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -2449,7 +2450,7 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d Flow added",i+1)
+	    log_test.info("%d Flow added",i+1)
         self.success = True
 
 	def verify_flow(*r):
@@ -2457,7 +2458,7 @@
 	    random_dport = random_sport + 2000
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
+		    log_test.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5,
 		      lfilter = lambda p: TCP in p and p[TCP].dport == random_dport and p[TCP].sport == random_sport                    			  ,prn = recv_cb, iface = self.port_map[egress])
@@ -2468,7 +2469,7 @@
 	    L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
 	    L4 = TCP(sport = random_sport, dport = random_dport)
 	    pkt = L2/L3/L4
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 	t1 = threading.Thread(target = verify_flow, args = str(1101))
@@ -2516,7 +2517,7 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
 
         self.success = True
 
@@ -2526,7 +2527,7 @@
 
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
+		    log_test.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5,
 		      lfilter = lambda p: TCP in p and p[TCP].dport == random_dport and p[TCP].sport == random_sport                    			  ,prn = recv_cb, iface = self.port_map[egress])
@@ -2537,7 +2538,7 @@
 	    L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
 	    L4 = TCP(sport = random_sport, dport = random_dport)
 	    pkt = L2/L3/L4
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -2603,7 +2604,7 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
 
         self.success = True
 
@@ -2613,7 +2614,7 @@
 
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
+		    log_test.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5,
 		      lfilter = lambda p: TCP in p and p[TCP].dport == random_dport
@@ -2625,7 +2626,7 @@
 	    L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
 	    L4 = TCP(sport = random_sport, dport = random_dport)
 	    pkt = L2/L3/L4
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -2690,7 +2691,7 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
 
         self.success = True
 
@@ -2700,7 +2701,7 @@
 
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
+		    log_test.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5,
 		      lfilter = lambda p: UDP in p and p[UDP].dport == random_dport and p[UDP].sport == random_sport                    			  ,prn = recv_cb, iface = self.port_map[egress])
@@ -2711,7 +2712,7 @@
 	    L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
 	    L4 = UDP(sport = random_sport, dport = random_dport)
 	    pkt = L2/L3/L4
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -2761,7 +2762,7 @@
 	    assert_equal(result, True)
 	    ##wait for flows to be added to ONOS
 	    time.sleep(1)
-	    log.info("%d flow added.",i+1)
+	    log_test.info("%d flow added.",i+1)
 
         self.success = True
 
@@ -2771,7 +2772,7 @@
 
 	    def mac_recv_task():
 		def recv_cb(pkt):
-		    log.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
+		    log_test.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
 		    success_dir[current_thread().name] = True
 		sniff(count=2, timeout=5,
 		      lfilter = lambda p: UDP in p and p[UDP].dport == random_dport and p[UDP].sport == random_sport                    			  ,prn = recv_cb, iface = self.port_map[egress])
@@ -2782,7 +2783,7 @@
 	    L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
 	    L4 = UDP(sport = random_sport, dport = random_dport)
 	    pkt = L2/L3/L4
-	    log.info('Sending packets to verify if flows are correct')
+	    log_test.info('Sending packets to verify if flows are correct')
 	    sendp(pkt, count=50, iface = self.port_map[ingress])
 	    t.join()
 
@@ -2847,7 +2848,7 @@
 	        assert_equal(result, True)
 	        ##wait for flows to be added to ONOS
 	        time.sleep(1)
-		log.info("%d flow added.",i+1)
+		log_test.info("%d flow added.",i+1)
 
         self.success = True
 
@@ -2858,7 +2859,7 @@
 	        def mac_recv_task():
 
 	            def recv_cb(pkt):
-	                log.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
+	                log_test.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
 			success_dir[current_thread().name] = True
 	            sniff(count=2, timeout=5,
 	                  lfilter = lambda p: UDP in p and p[UDP].dport == random_dport and p[UDP].sport == random_sport                    			  ,prn = recv_cb, iface = self.port_map[egress])
@@ -2869,7 +2870,7 @@
 	        L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
 	        L4 = UDP(sport = random_sport, dport = random_dport)
 	        pkt = L2/L3/L4
-	        log.info('Sending packets to verify if flows are correct')
+	        log_test.info('Sending packets to verify if flows are correct')
 	        sendp(pkt, count=50, iface = self.port_map[ingress])
 	        t.join()
 
diff --git a/src/test/igmp/igmpTest.py b/src/test/igmp/igmpTest.py
index 84fbbac..8b2cc11 100644
--- a/src/test/igmp/igmpTest.py
+++ b/src/test/igmp/igmpTest.py
@@ -29,8 +29,9 @@
 from Channels import IgmpChannel
 from CordLogger import CordLogger
 from CordTestConfig import setup_module
+from CordTestUtils import log_test
 
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 class IGMPTestState:
 
@@ -102,10 +103,10 @@
         super(igmp_exchange, self).tearDown()
 
     def onos_load_config(self, config):
-	log.info('onos load config is %s'%config)
+	log_test.info('onos load config is %s'%config)
         status, code = OnosCtrl.config(config)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         time.sleep(2)
 
@@ -213,9 +214,9 @@
             rx_stats = recvState.group_map[g][1]
             rx = rx_stats.count
             assert_greater(rx, 0)
-            log.info('Receive stats %s for group %s' %(rx_stats, g))
+            log_test.info('Receive stats %s for group %s' %(rx_stats, g))
 
-        log.info('IGMP test verification success')
+        log_test.info('IGMP test verification success')
 
     def igmp_verify_leave(self, igmpStateList, leave_groups):
         sendState, recvState = igmpStateList[0], igmpStateList[1]
@@ -227,12 +228,12 @@
             rx = rx_stats.count
             assert_greater(tx, 0)
             if g not in leave_groups:
-                log.info('Received %d packets for group %s' %(rx, g))
+                log_test.info('Received %d packets for group %s' %(rx, g))
         for g in leave_groups:
             rx = recvState.group_map[g][1].count
             assert_equal(rx, 0)
 
-        log.info('IGMP test verification success')
+        log_test.info('IGMP test verification success')
 
     def mcast_traffic_timer(self):
           self.mcastTraffic.stopReceives()
@@ -249,9 +250,9 @@
               send_time = float(p.payload.load)
               recv_time = monotonic.monotonic()
         except:
-              log.info('Unexpected Payload received: %s' %p.payload.load)
+              log_test.info('Unexpected Payload received: %s' %p.payload.load)
               return 0
-        #log.info( 'Recv in %.6f secs' %(recv_time - send_time))
+        #log_test.info( 'Recv in %.6f secs' %(recv_time - send_time))
         igmpState.update(p.dst, rx = 1, t = recv_time - send_time)
         return 0
 
@@ -287,19 +288,19 @@
         pkt = ip_pkt/igmp
         IGMPv3.fixup(pkt)
         if rec_queryCount == None:
-            log.info('Sending IGMP join for group %s and waiting for one query packet and printing the packet' %groups)
+            log_test.info('Sending IGMP join for group %s and waiting for one query packet and printing the packet' %groups)
             resp = srp1(pkt, iface=iface)
         else:
-            log.info('Sending IGMP join for group %s and waiting for periodic query packets and printing one packet' %groups)
+            log_test.info('Sending IGMP join for group %s and waiting for periodic query packets and printing one packet' %groups)
             resp = srp1(pkt, iface=iface)
 #       resp = srp1(pkt, iface=iface) if rec_queryCount else srp3(pkt, iface=iface)
         resp[0].summary()
-        log.info('Sent IGMP join for group %s and received a query packet and  printing packet' %groups)
+        log_test.info('Sent IGMP join for group %s and received a query packet and  printing packet' %groups)
         if delay != 0:
             time.sleep(delay)
 
     def send_igmp_leave(self, groups, src_list = ['1.2.3.4'], ip_pkt = None, iface = 'veth0', delay = 2):
-	log.info('entering into igmp leave function')
+	log_test.info('entering into igmp leave function')
         igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
                       gaddr=self.IP_DST)
         for g in groups:
@@ -325,10 +326,10 @@
               ip_pkt = self.igmp_eth/self.igmp_ip
         pkt = ip_pkt/igmp
         IGMPv3.fixup(pkt)
-        log.info('Sending IGMP leave for group %s and waiting for one group specific query packet and printing the packet' %groups)
+        log_test.info('Sending IGMP leave for group %s and waiting for one group specific query packet and printing the packet' %groups)
         resp = srp1(pkt, iface=iface)
         resp[0].summary()
-        log.info('Sent IGMP leave for group %s and received a group specific query packet and printing packet' %groups)
+        log_test.info('Sent IGMP leave for group %s and received a group specific query packet and printing packet' %groups)
         if delay != 0:
             time.sleep(delay)
 
@@ -381,7 +382,7 @@
 	self.send_igmp_leave(leave_groups, delay = 3)
 	join_state = IGMPTestState(groups = leave_groups)
 	status = self.igmp_not_recv_task(self.V_INF1,leave_groups, join_state)
-	log.info('verified status for igmp recv task %s'%status)
+	log_test.info('verified status for igmp recv task %s'%status)
 	assert status == 1 , 'EXPECTED RESULT'
 	self.df.callback(0)
         return df
@@ -434,7 +435,7 @@
           pkt = self.igmp_eth/self.igmp_ip/igmp
           IGMPv3.fixup(pkt)
           sendp(pkt, iface=intf)
-          log.debug('Returning from join task')
+          log_test.debug('Returning from join task')
 
     def igmp_recv_task(self, intf, groups, join_state):
           recv_socket = L3PacketSocket(iface = intf, type = ETH_P_IP)
@@ -442,7 +443,7 @@
           for g in groups:
                 group_map[g] = [0,0]
 
-          log.info('Verifying join interface should receive multicast data')
+          log_test.info('Verifying join interface should receive multicast data')
           while True:
                 p = recv_socket.recv()
                 if p.dst in groups and group_map[p.dst][0] == 0:
@@ -457,23 +458,23 @@
                 join_start = join_state.group_map[g][0].start
                 recv_time = group_map[g][1] * 1000000
                 delta = (recv_time - join_start)
-                log.info('Join for group %s received in %.3f usecs' %
+                log_test.info('Join for group %s received in %.3f usecs' %
                          (g, delta))
 
           recv_socket.close()
-          log.debug('Returning from recv task')
+          log_test.debug('Returning from recv task')
 
     def igmp_not_recv_task(self, intf, groups, join_state):
-	  log.info('Entering igmp not recv task loop')
+	  log_test.info('Entering igmp not recv task loop')
           recv_socket = L2Socket(iface = intf, type = ETH_P_IP)
           group_map = {}
           for g in groups:
                 group_map[g] = [0,0]
 
-          log.info('Verifying join interface, should not receive any multicast data')
+          log_test.info('Verifying join interface, should not receive any multicast data')
           self.NEGATIVE_TRAFFIC_STATUS = 1
           def igmp_recv_cb(pkt):
-                log.info('Multicast packet %s received for left groups %s' %(pkt[IP].dst, groups))
+                log_test.info('Multicast packet %s received for left groups %s' %(pkt[IP].dst, groups))
                 self.NEGATIVE_TRAFFIC_STATUS = 2
           sniff(prn = igmp_recv_cb, count = 1, lfilter = lambda p: IP in p and p[IP].dst in groups,
                 timeout = 3, opened_socket = recv_socket)
@@ -548,7 +549,7 @@
           self.complete = False
           def igmp_join_timer():
                 self.timeout += self.ROVER_JOIN_TIMEOUT
-                log.info('IGMP joins sent: %d' %self.count)
+                log_test.info('IGMP joins sent: %d' %self.count)
                 if self.timeout >= self.ROVER_TIMEOUT:
                       self.complete = True
                 reactor.callLater(self.ROVER_JOIN_TIMEOUT, igmp_join_timer)
@@ -568,7 +569,7 @@
                       self.send_igmp_join([ip], delay = 0, ssm_load = False, iface = iface)
                       self.count += 1
                 if self.complete == True:
-                      log.info('%d IGMP joins sent in %d seconds over %s' %(self.count, self.timeout, iface))
+                      log_test.info('%d IGMP joins sent in %d seconds over %s' %(self.count, self.timeout, iface))
                       self.df.callback(0)
                 else:
                       reactor.callLater(0, igmp_join_rover, self)
@@ -585,8 +586,8 @@
 
         def igmp_query_timeout():
               def igmp_query_cb(pkt):
-		    log.info('received igmp query packet is %s'%pkt.show())
-                    log.info('Got IGMP query packet from %s for %s' %(pkt[IP].src, pkt[IP].dst))
+		    log_test.info('received igmp query packet is %s'%pkt.show())
+                    log_test.info('Got IGMP query packet from %s for %s' %(pkt[IP].src, pkt[IP].dst))
                     assert_equal(pkt[IP].dst, '224.0.0.1')
               sniff(prn = igmp_query_cb, count=1, lfilter = lambda p: IP in p and p[IP].dst in groups,
                     opened_socket = self.recv_socket)
@@ -604,13 +605,13 @@
         sourcelist2 = sources[1]
         eth = Ether(dst = self.IGMP_DST_MAC,type = ETH_P_IP)
         ip = IP(dst = self.IP_DST)
-        log.info('Sending join message for the group %s' %g1)
+        log_test.info('Sending join message for the group %s' %g1)
         self.send_igmp_join((g1,), src_list = sourcelist1, ip_pkt = eth/ip, iface = intf, delay = 2)
         eth = Ether(dst = self.MMACGROUP2, src = self.IGMP_SRC_MAC, type = ETH_P_IP)
         ip = IP(dst = g2)
-        log.info('Sending join message for group %s' %g2)
+        log_test.info('Sending join message for group %s' %g2)
         self.send_igmp_join((g2,), src_list = sourcelist2, ip_pkt = eth/ip, iface = intf, delay = 2)
-        log.info('Done with igmp_send_joins_different_groups_srclist')
+        log_test.info('Done with igmp_send_joins_different_groups_srclist')
 
     def igmp_send_joins_different_groups_srclist_wait_query_packets(self, groups, sources, intf = V_INF1, delay = 2, ip_src = None, query_group1 = None, query_group2 = None):
         g1 = groups[0]
@@ -621,18 +622,18 @@
         src_ip = ip_src or self.IP_SRC
         ip = IP(dst = g1, src = src_ip)
         if query_group1 is 'group1':
-            log.info('Sending join message for the group %s and waiting for a query packet on join interface' %g1)
+            log_test.info('Sending join message for the group %s and waiting for a query packet on join interface' %g1)
             self.send_igmp_join_recvQuery((g1,), None, src_list = sourcelist1, ip_pkt = eth/ip, iface = intf, delay = 2)
         else:
-            log.info('Sending join message for the group %s' %g1)
+            log_test.info('Sending join message for the group %s' %g1)
             self.send_igmp_join((g1,), src_list = sourcelist1, ip_pkt = eth/ip, iface = intf, delay = 2)
         eth = Ether(dst = self.MMACGROUP2, src = self.IGMP_SRC_MAC, type = ETH_P_IP)
         ip = IP(dst = g2, src = src_ip)
         if query_group2 is 'group2':
-            log.info('Sending join message for the group %s and waiting for a query packet on join interface' %g2)
+            log_test.info('Sending join message for the group %s and waiting for a query packet on join interface' %g2)
             self.send_igmp_join_recvQuery((g2,), None, src_list = sourcelist2, ip_pkt = eth/ip, iface = intf, delay = 2)
         else:
-            log.info('Sending join message for group %s' %g2)
+            log_test.info('Sending join message for group %s' %g2)
             self.send_igmp_join((g2,), src_list = sourcelist2, ip_pkt = eth/ip, iface = intf, delay = 2)
 
     def igmp_joins_leave(self,groups,src_list,again_join = False, df = None):
@@ -665,10 +666,10 @@
         join_state1 = IGMPTestState(groups = groups1)
         join_state2 = IGMPTestState(groups = groups2)
         self.igmp_recv_task(self.V_INF1, groups1, join_state1)
-        log.info('Interface is receiving multicast groups %s' %groups1)
+        log_test.info('Interface is receiving multicast groups %s' %groups1)
         self.igmp_recv_task(self.V_INF1, groups2, join_state2)
-        log.info('Interface is receiving multicast groups %s' %groups2)
-        log.info('Interface is sending leave message for groups %s now' %groups2)
+        log_test.info('Interface is receiving multicast groups %s' %groups2)
+        log_test.info('Interface is sending leave message for groups %s now' %groups2)
         self.send_igmp_leave(groups = groups2, src_list = src2, iface = self.V_INF1, delay = 2)
         self.igmp_recv_task(self.V_INF1, groups1, join_state1)
         target4 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state2)
@@ -678,14 +679,14 @@
             ip_dst = '239.2.2.3'
             eth = Ether(dst = dst_mac,  type = ETH_P_IP)
             ip = IP(dst = ip_dst)
-            log.info('Interface sending join message again for the groups %s' %groups2)
+            log_test.info('Interface sending join message again for the groups %s' %groups2)
             self.send_igmp_join(groups2, src_list = [src_ip], ip_pkt = eth/ip, iface = self.V_INF1, delay = 2)
             self.igmp_recv_task(self.V_INF1, groups2, join_state2)
-            log.info('Interface is receiving multicast groups %s again' %groups2)
+            log_test.info('Interface is receiving multicast groups %s again' %groups2)
             self.igmp_recv_task(self.V_INF1, groups1, join_state1)
-            log.info('Interface is still receiving from multicast groups %s' %groups1)
+            log_test.info('Interface is still receiving from multicast groups %s' %groups1)
         else:
-            log.info('Ended test case')
+            log_test.info('Ended test case')
         mcastTraffic1.stop()
         mcastTraffic2.stop()
 
@@ -731,10 +732,10 @@
                                      src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
         mcastTraffic1.start()
         join_state1 = IGMPTestState(groups = groups1)
-        log.info('Interface should not receive from multicast groups %s from an interface, which is expected' %groups1)
+        log_test.info('Interface should not receive from multicast groups %s from an interface, which is expected' %groups1)
         target1 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 2, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s, working as expected' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s, working as expected' %groups1)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
@@ -767,7 +768,7 @@
         self.send_igmp_leave(groups = groups1, src_list = ['2.2.2.2'], iface = self.V_INF1, delay =2)
         target2 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target2 == 2, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s after sending CHANGE_TO_EXCLUDE' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s after sending CHANGE_TO_EXCLUDE' %groups1)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+10)
@@ -834,7 +835,7 @@
 	mcastTraffic2.start()
         target1 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
 	assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is still receiving traffic from old multicast group %s even after we send block for source list' %groups1)
+        log_test.info('Interface is still receiving traffic from old multicast group %s even after we send block for source list' %groups1)
         mcastTraffic2.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+30)
@@ -863,7 +864,7 @@
         join_state1 = IGMPTestState(groups = groups1)
         target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
 	mcastTraffic1.stop()
         self.send_igmp_join(groups = groups1, src_list = src_list,record_type = IGMP_V3_GR_TYPE_INCLUDE,
                                          iface = self.V_INF1)
@@ -902,13 +903,13 @@
         join_state1 = IGMPTestState(groups = groups1)
         target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         self.igmp_send_joins_different_groups_srclist(groups1 + groups2,
                                                       (['6.6.6.6', '7.7.7.7', '8.8.8.8'], ['6.6.6.6', '5.5.5.5']),
                                                       intf = self.V_INF1, delay = 2)
         target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+10)
@@ -939,12 +940,12 @@
         join_state1 = IGMPTestState(groups = groups1)
         target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         self.send_igmp_leave(groups = groups1, src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4', '5.5.5.5', '7.7.7.7'],
                              iface = self.V_INF1, delay = 2)
         target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+10)
@@ -976,12 +977,12 @@
         join_state1 = IGMPTestState(groups = groups1)
         target1 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         self.igmp_send_joins_different_groups_srclist(groups1 + groups2,
                                                       (['2.2.2.2', '6.6.6.6', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
                                                       intf = self.V_INF1, delay = 2)
         self.igmp_recv_task(self.V_INF1, groups1, join_state1)
-        log.info('Interface is receiving traffic from multicast groups %s after sending join with new source list' %groups1)
+        log_test.info('Interface is receiving traffic from multicast groups %s after sending join with new source list' %groups1)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+10)
@@ -1012,13 +1013,13 @@
         mcastTraffic1.start()
         join_state1 = IGMPTestState(groups = groups2)
         self.igmp_recv_task(self.V_INF1, groups2, join_state1)
-        log.info('Interface is receiving traffic from multicast groups %s' %groups2)
+        log_test.info('Interface is receiving traffic from multicast groups %s' %groups2)
         self.igmp_send_joins_different_groups_srclist(groups,
                                                       (['6.6.6.6', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '7.7.7.7']),
                                                       intf = self.V_INF1, delay = 2)
         target2 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
         assert target2 == 2, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s after sending join with block old source list' %groups2)
+        log_test.info('Interface is not receiving traffic from multicast groups %s after sending join with block old source list' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
@@ -1049,7 +1050,7 @@
         join_state1 = IGMPTestState(groups = groups2)
         target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
         assert target1==1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s when we sent join with source list is empty' %groups2)
+        log_test.info('Interface is not receiving traffic from multicast groups %s when we sent join with source list is empty' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
@@ -1076,7 +1077,7 @@
         mcastTraffic1.start()
         join_state1 = IGMPTestState(groups = groups2)
         self.igmp_recv_task(self.V_INF1, groups2, join_state1)
-        log.info('Interface is receiving multicast groups %s' %groups2)
+        log_test.info('Interface is receiving multicast groups %s' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
@@ -1108,7 +1109,7 @@
         mcastTraffic1.start()
         join_state1 = IGMPTestState(groups = groups2)
         self.igmp_recv_task(self.V_INF1, groups2, join_state1)
-        log.info('Interface is receiving traffic from multicast groups %s when we sent join with source IP  is 0.0.0.0' %groups2)
+        log_test.info('Interface is receiving traffic from multicast groups %s when we sent join with source IP  is 0.0.0.0' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
@@ -1141,7 +1142,7 @@
         join_state1 = IGMPTestState(groups = groups2)
         target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
         assert target1==1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s when we sent invalid join packet ' %groups2)
+        log_test.info('Interface is not receiving traffic from multicast groups %s when we sent invalid join packet ' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
@@ -1173,16 +1174,16 @@
         mcastTraffic1.start()
         join_state1 = IGMPTestState(groups = groups2)
         self.igmp_recv_task(self.V_INF1, groups2, join_state1)
-        log.info('Interface is receiving traffic from multicast groups,  before bring down the self.V_INF1=%s  ' %self.V_INF1)
+        log_test.info('Interface is receiving traffic from multicast groups,  before bring down the self.V_INF1=%s  ' %self.V_INF1)
         os.system('ifconfig '+self.V_INF1+' down')
-        log.info(' the self.V_INF1 %s is down now  ' %self.V_INF1)
+        log_test.info(' the self.V_INF1 %s is down now  ' %self.V_INF1)
         os.system('ifconfig '+self.V_INF1)
         time.sleep(10)
         os.system('ifconfig '+self.V_INF1+' up')
         os.system('ifconfig '+self.V_INF1)
-        log.info(' the self.V_INF1 %s is up now  ' %self.V_INF1)
+        log_test.info(' the self.V_INF1 %s is up now  ' %self.V_INF1)
         self.igmp_recv_task(self.V_INF1, groups2, join_state1)
-        log.info('Interface is receiving traffic from multicast groups %s when we nterface up after down  ' %groups2)
+        log_test.info('Interface is receiving traffic from multicast groups %s when we nterface up after down  ' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
@@ -1271,7 +1272,7 @@
         join_state1 = IGMPTestState(groups = groups2)
         target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
         assert target1==1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s when we sent invalid join packet ' %groups2)
+        log_test.info('Interface is not receiving traffic from multicast groups %s when we sent invalid join packet ' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
@@ -1304,7 +1305,7 @@
         join_state1 = IGMPTestState(groups = groups2)
         target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
         assert target1==1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s when we sent invalid join packet ' %groups2)
+        log_test.info('Interface is not receiving traffic from multicast groups %s when we sent invalid join packet ' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
@@ -1335,26 +1336,26 @@
                                      src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
         mcastTraffic1.start()
         join_state1 = IGMPTestState(groups = groups2)
-        log.info('Started delay to verify multicast data taraffic for group %s is received or not for 180 sec ' %groups2)
+        log_test.info('Started delay to verify multicast data taraffic for group %s is received or not for 180 sec ' %groups2)
         time.sleep(100)
         self.igmp_recv_task(self.V_INF1, groups2, join_state1)
-        log.info('Verified that  multicast data for group %s is received after 100 sec ' %groups2)
+        log_test.info('Verified that  multicast data for group %s is received after 100 sec ' %groups2)
         time.sleep(50)
         self.igmp_recv_task(self.V_INF1, groups2, join_state1)
-        log.info('Verified that  multicast data for group %s is received after 150 sec ' %groups2)
+        log_test.info('Verified that  multicast data for group %s is received after 150 sec ' %groups2)
         time.sleep(30)
         self.igmp_recv_task(self.V_INF1, groups2, join_state1)
-        log.info('Verified that  multicast data for group %s is received after 180 sec ' %groups2)
+        log_test.info('Verified that  multicast data for group %s is received after 180 sec ' %groups2)
         time.sleep(10)
         self.igmp_recv_task(self.V_INF1, groups2, join_state1)
-        log.info('Verified that  multicast data for group %s is received after 190 sec ' %groups2)
+        log_test.info('Verified that  multicast data for group %s is received after 190 sec ' %groups2)
         target3 = mcastTraffic1.isRecvStopped()
         assert target3==False, 'EXPECTED FAILURE'
-        log.info('Verified that multicast data for a group %s is still transmitting from a data interface' %groups2)
-        log.info('Now checking join interface is receiving a multicast data for group %s after 190 sec' %groups2)
+        log_test.info('Verified that multicast data for a group %s is still transmitting from a data interface' %groups2)
+        log_test.info('Now checking join interface is receiving a multicast data for group %s after 190 sec' %groups2)
         target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
         assert target1==1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving multicast data for group %s' %groups2)
+        log_test.info('Interface is not receiving multicast data for group %s' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+250)
@@ -1391,9 +1392,9 @@
                 self.igmp_verify_leave(stateList, leave_groups)
                 self.df.callback(0)
 
-        log.info('Sending join packet and expect to receive on general query packet after 60 sec for multicast %s ' %groups)
+        log_test.info('Sending join packet and expect to receive on general query packet after 60 sec for multicast %s ' %groups)
         self.send_igmp_join_recvQuery(groups)
-        log.info('Received a general query packet for multicast %s group on joing interface and sending traffic' %groups)
+        log_test.info('Received a general query packet for multicast %s group on joing interface and sending traffic' %groups)
         mcastTraffic.start()
         self.test_timer = reactor.callLater(self.MCAST_TRAFFIC_TIMEOUT, self.mcast_traffic_timer)
         reactor.callLater(0, igmp_srp_task, igmpStateList)
@@ -1451,7 +1452,7 @@
                 self.df.callback(0)
 
         self.send_igmp_join_recvQuery(groups,3)
-        log.info('Received periodic general query packets for multicast %s, now checking entry is deleted from tabel by sending traffic for that group' %groups)
+        log_test.info('Received periodic general query packets for multicast %s, now checking entry is deleted from tabel by sending traffic for that group' %groups)
         mcastTraffic.start()
         self.test_timer = reactor.callLater(self.MCAST_TRAFFIC_TIMEOUT, self.mcast_traffic_timer)
         reactor.callLater(0, igmp_srp_task, igmpStateList)
@@ -1483,7 +1484,7 @@
                 self.df.callback(0)
 
         self.send_igmp_join_recvQuery(groups,3)
-        log.info('Received periodic general query packets for multicast %s, now sending join packet again and verifying traffic for that group is received or not on joining interface' %groups)
+        log_test.info('Received periodic general query packets for multicast %s, now sending join packet again and verifying traffic for that group is received or not on joining interface' %groups)
         self.send_igmp_join(groups)
         mcastTraffic.start()
         self.test_timer = reactor.callLater(self.MCAST_TRAFFIC_TIMEOUT, self.mcast_traffic_timer)
@@ -1538,7 +1539,7 @@
         time.sleep(10)
         target2 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target2 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s after sending CHANGE_TO_EXCLUDE' %groups2)
+        log_test.info('Interface is not receiving traffic from multicast groups %s after sending CHANGE_TO_EXCLUDE' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+60)
@@ -1567,13 +1568,13 @@
         join_state1 = IGMPTestState(groups = groups1)
         target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         self.igmp_send_joins_different_groups_srclist_wait_query_packets(groups1 + groups2,
                                                    (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['6.6.6.6', '5.5.5.5']),
                                                     intf = self.V_INF1, delay = 2,query_group1 = 'group1', query_group2 = None)
         time.sleep(10)
         self.igmp_recv_task(self.V_INF1, groups1, join_state1)
-        log.info('Interface is receiving traffic from multicast groups %s after send Change to include message' %groups1)
+        log_test.info('Interface is receiving traffic from multicast groups %s after send Change to include message' %groups1)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+80)
@@ -1602,11 +1603,11 @@
         mcastTraffic1.start()
         join_state1 = IGMPTestState(groups = groups1)
         self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         self.igmp_send_joins_different_groups_srclist_wait_query_packets(groups1 + groups2,                                                                              (['2.2.2.2', '6.6.6.6', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
                                               intf = self.V_INF1, delay = 2, query_group1 = 'group1', query_group2 = None)
         self.igmp_recv_task(self.V_INF1, groups1, join_state1)
-        log.info('Interface is receiving traffic from multicast groups %s after sending join with new source list' %groups1)
+        log_test.info('Interface is receiving traffic from multicast groups %s after sending join with new source list' %groups1)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+80)
@@ -1636,13 +1637,13 @@
         mcastTraffic1.start()
         join_state1 = IGMPTestState(groups = groups2)
         self.igmp_recv_task(self.V_INF1, groups2, join_state1)
-        log.info('Interface is receiving traffic from multicast groups %s' %groups2)
+        log_test.info('Interface is receiving traffic from multicast groups %s' %groups2)
         self.igmp_send_joins_different_groups_srclist_wait_query_packets(groups,
                                                 (['6.6.6.6', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '7.7.7.7']),
                                                 intf = self.V_INF1, delay = 2, query_group1 = 'group1', query_group2 = None)
         target2 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
         assert target2 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s after sending join with block old source list' %groups2)
+        log_test.info('Interface is not receiving traffic from multicast groups %s after sending join with block old source list' %groups2)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+90)
@@ -1733,12 +1734,12 @@
         join_state1 = IGMPTestState(groups = groups1)
         target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         self.igmp_send_joins_different_groups_srclist_wait_query_packets(groups1 + groups2,
                                              (['6.6.6.6', '7.7.7.7', '8.8.8.8'], ['6.6.6.6', '5.5.5.5']),                                                                 intf = self.V_INF1, delay = 2, query_group1 = 'group1', query_group2 = None)
         target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+90)
@@ -1767,13 +1768,13 @@
         join_state1 = IGMPTestState(groups = groups1)
         target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         self.send_igmp_leave_listening_group_specific_query(groups = groups1,
                                           src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4', '5.5.5.5', '7.7.7.7'],
                                           iface = self.V_INF1, delay = 2)
         target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
         assert target1 == 1, 'EXPECTED FAILURE'
-        log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
+        log_test.info('Interface is not receiving traffic from multicast groups %s' %groups1)
         mcastTraffic1.stop()
 
     @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+40)
@@ -1802,12 +1803,12 @@
         sendp(eth/ip/data,count=20, iface = intf)
 
     def verify_igmp_data_traffic(self, group, intf='veth0', source='1.2.3.4' ):
-        log.info('verifying multicast traffic for group %s from source %s'%(group,source))
+        log_test.info('verifying multicast traffic for group %s from source %s'%(group,source))
         self.success = False
         def recv_task():
             def igmp_recv_cb(pkt):
-                #log.info('received multicast data packet is %s'%pkt.show())
-                log.info('multicast data received for group %s from source %s'%(group,source))
+                #log_test.info('received multicast data packet is %s'%pkt.show())
+                log_test.info('multicast data received for group %s from source %s'%(group,source))
                 self.success = True
             sniff(prn = igmp_recv_cb,lfilter = lambda p: IP in p and p[IP].dst == group and p[IP].src == source, count=1,timeout = 2, iface='veth0')
         t = threading.Thread(target = recv_task)
@@ -1940,7 +1941,7 @@
 	    if group in groups:
 		pass
 	    else:
-		log.info('group and source are %s and %s'%(group,source))
+		log_test.info('group and source are %s and %s'%(group,source))
 		groups.append(group)
                 sources.append(source)
 		count += 1
@@ -1950,7 +1951,7 @@
                                          iface = self.V_INF1)
             status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
             assert_equal(status, True)
-	    log.info('data received for group %s from source %s'%(groups[i],sources[i]))
+	    log_test.info('data received for group %s from source %s'%(groups[i],sources[i]))
 
     def test_igmp_multiple_joins_with_data_verification_and_leaving_100_groups(self):
         groups = []
@@ -1964,7 +1965,7 @@
             if group in groups:
                 pass
             else:
-                log.info('group and source are %s and %s'%(group,source))
+                log_test.info('group and source are %s and %s'%(group,source))
                 groups.append(group)
                 sources.append(source)
                 count += 1
@@ -1974,12 +1975,12 @@
                                          iface = self.V_INF1)
             status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
             assert_equal(status, True)
-            log.info('data received for group %s from source %s'%(groups[i],sources[i]))
+            log_test.info('data received for group %s from source %s'%(groups[i],sources[i]))
 	    self.send_igmp_join(groups = [groups[i]], src_list = [sources[i]],record_type = IGMP_V3_GR_TYPE_CHANGE_TO_EXCLUDE,
                                          iface = self.V_INF1, delay = 1)
 	    status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
             assert_equal(status, False)
-            log.info("data not received for group %s from source %s after changing group mode to 'TO-EXCLUDE' mode"%(groups[i],sources[i]))
+            log_test.info("data not received for group %s from source %s after changing group mode to 'TO-EXCLUDE' mode"%(groups[i],sources[i]))
 
     def test_igmp_group_source_for_only_config_with_1000_entries(self):
         groups = []
@@ -1993,7 +1994,7 @@
             if group in groups:
                 pass
             else:
-                log.info('group and source are %s and %s'%(group,source))
+                log_test.info('group and source are %s and %s'%(group,source))
                 groups.append(group)
                 sources.append(source)
                 count += 1
@@ -2011,7 +2012,7 @@
             if group in groups:
                 pass
             else:
-                log.info('group and source are %s and %s'%(group,source))
+                log_test.info('group and source are %s and %s'%(group,source))
                 groups.append(group)
                 sources.append(source)
                 count += 1
@@ -2021,12 +2022,12 @@
                                          iface = self.V_INF1)
             status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
             assert_equal(status, False)
-	    log.info('data not received for group %s from source %s as expected'%(groups[i],sources[i]))
+	    log_test.info('data not received for group %s from source %s as expected'%(groups[i],sources[i]))
 	    self.send_igmp_join(groups = [groups[i]], src_list = [sources[i]],record_type = IGMP_V3_GR_TYPE_INCLUDE,
                                          iface = self.V_INF1)
 	    status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
 	    assert_equal(status, True)
-            log.info("data received for group %s from source %s after changing group mode to 'TO-INCLUDE' mode"%(groups[i],sources[i]))
+            log_test.info("data received for group %s from source %s after changing group mode to 'TO-INCLUDE' mode"%(groups[i],sources[i]))
 
     def test_igmp_with_multiple_joins_and_data_verify_with_1000_groups(self):
         groups = []
@@ -2040,7 +2041,7 @@
             if group in groups:
                 pass
             else:
-                log.info('group and source are %s and %s'%(group,source))
+                log_test.info('group and source are %s and %s'%(group,source))
                 groups.append(group)
                 sources.append(source)
                 count += 1
@@ -2050,7 +2051,7 @@
                                          iface = self.V_INF1)
             status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
             assert_equal(status, True)
-            log.info('data received for group %s from source %s - %d'%(groups[i],sources[i],i))
+            log_test.info('data received for group %s from source %s - %d'%(groups[i],sources[i],i))
 
     def test_igmp_with_multiple_joins_and_data_verify_with_5000_groups(self):
         groups = []
@@ -2064,7 +2065,7 @@
             if group in groups:
                 pass
             else:
-                log.info('group and source are %s and %s'%(group,source))
+                log_test.info('group and source are %s and %s'%(group,source))
                 groups.append(group)
                 sources.append(source)
                 count += 1
@@ -2074,7 +2075,7 @@
                                          iface = self.V_INF1)
             status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
             assert_equal(status, True)
-            log.info('data received for group %s from source %s - %d'%(groups[i],sources[i],i))
+            log_test.info('data received for group %s from source %s - %d'%(groups[i],sources[i],i))
 
     """def test_igmp_join_from_multiple_infts(self):
         groups = ['229.9.3.6','234.20.56.2']
@@ -2114,15 +2115,15 @@
                              iface = self.V_INF1)
         status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source=src[0])
         assert_equal(status,True) # expecting igmp data traffic from source src_list[0]
-	log.info('Multicast traffic received for group %s from source %s before the app is deactivated'%(group[0],src[0]))
+	log_test.info('Multicast traffic received for group %s from source %s before the app is deactivated'%(group[0],src[0]))
 	self.onos_ctrl.deactivate()
 	status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source=src[0])
         assert_equal(status,False) #not expecting igmp data traffic from source src_list[0]
-	log.info('Multicast traffic not received for group %s from source %s after the app is deactivated'%(group[0],src[0]))
+	log_test.info('Multicast traffic not received for group %s from source %s after the app is deactivated'%(group[0],src[0]))
 	self.onos_ctrl.activate()
         status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source=src[0])
         assert_equal(status,True) # expecting igmp data traffic from source src_list[0]
-	log.info('Multicast traffic received for group %s from source %s the app is re-activated'%(group[0],src[0]))
+	log_test.info('Multicast traffic received for group %s from source %s the app is re-activated'%(group[0],src[0]))
 
     def test_igmp_with_mismatch_for_dst_ip_and_mac_in_data_packets(self):
         group = ['228.18.19.29']
@@ -2135,12 +2136,12 @@
         ip = IP(dst=group[0],src=source[0])
         data = repr(monotonic.monotonic())
         pkt = (eth/ip/data)
-        log.info('Multicast traffic packet %s'%pkt.show())
+        log_test.info('Multicast traffic packet %s'%pkt.show())
 	self.success = False
         def recv_task():
             def igmp_recv_cb(pkt):
-                #log.info('received multicast data packet is %s'%pkt.show())
-                log.info('multicast data received for group %s from source %s'%(group[0],source[0]))
+                #log_test.info('received multicast data packet is %s'%pkt.show())
+                log_test.info('multicast data received for group %s from source %s'%(group[0],source[0]))
                 self.success = True
             sniff(prn = igmp_recv_cb,lfilter = lambda p: IP in p and p[IP].dst == group[0] and p[IP].src == source[0], count=1,timeout = 2, iface='veth0')
         t = threading.Thread(target = recv_task)
@@ -2161,7 +2162,7 @@
                 d['source'] = s or '0.0.0.0'
                 d['group'] = g
                 ssm_xlate_list.append(d)
-	    log.info('onos load config is %s'%ssm_dict)
+	    log_test.info('onos load config is %s'%ssm_dict)
             status, code = OnosCtrl.config(ssm_dict)
         self.send_igmp_join(groups, src_list = source, record_type = IGMP_V3_GR_TYPE_INCLUDE,
                              iface = self.V_INF1, delay = 1)
@@ -2179,6 +2180,6 @@
                 d['source'] = s or '0.0.0.0'
                 d['group'] = g
                 ssm_xlate_list.append(d)
-            log.info('onos load config is %s'%ssm_dict)
+            log_test.info('onos load config is %s'%ssm_dict)
             status, code = OnosCtrl.config(ssm_dict)
             assert_equal(status,False)
diff --git a/src/test/iperf/iperfTest.py b/src/test/iperf/iperfTest.py
index a90f048..d6bc737 100644
--- a/src/test/iperf/iperfTest.py
+++ b/src/test/iperf/iperfTest.py
@@ -23,7 +23,8 @@
 from nose.twistedtools import reactor, deferred
 from twisted.internet import defer
 from OnosCtrl import OnosCtrl
-from scapy.all import *
+from CordTestUtils import log_test as log
+
 log.setLevel('INFO')
 
 class iperf_exchange(unittest.TestCase):
@@ -200,4 +201,3 @@
             df.callback(0)
         reactor.callLater(0, iperf_network_test, df)
         return df
-
diff --git a/src/test/ipv6vrouter/ipv6vrouterTest.py b/src/test/ipv6vrouter/ipv6vrouterTest.py
index 00a7944..d0b1a79 100644
--- a/src/test/ipv6vrouter/ipv6vrouterTest.py
+++ b/src/test/ipv6vrouter/ipv6vrouterTest.py
@@ -16,7 +16,7 @@
 import unittest
 from nose.tools import *
 from scapy.all import *
-from CordTestUtils import get_mac
+from CordTestUtils import get_mac, log_test
 from OnosCtrl import OnosCtrl
 from OltConfig import OltConfig
 from OnosFlowCtrl import OnosFlowCtrl
@@ -40,7 +40,7 @@
 #from cli import system
 #from generic import *
 
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 class ipv6vrouter_exchange(CordLogger):
 
@@ -130,7 +130,7 @@
     def onos_load_config(cls, config):
         status, code = OnosCtrl.config(config)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
 
     @classmethod
@@ -145,7 +145,7 @@
         for host in host_config:
             status, code = OnosCtrl.host_config(host)
             if status is False:
-                log.info('JSON request returned status %d' %code)
+                log_test.info('JSON request returned status %d' %code)
                 assert_equal(status, True)
 
     @classmethod
@@ -171,7 +171,7 @@
         for host,_ in peer_info:
             iface = cls.port_map[index]
             index += 1
-            log.info('Assigning ip %s to interface %s' %(host, iface))
+            log_test.info('Assigning ip %s to interface %s' %(host, iface))
             config_cmds = ( 'ifconfig {} 0'.format(iface),
                             'ifconfig {0} inet6 add {1}/64'.format(iface, host),
                             'arping -I {0} {1} -c 2'.format(iface, host),
@@ -200,7 +200,7 @@
             config = dict(res)
         else:
             config = network_cfg
-        log.info('Restarting ONOS with new network configuration %s'%config)
+        log_test.info('Restarting ONOS with new network configuration %s'%config)
         return cord_test_onos_restart(config = config)
 
     @classmethod
@@ -214,8 +214,8 @@
 
     @classmethod
     def start_quagga(cls, networks = 4, peer_address = None, router_address = None):
-	log.info('Peer address in quagga start is %s'%peer_address)
-        log.info('Restarting Quagga container with configuration for %d networks' %(networks))
+	log_test.info('Peer address in quagga start is %s'%peer_address)
+        log_test.info('Restarting Quagga container with configuration for %d networks' %(networks))
         config = cls.generate_conf(networks = networks, peer_address = peer_address, router_address = router_address)
         if networks <= 10000:
             boot_delay = 25
@@ -259,7 +259,7 @@
 	    peer_nt = peer_ip + '/112'
 	    mac = RandMAC()._fix()
 	    peer_list.append((peer_ip, mac))
-	    log.info('peer ip is %s and and peer network is %s'%(peer_ip,peer_nt))
+	    log_test.info('peer ip is %s and and peer network is %s'%(peer_ip,peer_nt))
 	    if num < cls.MAX_PORTS - 1:
                 interface_dict = { 'name' : 'b1-{}'.format(port), 'ips': [peer_nt], 'mac' : mac }
                 interfaces.append(interface_dict)
@@ -351,7 +351,7 @@
         self.start_sending = True
         def recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
                 self.success = True if positive_test else False
             sniff(count=count, timeout=timeout,
                   lfilter = lambda p: IP in p and p[IP].dst == dst_ip and p[IP].src == src_ip,
@@ -363,7 +363,7 @@
         L2 = Ether(src = src_mac, dst = dst_mac)
         L3 = IPv6(src=src_ip,dst = dst_ip)
         pkt = L2/L3
-        log.info('Sending a packet with dst ip %s, dst mac %s on port %s to verify if flows are correct' %
+        log_test.info('Sending a packet with dst ip %s, dst mac %s on port %s to verify if flows are correct' %
                  (dst_ip, dst_mac, self.port_map[egress]))
         while self.start_sending is True:
             sendp(pkt, count=50, iface = self.port_map[egress])
@@ -413,7 +413,7 @@
 	if self.network_list > 50:
 		wait = len(self.network_list)/20
 		time.sleep(wait)
-		log.info('waiting for %d seconds to verify routes in ONOS'%wait)
+		log_test.info('waiting for %d seconds to verify routes in ONOS'%wait)
 	else:
 		time.sleep(5)
 	self.cliEnter()
@@ -430,16 +430,16 @@
             self.vrouter_traffic_verify(positive_test = False)
             self.network_list = network_list_backup
 	if deactivate_activate_vrouter is True:
-            log.info('Deactivating vrouter app in ONOS controller for negative scenario')
+            log_test.info('Deactivating vrouter app in ONOS controller for negative scenario')
             self.vrouter_activate(deactivate = True)
             #routes = json.loads(self.cli.routes(jsonFormat = False, cmd_exist = False))
             #assert_equal(len(routes['routes4']), 'Command not found')
-            log.info('Activating vrouter app again in ONOS controller for negative scenario')
+            log_test.info('Activating vrouter app again in ONOS controller for negative scenario')
             self.vrouter_activate(deactivate = False)
 	    if self.network_list > 50:
                 wait = len(self.network_list)/20
                 time.sleep(wait)
-                log.info('waiting for %d seconds to verify routes in ONOS'%wait)
+                log_test.info('waiting for %d seconds to verify routes in ONOS'%wait)
             else:
                 time.sleep(5)
             routes = json.loads(self.cli.routes(jsonFormat = True))
@@ -450,13 +450,13 @@
 
     def __vrouter_network_verify_negative(self, networks, peers = 1):
         ##Stop quagga. Test traffic again to see if flows were removed
-        log.info('Stopping Quagga container')
+        log_test.info('Stopping Quagga container')
         cord_test_quagga_stop()
         self.vrouter_traffic_verify(positive_test = False)
-        log.info('OVS flows have been removed successfully after Quagga was stopped')
+        log_test.info('OVS flows have been removed successfully after Quagga was stopped')
         self.start_quagga(networks = networks)
         self.vrouter_traffic_verify()
-        log.info('OVS flows have been successfully reinstalled after Quagga was restarted')
+        log_test.info('OVS flows have been successfully reinstalled after Quagga was restarted')
 
     def quagga_shell(self, cmd):
         shell_cmds = ('vtysh', '"conf t"', '"{}"'.format(cmd))
@@ -470,14 +470,14 @@
     def test_vrouter_ipv6_with_5_routes_quagga_restart_without_config(self):
 	res = self.__vrouter_network_verify(5, peers = 1)
         assert_equal(res, True)
-        log.info('Restart Quagga container without config retain')
+        log_test.info('Restart Quagga container without config retain')
         cord_test_quagga_restart()
         self.vrouter_traffic_verify(positive_test = False)
 
     def test_vrouter_ipv6_with_5_routes_quagga_restart_with_config(self):
         res = self.__vrouter_network_verify(5, peers = 1)
         assert_equal(res, True)
-        log.info('verifying vrouter traffic after Quagga restart with config retain')
+        log_test.info('verifying vrouter traffic after Quagga restart with config retain')
         #cord_test_quagga_restart()
         self.start_quagga(networks=5)
         self.vrouter_traffic_verify(positive_test = True)
@@ -485,14 +485,14 @@
     def test_vrouter_ipv6_with_5_routes_quagga_stop(self):
         res = self.__vrouter_network_verify(5, peers = 1)
         assert_equal(res, True)
-        log.info('verifying vrouter traffic after Quagga stop')
+        log_test.info('verifying vrouter traffic after Quagga stop')
         cord_test_quagga_stop()
         self.vrouter_traffic_verify(positive_test = False)
 
     def test_vrouter_ipv6_with_5_routes_quagga_stop_and_start(self):
         res = self.__vrouter_network_verify(5, peers = 1)
         assert_equal(res, True)
-        log.info('verifying vrouter traffic after Quagga stop and start again')
+        log_test.info('verifying vrouter traffic after Quagga stop and start again')
         cord_test_quagga_stop()
         self.vrouter_traffic_verify(positive_test = False)
 	self.start_quagga(networks=5)
@@ -501,14 +501,14 @@
     def test_vrouter_ipv6_with_5_routes_onos_restart_without_config(self):
         res = self.__vrouter_network_verify(5, peers = 1)
         assert_equal(res, True)
-        log.info('verifying vrouter traffic after ONOS restart without config retain')
+        log_test.info('verifying vrouter traffic after ONOS restart without config retain')
 	cord_test_onos_restart()
         self.vrouter_traffic_verify(positive_test = False)
 
     def test_vrouter_ipv6_with_5_routes_onos_restart_with_config(self):
         res = self.__vrouter_network_verify(5, peers = 1)
         assert_equal(res, True)
-        log.info('verifying vrouter traffic after ONOS restart with config retain')
+        log_test.info('verifying vrouter traffic after ONOS restart with config retain')
 	vrouter_configs = self.vrouter_config_get(networks = 5, peers = 1,
                                                  peer_address = None, route_update = None)
         self.start_onos(network_cfg=vrouter_configs)
@@ -521,7 +521,7 @@
     def test_vrouter_ipv6_with_5_routes_restart_quagga_and_onos_with_config(self):
         res = self.__vrouter_network_verify(5, peers = 1)
         assert_equal(res, True)
-        log.info('verifying vrouter traffic after Quagga and ONOS restart with config retain')
+        log_test.info('verifying vrouter traffic after Quagga and ONOS restart with config retain')
 	#cord_test_quagga_restart()
 	self.start_quagga(networks=5)
         vrouter_configs = self.vrouter_config_get(networks = 5, peers = 1,
@@ -660,7 +660,7 @@
         self.network_list = [ '4001:0:0:0:0:0:677:0' ]
         self.network_mask = 64
         self.vrouter_traffic_verify()
-	log.info('verifying vrouter traffic for added  routes after Quagga restart with old config only retain')
+	log_test.info('verifying vrouter traffic for added  routes after Quagga restart with old config only retain')
         #cord_test_quagga_restart()
         self.start_quagga(networks=5)
         self.vrouter_traffic_verify(positive_test = False)
diff --git a/src/test/mini/miniTest.py b/src/test/mini/miniTest.py
index 5caadc7..0540a72 100644
--- a/src/test/mini/miniTest.py
+++ b/src/test/mini/miniTest.py
@@ -16,7 +16,6 @@
 from nose.tools import *
 from nose.twistedtools import reactor, deferred
 from twisted.internet import defer
-from scapy.all import *
 from OnosCtrl import OnosCtrl
 from OnosFlowCtrl import OnosFlowCtrl
 from OltConfig import OltConfig
@@ -30,6 +29,7 @@
 from CordContainer import Onos
 from OnosLog import OnosLog
 from CordLogger import CordLogger
+from CordTestUtils import log_test as log
 import os
 import json
 import random
@@ -731,4 +731,3 @@
             Cleanup.cleanup()
             raise
         Cleanup.cleanup()
-
diff --git a/src/test/monitoring/monitoringTest.py b/src/test/monitoring/monitoringTest.py
index 6a24da8..c18aec7 100644
--- a/src/test/monitoring/monitoringTest.py
+++ b/src/test/monitoring/monitoringTest.py
@@ -20,7 +20,7 @@
 from nose.twistedtools import reactor, deferred
 from twisted.internet import defer
 from OnosCtrl import OnosCtrl
-from scapy.all import *
+from CordTestUtils import log_test as log
 from CordContainer import *
 from docker import Client
 import json
diff --git a/src/test/netCondition/netConditionTest.py b/src/test/netCondition/netConditionTest.py
index 28800e9..6992860 100644
--- a/src/test/netCondition/netConditionTest.py
+++ b/src/test/netCondition/netConditionTest.py
@@ -45,6 +45,7 @@
 from CordTestBase import CordTester
 from CordContainer import *
 from CordLogger import CordLogger
+from CordTestUtils import log_test
 import re
 from random import randint
 from time import sleep
@@ -53,7 +54,7 @@
 from OltConfig import OltConfig
 from threading import current_thread
 import collections
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 class IGMPTestState:
 
@@ -149,7 +150,7 @@
     def onos_load_tls_config(self, config):
         status, code = OnosCtrl.config(config)
         if status is False:
-            log.info('Configure request for AAA returned status %d' %code)
+            log_test.info('Configure request for AAA returned status %d' %code)
             assert_equal(status, True)
             time.sleep(3)
 
@@ -185,10 +186,10 @@
             onos_ctrl.deactivate()
 
     def onos_load_igmp_config(self, config):
-	log.info('onos load config is %s'%config)
+	log_test.info('onos load config is %s'%config)
         status, code = OnosCtrl.config(config)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         time.sleep(2)
 
@@ -296,9 +297,9 @@
             rx_stats = recvState.group_map[g][1]
             rx = rx_stats.count
             assert_greater(rx, 0)
-            log.info('Receive stats %s for group %s' %(rx_stats, g))
+            log_test.info('Receive stats %s for group %s' %(rx_stats, g))
 
-        log.info('IGMP test verification success')
+        log_test.info('IGMP test verification success')
 
     def igmp_verify_leave(self, igmpStateList, leave_groups):
         sendState, recvState = igmpStateList[0], igmpStateList[1]
@@ -310,12 +311,12 @@
             rx = rx_stats.count
             assert_greater(tx, 0)
             if g not in leave_groups:
-                log.info('Received %d packets for group %s' %(rx, g))
+                log_test.info('Received %d packets for group %s' %(rx, g))
         for g in leave_groups:
             rx = recvState.group_map[g][1].count
             assert_equal(rx, 0)
 
-        log.info('IGMP test verification success')
+        log_test.info('IGMP test verification success')
 
     def mcast_traffic_timer(self):
           self.mcastTraffic.stopReceives()
@@ -332,9 +333,9 @@
               send_time = float(p.payload.load)
               recv_time = monotonic.monotonic()
         except:
-              log.info('Unexpected Payload received: %s' %p.payload.load)
+              log_test.info('Unexpected Payload received: %s' %p.payload.load)
               return 0
-        #log.info( 'Recv in %.6f secs' %(recv_time - send_time))
+        #log_test.info( 'Recv in %.6f secs' %(recv_time - send_time))
         igmpState.update(p.dst, rx = 1, t = recv_time - send_time)
         return 0
 
@@ -408,18 +409,18 @@
         pkt = ip_pkt/igmp
         IGMPv3.fixup(pkt)
         if rec_queryCount == None:
-            log.info('Sending IGMP join for group %s and waiting for one query packet and printing the packet' %groups)
+            log_test.info('Sending IGMP join for group %s and waiting for one query packet and printing the packet' %groups)
             resp = srp1(pkt, iface=iface)
         else:
-            log.info('Sending IGMP join for group %s and waiting for periodic query packets and printing one packet' %groups)
+            log_test.info('Sending IGMP join for group %s and waiting for periodic query packets and printing one packet' %groups)
             resp = srp1(pkt, iface=iface)
         resp[0].summary()
-        log.info('Sent IGMP join for group %s and received a query packet and  printing packet' %groups)
+        log_test.info('Sent IGMP join for group %s and received a query packet and  printing packet' %groups)
         if delay != 0:
             time.sleep(delay)
 
     def send_igmp_leave(self, groups, src_list = ['1.2.3.4'], ip_pkt = None, iface = 'veth0', delay = 2):
-	log.info('entering into igmp leave function')
+	log_test.info('entering into igmp leave function')
         igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
                       gaddr=self.IP_DST)
         for g in groups:
@@ -445,10 +446,10 @@
               ip_pkt = self.igmp_eth/self.igmp_ip
         pkt = ip_pkt/igmp
         IGMPv3.fixup(pkt)
-        log.info('Sending IGMP leave for group %s and waiting for one group specific query packet and printing the packet' %groups)
+        log_test.info('Sending IGMP leave for group %s and waiting for one group specific query packet and printing the packet' %groups)
         resp = srp1(pkt, iface=iface)
         resp[0].summary()
-        log.info('Sent IGMP leave for group %s and received a group specific query packet and printing packet' %groups)
+        log_test.info('Sent IGMP leave for group %s and received a group specific query packet and printing packet' %groups)
         if delay != 0:
             time.sleep(delay)
 
@@ -482,7 +483,7 @@
                 self.df.callback(0)
 
         self.send_igmp_join(groups)
-        log.info('Holding multicast data for a period of random delay = {} secs'.format(randomDelay))
+        log_test.info('Holding multicast data for a period of random delay = {} secs'.format(randomDelay))
         t = Timer(randomDelay, mcast_traffic_delay_start)
         t.start()
 
@@ -506,7 +507,7 @@
         self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
 
         def mcast_join_delay_start():
-            log.info('Holding channel join for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding channel join for a period of random delay = {} secs'.format(randomDelay))
             self.send_igmp_join(groups)
 
         def igmp_srp_task(stateList):
@@ -550,28 +551,28 @@
 	    self.send_igmp_leave(leave_groups, delay = 3)
 	    join_state = IGMPTestState(groups = leave_groups)
 	    status = self.igmp_not_recv_task(self.V_INF1,leave_groups, join_state)
-	    log.info('Verified status for igmp recv task %s'%status)
+	    log_test.info('Verified status for igmp recv task %s'%status)
 	    assert status == 1 , 'EXPECTED RESULT'
 	    self.df.callback(0)
 
 	mcastTraffic.start()
 	self.send_igmp_join(groups)
-        log.info('Holding multicast leave packet for a period of random delay = {} secs'.format(randomDelay))
+        log_test.info('Holding multicast leave packet for a period of random delay = {} secs'.format(randomDelay))
         t = Timer(randomDelay+10, mcast_leave_delay_start)
         t.start()
         return df
 
     def igmp_not_recv_task(self, intf, groups, join_state):
-	  log.info('Entering igmp not recv task loop')
+	  log_test.info('Entering igmp not recv task loop')
           recv_socket = L2Socket(iface = intf, type = ETH_P_IP)
           group_map = {}
           for g in groups:
                 group_map[g] = [0,0]
 
-          log.info('Verifying join interface should not receive any multicast data')
+          log_test.info('Verifying join interface should not receive any multicast data')
           self.NEGATIVE_TRAFFIC_STATUS = 1
           def igmp_recv_cb(pkt):
-                log.info('Multicast packet %s received for left groups %s' %(pkt[IP].dst, groups))
+                log_test.info('Multicast packet %s received for left groups %s' %(pkt[IP].dst, groups))
                 self.NEGATIVE_TRAFFIC_STATUS = 2
           sniff(prn = igmp_recv_cb, count = 1, lfilter = lambda p: IP in p and p[IP].dst in groups,
                 timeout = 3, opened_socket = recv_socket)
@@ -598,7 +599,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -611,7 +612,7 @@
         df = defer.Deferred()
         tls = TLSAuthTest()
         def eap_tls_eapTlsHelloReq_pkt_delay():
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             tls._eapTlsHelloReq()
             tls._eapTlsCertReq()
             tls._eapTlsChangeCipherSpec()
@@ -636,7 +637,7 @@
         df = defer.Deferred()
         tls = TLSAuthTest()
         def eap_tls_eapTlsCertReq_pkt_delay():
-            log.info('Holding eapTlsCertReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding eapTlsCertReq packet for a period of random delay = {} secs'.format(randomDelay))
             tls._eapTlsCertReq_delay()
             tls._eapTlsChangeCipherSpec()
             tls._eapTlsFinished()
@@ -668,7 +669,7 @@
         df = defer.Deferred()
         tls = TLSAuthTest()
         def eap_tls_TlsChangeCipherSpec_pkt_delay():
-            log.info('Holding TlsChangeCipherSpec packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding TlsChangeCipherSpec packet for a period of random delay = {} secs'.format(randomDelay))
             tls._eapTlsChangeCipherSpec()
             tls._eapTlsFinished()
             df.callback(0)
@@ -692,10 +693,10 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_no_cert_cb():
-            log.info('TLS authentication failed with no certificate')
+            log_test.info('TLS authentication failed with no certificate')
         tls = TLSAuthTest(fail_cb = tls_no_cert_cb, client_cert = '')
         def eap_tls_eapTlsHelloReq_pkt_delay():
-            log.info('Holding HelloReq packet with no cert for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding HelloReq packet with no cert for a period of random delay = {} secs'.format(randomDelay))
             tls._eapTlsHelloReq()
             tls._eapTlsCertReq()
             assert_equal(tls.failTest, True)
@@ -720,10 +721,10 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_no_cert_cb():
-            log.info('TLS authentication failed with no certificate')
+            log_test.info('TLS authentication failed with no certificate')
         tls = TLSAuthTest(fail_cb = tls_no_cert_cb, client_cert = '')
         def eap_tls_eapTlsHelloReq_pkt_delay():
-            log.info('Holding eapTlsCertReq packet with no cert for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding eapTlsCertReq packet with no cert for a period of random delay = {} secs'.format(randomDelay))
             tls._eapTlsCertReq_delay()
             assert_equal(tls.failTest, True)
             tls._eapTlsChangeCipherSpec()
@@ -757,7 +758,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_no_cert_cb():
-            log.info('TLS authentication failed with no certificate')
+            log_test.info('TLS authentication failed with no certificate')
         tls = TLSAuthTest(fail_cb = tls_no_cert_cb, client_cert = '')
         def eap_tls_TlsChangeCipherSpec_pkt_delay():
             tls._eapTlsChangeCipherSpec()
@@ -772,7 +773,7 @@
             tls.tlsEventTable.EVT_EAP_ID_REQ
             tls._eapTlsHelloReq()
             tls._eapTlsCertReq()
-            log.info('Holding TlsChangeCipherSpec packet with no cert for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding TlsChangeCipherSpec packet with no cert for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_TlsChangeCipherSpec_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_no_cert, df)
@@ -784,7 +785,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_invalid_cert_cb():
-            log.info('TLS authentication failed with invalid certificate')
+            log_test.info('TLS authentication failed with invalid certificate')
         tls = TLSAuthTest(fail_cb = tls_invalid_cert_cb, client_cert = self.CLIENT_CERT_INVALID)
         def eap_tls_eapTlsHelloReq_pkt_delay():
             tls._eapTlsHelloReq()
@@ -800,7 +801,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding HelloReq packet with invalid cert for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding HelloReq packet with invalid cert for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_invalid_cert, df)
@@ -812,10 +813,10 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_invalid_cert_cb():
-            log.info('TLS authentication failed with invalid certificate')
+            log_test.info('TLS authentication failed with invalid certificate')
         tls = TLSAuthTest(fail_cb = tls_invalid_cert_cb, client_cert = self.CLIENT_CERT_INVALID)
         def eap_tls_eapTlsHelloReq_pkt_delay():
-            log.info('Holding eapTlsCertReq packet with invalid cert for a period of random delay = {} sec, delay'.format(randomDelay))
+            log_test.info('Holding eapTlsCertReq packet with invalid cert for a period of random delay = {} sec, delay'.format(randomDelay))
             tls._eapTlsCertReq_delay()
             tls._eapTlsChangeCipherSpec()
             assert_equal(tls.failTest, True)
@@ -837,7 +838,7 @@
                if len(r) == 0:
                   tls.tlsFail()
 
-            log.info('Holding eapTlsCertReq packet with invalid cert for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding eapTlsCertReq packet with invalid cert for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_invalid_cert, df)
@@ -850,7 +851,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_invalid_cert_cb():
-            log.info('TLS authentication failed with invalid certificate')
+            log_test.info('TLS authentication failed with invalid certificate')
         tls = TLSAuthTest(fail_cb = tls_invalid_cert_cb, client_cert = self.CLIENT_CERT_INVALID)
         def eap_tls_TlsChangeCipherSpec_pkt_delay():
             tls._eapTlsChangeCipherSpec()
@@ -866,7 +867,7 @@
             tls.tlsEventTable.EVT_EAP_ID_REQ
             tls._eapTlsHelloReq()
             tls._eapTlsCertReq()
-            log.info('Holding TlsChangeCipherSpec packet with invalid cert for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding TlsChangeCipherSpec packet with invalid cert for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_TlsChangeCipherSpec_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_invalid_cert, df)
@@ -888,13 +889,13 @@
                 tls.tlsEventTable.EVT_EAP_START
                 tls._eapIdReq()
                 tls.tlsEventTable.EVT_EAP_ID_REQ
-                log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+                log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
                 time.sleep(randomDelay)
                 tls._eapTlsHelloReq()
                 tls._eapTlsCertReq()
                 tls._eapTlsChangeCipherSpec()
                 tls._eapTlsFinished()
-                log.info('Authentication successful for user %d'%i)
+                log_test.info('Authentication successful for user %d'%i)
            # Sending multiple tls clients and making random delay in between client and server packets.
            for i in xrange(clients):
              thread = threading.Thread(target = multiple_tls_random_delay)
@@ -927,7 +928,7 @@
                 tls._eapTlsCertReq()
                 tls._eapTlsChangeCipherSpec()
                 tls._eapTlsFinished()
-                log.info('Authentication successful for user %d'%i)
+                log_test.info('Authentication successful for user %d'%i)
            # Client authendicating multiple times one after other and making random delay in between authendication.
            for i in xrange(clients):
              multiple_tls_random_delay()
@@ -966,7 +967,7 @@
                 for x in xrange(clients):
                    tls[x]._eapTlsFinished()
                 for x in xrange(clients):
-                   log.info('Authentication successful for user %d'%i)
+                   log_test.info('Authentication successful for user %d'%i)
            # Client authendicating multiple times one after other and making random delay in between authendication.
            for i in xrange(2):
              multiple_tls_random_delay()
@@ -988,7 +989,7 @@
 
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
+                log_test.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
                 self.success = True
             sniff(count=2, timeout=randomDelay+50, lfilter = lambda p: p.src == ingress_mac,
                   prn = recv_cb, iface = self.port_map[egress])
@@ -1013,7 +1014,7 @@
             ##wait for flows to be added to ONOS
             time.sleep(1)
             thread.start()
-            log.info('Holding a packet to verify if flows are  active after {} secs'.format(randomDelay))
+            log_test.info('Holding a packet to verify if flows are  active after {} secs'.format(randomDelay))
             t = Timer(randomDelay, send_flow_pkt_delay)
             t.start()
         reactor.callLater(0, creating_mac_flow, df)
@@ -1034,7 +1035,7 @@
 
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
                 self.success = True
             sniff(count=2, timeout= randomDelay + 30,
                   lfilter = lambda p: IP in p and p[IP].dst == egress_map['ip'] and p[IP].src == ingress_map['ip'],
@@ -1064,7 +1065,7 @@
             ##wait for flows to be added to ONOS
             time.sleep(1)
             thread.start()
-            log.info('Holding a packet to verify if flows are  active after {} secs'.format(randomDelay))
+            log_test.info('Holding a packet to verify if flows are  active after {} secs'.format(randomDelay))
             t = Timer(randomDelay, send_flow_ip_pkt_delay)
             t.start()
         reactor.callLater(0, creating_ip_flow, df)
@@ -1084,7 +1085,7 @@
 
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
+                log_test.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
                 self.success = True
             sniff(count=2, timeout= randomDelay+30, lfilter = lambda p: TCP in p and p[TCP].dport == egress_map['tcp_port']
                         and p[TCP].sport == ingress_map['tcp_port'], prn = recv_cb, iface = self.port_map[egress])
@@ -1109,7 +1110,7 @@
             time.sleep(1)
             self.success = False
             thread.start()
-            log.info('Holding a packet to verify if flows are active after {} sec, delay'.format(randomDelay))
+            log_test.info('Holding a packet to verify if flows are active after {} sec, delay'.format(randomDelay))
             t = Timer(randomDelay, send_flow_tcp_pkt_delay)
             t.start()
         df.callback(0)
@@ -1131,7 +1132,7 @@
 
         def mac_recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
+                log_test.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
                 self.success = True
             sniff(count=2, timeout=randomDelay + 30,
              lfilter = lambda p: UDP in p and p[UDP].dport == egress_map['udp_port']
@@ -1158,7 +1159,7 @@
             time.sleep(1)
             self.success = False
             thread.start()
-            log.info('Holding a packet to verify if flows are active after {} secs'.format(randomDelay))
+            log_test.info('Holding a packet to verify if flows are active after {} secs'.format(randomDelay))
             t = Timer(randomDelay, send_flow_udp_pkt_delay)
             t.start()
 
@@ -1189,7 +1190,7 @@
             if group in groups:
                 pass
             else:
-                log.info('group = %s source list = %s and subscriber source ip in join = %s'%(group,source, subscriber_sourceip))
+                log_test.info('group = %s source list = %s and subscriber source ip in join = %s'%(group,source, subscriber_sourceip))
                 groups.append(group)
                 sources.append(source)
                 subscribers_src_ip.append(subscriber_sourceip)
@@ -1200,11 +1201,11 @@
             self.send_igmp_join(groups = [group], src_list = [source],record_type = IGMP_V3_GR_TYPE_INCLUDE,
                                          iface = self.V_INF1, ip_src = [subscriber_src_ip])
             randomDelay_in_thread = randint(10,30)
-            log.info('This is running in a thread, with  igmp join sent and delay {}'.format(randomDelay_in_thread))
+            log_test.info('This is running in a thread, with  igmp join sent and delay {}'.format(randomDelay_in_thread))
             time.sleep(randomDelay_in_thread)
-            log.info('This is running in a thread, with igmp join sent and delay {}'.format(randomDelay_in_thread))
+            log_test.info('This is running in a thread, with igmp join sent and delay {}'.format(randomDelay_in_thread))
             status = self.verify_igmp_data_traffic_in_thread(group,intf=self.V_INF1,source=source, data_pkt = data_pkt)
-            log.info('Data received for group %s from source %s and status is %s '%(group,source,status))
+            log_test.info('Data received for group %s from source %s and status is %s '%(group,source,status))
             self.igmp_threads_result.append(status)
 
         for i in range(subscriber):
@@ -1217,12 +1218,12 @@
             thread.join()
 
     def verify_igmp_data_traffic_in_thread(self, group, intf='veth0', source='1.2.3.4', data_pkt =50, negative = None):
-        log.info('Verifying multicast traffic for group %s from source %s'%(group,source))
+        log_test.info('Verifying multicast traffic for group %s from source %s'%(group,source))
         self.success = False
         def recv_task():
             def igmp_recv_cb(pkt):
-                #log.info('received multicast data packet is %s'%pkt.show())
-                log.info('Multicast data received for group %s from source %s'%(group,source))
+                #log_test.info('received multicast data packet is %s'%pkt.show())
+                log_test.info('Multicast data received for group %s from source %s'%(group,source))
                 self.success = True
             sniff(prn = igmp_recv_cb,lfilter = lambda p: IP in p and p[IP].dst == group and p[IP].src == source, count=1,timeout = 2, iface='veth0')
         t = threading.Thread(target = recv_task)
@@ -1232,10 +1233,10 @@
         if (negative is None) and self.success is True:
            return self.success
         elif (negative is not None) and self.success is True:
-           log.info('Multicast traffic should not received because this is negative scenario, but it is received')
+           log_test.info('Multicast traffic should not received because this is negative scenario, but it is received')
            self.success = False
         elif (negative is not None) and self.success is False:
-           log.info('Multicast traffic should is not received because this is negative scenario, hence status is True')
+           log_test.info('Multicast traffic should is not received because this is negative scenario, hence status is True')
            self.success = True
         return self.success
 
@@ -1244,10 +1245,10 @@
         eth = Ether(dst= dst_mac)
         ip = IP(dst=group,src=source)
         data = repr(monotonic.monotonic())
-        log.info('Sending %s number of multicast packet to the multicast group %s'%(data_pkt, group))
+        log_test.info('Sending %s number of multicast packet to the multicast group %s'%(data_pkt, group))
         sendp(eth/ip/data,count=data_pkt, iface = intf)
         pkt = (eth/ip/data)
-        #log.info('multicast traffic packet %s'%pkt.show())
+        #log_test.info('multicast traffic packet %s'%pkt.show())
 
     def iptomac_convert(self, mcast_ip):
         mcast_mac =  '01:00:5e:'
@@ -1262,7 +1263,7 @@
     def test_netCondition_with_delay_between_multiple_igmp_joins_and_data_for_multiple_subscribers(self):
         self.setUp_tls()
         df = defer.Deferred()
-        log.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
+        log_test.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
         def netCondition_multiple_igmp_joins_and_data(df):
             ### Start ips of multicast, source list and subscriber source ip are '229.0.0.1', '10.10.0.1' and '20.20.0.1' respectively
             no_users = 10
@@ -1271,9 +1272,9 @@
             subscriber_src_end_ip = '20.20.20.254'
             self.netCondition_with_delay_between_multiple_igmp_joins_and_data(users = no_users, group_end_ip = group_end_ip,
                                                                           source_list_end_ip = source_list_end_ip, user_src_end_ip = subscriber_src_end_ip )
-            log.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
+            log_test.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
             for i in xrange(no_users):
-               log.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
+               log_test.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
                if assert_equal(self.igmp_threads_result[i], True) is True:
                   df.callback(0)
             df.callback(0)
@@ -1284,7 +1285,7 @@
     def test_netCondition_with_delay_between_multiple_igmp_joins_and_data_from_multiple_subscribers_with_low_multicast_data_rate(self):
         self.setUp_tls()
         df = defer.Deferred()
-        log.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
+        log_test.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
         def netCondition_multiple_igmp_joins_and_data(df):
             ### Start ips of multicast, source list and subscriber source ip are '229.0.0.1', '10.10.0.1' and '20.20.0.1' respectively
             no_users = 10
@@ -1293,9 +1294,9 @@
             subscriber_src_end_ip = '20.20.20.254'
             self.netCondition_with_delay_between_multiple_igmp_joins_and_data(users = no_users, group_end_ip = group_end_ip,
                                              source_list_end_ip = source_list_end_ip, user_src_end_ip = subscriber_src_end_ip, data_pkt = 20)
-            log.info('IGMP Thread status after running igmp thread %s '%(self.igmp_threads_result))
+            log_test.info('IGMP Thread status after running igmp thread %s '%(self.igmp_threads_result))
             for i in xrange(no_users):
-               log.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
+               log_test.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
                if assert_equal(self.igmp_threads_result[i], True) is True:
                   df.callback(0)
             df.callback(0)
@@ -1306,7 +1307,7 @@
     def test_netCondition_with_delay_between_multiple_igmp_joins_and_data_for_same_subscriber(self):
         self.setUp_tls()
         df = defer.Deferred()
-        log.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
+        log_test.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
         def netCondition_multiple_igmp_joins_and_data(df):
             ### Start ips of multicast, source list and subscriber source ip are '229.0.0.1', '10.10.0.1' and '20.20.0.1' respectively
             no_users = 5
@@ -1315,9 +1316,9 @@
             subscriber_src_end_ip = '20.20.0.1'
             self.netCondition_with_delay_between_multiple_igmp_joins_and_data(users = no_users, group_end_ip = group_end_ip,
                                                                           source_list_end_ip = source_list_end_ip, user_src_end_ip = subscriber_src_end_ip )
-            log.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
+            log_test.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
             for i in xrange(no_users):
-               log.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
+               log_test.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
                if assert_equal(self.igmp_threads_result[i], True) is True:
                   df.callback(0)
             df.callback(0)
@@ -1329,7 +1330,7 @@
     def test_netCondition_with_delay_between_same_igmp_joins_and_data_from_multiple_subscriber(self):
         self.setUp_tls()
         df = defer.Deferred()
-        log.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
+        log_test.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
         def netCondition_multiple_igmp_joins_and_data(df):
             ### Start ips of multicast, source list and subscriber source ip are '229.0.0.1', '10.10.0.1' and '20.20.0.1' respectively
             no_users = 100
@@ -1338,9 +1339,9 @@
             subscriber_src_end_ip = '20.20.20.254'
             self.netCondition_with_delay_between_multiple_igmp_joins_and_data(users = no_users, group_end_ip = group_end_ip,
                                                                           source_list_end_ip = source_list_end_ip, user_src_end_ip = subscriber_src_end_ip )
-            log.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
+            log_test.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
             for i in xrange(no_users):
-               log.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
+               log_test.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
                if assert_equal(self.igmp_threads_result[i], True) is True:
                   df.callback(0)
             df.callback(0)
@@ -1351,7 +1352,7 @@
     def test_netCondition_with_delay_between_multiple_igmp_joins_and_data_from_same_sourcelist_for_multiple_subscriber(self):
         self.setUp_tls()
         df = defer.Deferred()
-        log.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
+        log_test.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
         def netCondition_multiple_igmp_joins_and_data(df):
             ### Start ips of multicast, source list and subscriber source ip are '229.0.0.1', '10.10.0.1' and '20.20.0.1' respectively
             no_users = 20
@@ -1360,9 +1361,9 @@
             subscriber_src_end_ip = '20.20.20.254'
             self.netCondition_with_delay_between_multiple_igmp_joins_and_data(users = no_users, group_end_ip = group_end_ip,
                                                                           source_list_end_ip = source_list_end_ip, user_src_end_ip = subscriber_src_end_ip )
-            log.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
+            log_test.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
             for i in xrange(no_users):
-               log.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
+               log_test.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
                if assert_equal(self.igmp_threads_result[i], True) is True:
                   df.callback(0)
             df.callback(0)
@@ -1395,7 +1396,7 @@
             if group in groups:
                 pass
             else:
-                log.info('group = %s source list = %s and subscriber source ip in join = %s'%(group,source, subscriber_sourceip))
+                log_test.info('group = %s source list = %s and subscriber source ip in join = %s'%(group,source, subscriber_sourceip))
                 groups.append(group)
                 sources.append(source)
                 subscribers_src_ip.append(subscriber_sourceip)
@@ -1410,17 +1411,17 @@
                self.send_igmp_join_negative(groups = [group], src_list = [source],record_type = IGMP_V3_GR_TYPE_INCLUDE,
                                            iface = self.V_INF1, ip_src = [subscriber_src_ip], invalid_igmp_join = invalid_igmp_join)
             randomDelay_in_thread = randint(10,30)
-            log.info('This is running in thread with igmp join sent and delay {}'.format(randomDelay_in_thread))
+            log_test.info('This is running in thread with igmp join sent and delay {}'.format(randomDelay_in_thread))
             time.sleep(randomDelay_in_thread)
-            log.info('This is running in thread with igmp join sent and delay {}'.format(randomDelay_in_thread))
+            log_test.info('This is running in thread with igmp join sent and delay {}'.format(randomDelay_in_thread))
             status = self.verify_igmp_data_traffic_in_thread(group,intf=self.V_INF1,source=source, data_pkt = data_pkt,negative=negative_traffic)
-            log.info('data received for group %s from source %s and status is %s '%(group,source,status))
+            log_test.info('data received for group %s from source %s and status is %s '%(group,source,status))
             self.igmp_threads_result.append(status)
         for i in range(subscriber):
             thread = threading.Thread(target = multiple_joins_send_in_threads, args = (groups[i], sources[i], subscribers_src_ip[i], invalid_joins))
             if bunch_traffic ==  'yes':
                if j == 10:
-                  log.info('Here we are throttle traffic for 100 sec of delay and agian creating igmp threads')
+                  log_test.info('Here we are throttle traffic for 100 sec of delay and agian creating igmp threads')
                   time.sleep(randint(100,110))
                   j = 1
                else:
@@ -1435,7 +1436,7 @@
     def test_netCondition_with_throttle_between_multiple_igmp_joins_and_data_from_multiple_subscribers(self):
         self.setUp_tls()
         df = defer.Deferred()
-        log.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
+        log_test.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
         def netCondition_multiple_igmp_joins_and_data(df):
             ### Start ips of multicast, source list and subscriber source ip are '229.0.0.1', '10.10.0.1' and '20.20.0.1' respectively
             batch_traffic_run = 'yes'
@@ -1444,9 +1445,9 @@
             source_list_end_ip = '10.10.30.254'
             subscriber_src_end_ip = '20.20.20.254'
             self.netCondition_with_multiple_scenarios_igmp_joins_and_data(users = no_users, group_end_ip = group_end_ip, source_list_end_ip = source_list_end_ip, user_src_end_ip = subscriber_src_end_ip, bunch_traffic = batch_traffic_run, data_pkt = 50 )
-            log.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
+            log_test.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
             for i in xrange(no_users):
-               log.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
+               log_test.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
                if assert_equal(self.igmp_threads_result[i], True) is True:
                   df.callback(0)
             df.callback(0)
@@ -1457,7 +1458,7 @@
     def test_netCondition_with_invalid_igmp_type_multiple_igmp_joins_and_data_from_multiple_subscribers(self):
         self.setUp_tls()
         df = defer.Deferred()
-        log.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
+        log_test.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
         def netCondition_multiple_igmp_joins_and_data(df):
             ### Start ips of multicast, source list and subscriber source ip are '229.0.0.1', '10.10.0.1' and '20.20.0.1' respectively
             batch_traffic_run = 'no'
@@ -1467,9 +1468,9 @@
             source_list_end_ip = '10.10.30.254'
             subscriber_src_end_ip = '20.20.20.254'
             self.netCondition_with_multiple_scenarios_igmp_joins_and_data(users = no_users, group_end_ip = group_end_ip, source_list_end_ip = source_list_end_ip, user_src_end_ip = subscriber_src_end_ip, bunch_traffic = batch_traffic_run, data_pkt = 50, invalid_joins = invalid_igmp_join )
-            log.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
+            log_test.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
             for i in xrange(no_users):
-               log.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
+               log_test.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
                if assert_equal(self.igmp_threads_result[i], True) is True:
                   df.callback(0)
             df.callback(0)
@@ -1480,7 +1481,7 @@
     def test_netCondition_with_invalid_record_type_multiple_igmp_joins_and_data_from_multiple_subscribers(self):
         self.setUp_tls()
         df = defer.Deferred()
-        log.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
+        log_test.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
         def netCondition_multiple_igmp_joins_and_data(df):
             ### Start ips of multicast, source list and subscriber source ip are '229.0.0.1', '10.10.0.1' and '20.20.0.1' respectively
             batch_traffic_run = 'no'
@@ -1490,9 +1491,9 @@
             source_list_end_ip = '10.10.30.254'
             subscriber_src_end_ip = '20.20.20.254'
             self.netCondition_with_multiple_scenarios_igmp_joins_and_data(users = no_users, group_end_ip = group_end_ip, source_list_end_ip = source_list_end_ip, user_src_end_ip = subscriber_src_end_ip, bunch_traffic = batch_traffic_run, data_pkt = 50, invalid_joins = invalid_igmp_join )
-            log.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
+            log_test.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
             for i in xrange(no_users):
-               log.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
+               log_test.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
                if assert_equal(self.igmp_threads_result[i], True) is True:
                   df.callback(0)
             df.callback(0)
@@ -1504,7 +1505,7 @@
     def test_netCondition_with_invalid_ttl_and_multiple_igmp_joins_and_data_from_multiple_subscribers(self):
         self.setUp_tls()
         df = defer.Deferred()
-        log.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
+        log_test.info('IGMP Thread status before running igmp thread %s '%(self.igmp_threads_result))
         def netCondition_multiple_igmp_joins_and_data(df):
             ### Start ips of multicast, source list and subscriber source ip are '229.0.0.1', '10.10.0.1' and '20.20.0.1' respectively
             batch_traffic_run = 'no'
@@ -1514,9 +1515,9 @@
             source_list_end_ip = '10.10.30.254'
             subscriber_src_end_ip = '20.20.20.254'
             self.netCondition_with_multiple_scenarios_igmp_joins_and_data(users = no_users, group_end_ip = group_end_ip, source_list_end_ip = source_list_end_ip, user_src_end_ip = subscriber_src_end_ip, bunch_traffic = batch_traffic_run, data_pkt = 10, invalid_joins = invalid_igmp_join )
-            log.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
+            log_test.info('IGMP Thread status after running igmp thread %s '%(self. igmp_threads_result))
             for i in xrange(no_users):
-               log.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
+               log_test.info('IGMP Thread %s status is %s after running igmp thread '%(i,self.igmp_threads_result[i]))
                if assert_equal(self.igmp_threads_result[i], True) is True:
                   df.callback(0)
             df.callback(0)
@@ -1548,7 +1549,7 @@
                 assert_equal(tls.failTest, True)
                 tls._eapTlsFinished()
                 assert_equal(tls.failTest, True)
-                log.info('Authentication successful for user %d'%i)
+                log_test.info('Authentication successful for user %d'%i)
            # Sending multiple tls clients and making random delay in between client and server packets.
            for i in xrange(clients):
              thread = threading.Thread(target = multiple_tls_random_delay)
@@ -1587,7 +1588,7 @@
                 assert_equal(tls.failTest, True)
                 tls._eapTlsFinished()
                 assert_equal(tls.failTest, True)
-                log.info('Authentication successful for user %d'%i)
+                log_test.info('Authentication successful for user %d'%i)
            # Sending multiple tls clients and making random delay in between client and server packets.
            for i in xrange(clients):
              thread = threading.Thread(target = multiple_tls_random_delay)
@@ -1626,7 +1627,7 @@
                 assert_equal(tls.failTest, True)
                 tls._eapTlsFinished()
                 assert_equal(tls.failTest, True)
-                log.info('Authentication successful for user %d'%i)
+                log_test.info('Authentication successful for user %d'%i)
            # Sending multiple tls clients and making random delay in between client and server packets.
            for i in xrange(clients):
              thread = threading.Thread(target = multiple_tls_random_delay)
@@ -1659,7 +1660,7 @@
                 tls._eapTlsChangeCipherSpec()
                 assert_equal(tls.failTest, True)
                 tls._eapTlsFinished()
-                log.info('Authentication successful for user %d'%i)
+                log_test.info('Authentication successful for user %d'%i)
            # Sending multiple tls clients and making random delay in between client and server packets.
            for i in xrange(clients):
              thread = threading.Thread(target = multiple_tls_random_delay)
@@ -1692,7 +1693,7 @@
                 #tls._eapTlsChangeCipherSpec()
                 assert_equal(tls.failTest, True)
                 tls._eapTlsFinished()
-                log.info('Authentication successful for user %d'%i)
+                log_test.info('Authentication successful for user %d'%i)
            # Sending multiple tls clients and making random delay in between client and server packets.
            for i in xrange(clients):
              thread = threading.Thread(target = multiple_tls_random_delay)
@@ -1725,7 +1726,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -1752,7 +1753,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -1779,7 +1780,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -1806,7 +1807,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -1818,7 +1819,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_invalid_content_type_cb():
-            log.info('TLS authentication failed with invalid content type in TLSContentType packet')
+            log_test.info('TLS authentication failed with invalid content type in TLSContentType packet')
         tls = TLSAuthTest(fail_cb = tls_invalid_content_type_cb, invalid_content_type = 44)
         def eap_tls_eapTlsHelloReq_pkt_delay():
             tls._eapTlsHelloReq()
@@ -1833,7 +1834,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -1845,7 +1846,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_invalid_eap_tls_version_in_client_auth_packet():
-            log.info('TLS authentication failed with invalid tls version field in the packet')
+            log_test.info('TLS authentication failed with invalid tls version field in the packet')
         tls = TLSAuthTest(fail_cb = tls_invalid_eap_tls_version_in_client_auth_packet, version = 'TLS_2_1')
         def eap_tls_eapTlsHelloReq_pkt_delay():
             tls._eapTlsHelloReq()
@@ -1860,7 +1861,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -1872,7 +1873,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_with_invalid_tls_cipher_suite_field_in_client_auth_packet_cb():
-            log.info('TLS authentication failed with invalid tls cipher suite field in the packet')
+            log_test.info('TLS authentication failed with invalid tls cipher suite field in the packet')
         tls = TLSAuthTest(fail_cb = tls_with_invalid_tls_cipher_suite_field_in_client_auth_packet_cb, cipher_suite = 'RSA_WITH_AES_512_CBC_SHA')
         def eap_tls_eapTlsHelloReq_pkt_delay():
             tls._eapTlsHelloReq()
@@ -1887,7 +1888,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -1899,7 +1900,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_with_invalid_id_in_identifier_response_packet_cb():
-            log.info('TLS authentication failed with invalid id in identifier packet')
+            log_test.info('TLS authentication failed with invalid id in identifier packet')
         tls = TLSAuthTest(fail_cb = tls_with_invalid_id_in_identifier_response_packet_cb,
                               id_mismatch_in_identifier_response_packet = True)
         def eap_tls_eapTlsHelloReq_pkt_delay():
@@ -1915,7 +1916,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -1927,7 +1928,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_with_invalid_id_in_client_hello_packet_cb():
-             log.info('TLS authentication failed with invalid id in client hello packet')
+             log_test.info('TLS authentication failed with invalid id in client hello packet')
         tls = TLSAuthTest(fail_cb = tls_with_invalid_id_in_client_hello_packet_cb,
                               id_mismatch_in_client_hello_packet = True)
 
@@ -1944,7 +1945,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -1956,7 +1957,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_incorrect_handshake_type_client_hello_cb():
-            log.info('TLS authentication failed with incorrect handshake type in client hello packet')
+            log_test.info('TLS authentication failed with incorrect handshake type in client hello packet')
         tls = TLSAuthTest(fail_cb = tls_incorrect_handshake_type_client_hello_cb, invalid_client_hello_handshake_type=True)
         def eap_tls_eapTlsHelloReq_pkt_delay():
             tls._eapTlsHelloReq()
@@ -1971,7 +1972,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -1983,7 +1984,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_incorrect_handshake_type_certificate_request_cb():
-            log.info('TLS authentication failed with incorrect handshake type in client certificate request packet')
+            log_test.info('TLS authentication failed with incorrect handshake type in client certificate request packet')
         tls = TLSAuthTest(fail_cb = tls_incorrect_handshake_type_certificate_request_cb, invalid_cert_req_handshake = True)
         def eap_tls_eapTlsHelloReq_pkt_delay():
             tls._eapTlsHelloReq()
@@ -1998,7 +1999,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -2010,7 +2011,7 @@
         randomDelay = randint(10,300)
         df = defer.Deferred()
         def tls_clientkeyex_replace_with_serverkeyex_cb():
-            log.info('TLS authentication failed with client key exchange replaced with server key exchange')
+            log_test.info('TLS authentication failed with client key exchange replaced with server key exchange')
         tls = TLSAuthTest(fail_cb = tls_clientkeyex_replace_with_serverkeyex_cb,clientkeyex_replace_with_serverkeyex=True)
         def eap_tls_eapTlsHelloReq_pkt_delay():
             tls._eapTlsHelloReq()
@@ -2025,7 +2026,7 @@
             tls.tlsEventTable.EVT_EAP_START
             tls._eapIdReq()
             tls.tlsEventTable.EVT_EAP_ID_REQ
-            log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
+            log_test.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
             t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
             t.start()
         reactor.callLater(0, eap_tls_verify, df)
@@ -2039,11 +2040,11 @@
            pcap_file_path = "/root/test/src/test/netCondition/tls_auth_exhange_packets_Radius_server_packets_only.pcap"
         elif error_pkt:
            pcap_file_path = "/root/test/src/test/netCondition/error_tls_auth_exhange_packets_Radius_server_packets_only.pcap"
-        log.info('Started replaying pcap file packets on docker0 interface using tcprelay linux command')
+        log_test.info('Started replaying pcap file packets on docker0 interface using tcprelay linux command')
         time.sleep(0.4)
         sendp(rdpcap(pcap_file_path), iface="eth0", loop=0, inter=1)
         time.sleep(5)
-        log.info('Replayed pcap file packets on docker0 interface')
+        log_test.info('Replayed pcap file packets on docker0 interface')
 
     def tcpreplay_radius_server_error_packets_from_pcap_file(self, pcap_file_path =None, error_pkt = None):
         #default radius server packets in path in test/netCondition/xxx.pcap file
@@ -2051,7 +2052,7 @@
            pcap_file_path = pcap_file_path
         else:
            pcap_file_path = "/root/test/src/test/netCondition/error_tls_auth_exhange_packets_Radius_server_packets_only.pcap"
-        log.info('Started replaying pcap file error packets on docker0 interface using tcprelay linux command')
+        log_test.info('Started replaying pcap file error packets on docker0 interface using tcprelay linux command')
         time.sleep(0.4)
         sendp(rdpcap(pcap_file_path), iface="eth0", loop=0, inter=1)
         time.sleep(5)
@@ -2064,7 +2065,7 @@
            pcap_file_path = pcap_file_path
         else:
            pcap_file_path = "/root/test/src/test/netCondition/tls_auth_exhange_packets_Radius_server_packets_only.pcap"
-        log.info('Started corrupting tls server packet no = {}'.format(pkt_no))
+        log_test.info('Started corrupting tls server packet no = {}'.format(pkt_no))
         radius_server_pkts = rdpcap(pcap_file_path)
         error_server_pkt = radius_server_pkts[pkt_no]
         if pkt_no == 0:
@@ -2152,7 +2153,7 @@
         wrpcap("/root/test/src/test/netCondition/error_tls_auth_exhange_packets_Radius_server_packets_only.pcap", radius_server_pkts)
         pcap_file_path = "/root/test/src/test/netCondition/error_tls_auth_exhange_packets_Radius_server_packets_only.pcap"
 
-        log.info('Done corrupting tls server packet no = {} send back filepath along with file name'.format(pkt_no))
+        log_test.info('Done corrupting tls server packet no = {} send back filepath along with file name'.format(pkt_no))
         return pcap_file_path
 
     @deferred(TEST_TIMEOUT_DELAY-50)
@@ -2181,10 +2182,10 @@
                 tls._eapTlsChangeCipherSpec()
                 tls._eapTlsFinished()
                 if tls.failTest == False:
-                   log.info('Authentication successful for user')
+                   log_test.info('Authentication successful for user')
                    return 'success'
                 else:
-                   log.info('Authentication not successful for user')
+                   log_test.info('Authentication not successful for user')
                    return 'failed'
            thread_client = threading.Thread(target=lambda q, arg1: q.put(tls_client_packets(arg1)), args=(que, 'start'))
            thread_radius = threading.Thread(target = Container.pause_container, args = (radius_image,delay))
@@ -2215,7 +2216,7 @@
             time.sleep(0.2)
             randomDelay = randint(10,300)
             def tls_invalid_server_packets_scenario_cb():
-                log.info('TLS authentication failed with {}'.format(msg))
+                log_test.info('TLS authentication failed with {}'.format(msg))
             tls = TLSAuthTest(fail_cb = tls_invalid_server_packets_scenario_cb, src_mac = 'random')
             tls._eapSetup()
             tls.tlsEventTable.EVT_EAP_SETUP
@@ -2228,10 +2229,10 @@
             tls._eapTlsChangeCipherSpec()
             tls._eapTlsFinished()
             if tls.failTest == True:
-               log.info('Authentication not successful for user')
+               log_test.info('Authentication not successful for user')
                return 'failed'
             else:
-               log.info('Authentication successful for user')
+               log_test.info('Authentication successful for user')
                return 'success'
         def tcpreplay_radius_server_error_packets_from_pcap_file(pcap_file_path =None, error_pkt = None):
             #default radius server packets in path in test/netCondition/xxx.pcap file
@@ -2240,7 +2241,7 @@
             else:
                pcap_file_path = "/root/test/src/test/netCondition/error_tls_auth_exhange_packets_Radius_server_packets_only.pcap"
 
-            log.info('Started replaying pcap file error packets on docker0 interface using tcprelay linux command')
+            log_test.info('Started replaying pcap file error packets on docker0 interface using tcprelay linux command')
             time.sleep(0.4)
             sendp(rdpcap(pcap_file_path), iface="eth0", loop=0, inter=1)
             time.sleep(5)
diff --git a/src/test/onosCli/onosCliTest.py b/src/test/onosCli/onosCliTest.py
index 731cf32..4fa20f7 100644
--- a/src/test/onosCli/onosCliTest.py
+++ b/src/test/onosCli/onosCliTest.py
@@ -1,12 +1,12 @@
-# 
+#
 # Copyright 2016-present Ciena Corporation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 # http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,7 +20,7 @@
 from nose.tools import *
 from onosclidriver import OnosCliDriver
 from OnosCtrl import OnosCtrl
-from scapy.all import *
+from CordTestUtils import log_test as log
 
 log.setLevel('INFO')
 
diff --git a/src/test/proxyarp/proxyarpTest.py b/src/test/proxyarp/proxyarpTest.py
index 836cb3b..9df4a0e 100644
--- a/src/test/proxyarp/proxyarpTest.py
+++ b/src/test/proxyarp/proxyarpTest.py
@@ -16,7 +16,7 @@
 import unittest
 from nose.tools import *
 from scapy.all import *
-from CordTestUtils import get_mac
+from CordTestUtils import get_mac, log_test
 from OnosCtrl import OnosCtrl
 from OltConfig import OltConfig
 from OnosFlowCtrl import OnosFlowCtrl
@@ -29,7 +29,7 @@
 import time
 import os
 import json
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 
 class proxyarp_exchange(unittest.TestCase):
@@ -99,7 +99,7 @@
             index += 1
             config_cmds = ('ifconfig {} 0'.format(iface), )
             for cmd in config_cmds:
-		log.info('host unload command %s' % cmd)
+		log_test.info('host unload command %s' % cmd)
                 os.system(cmd)
 
     @classmethod
@@ -124,7 +124,7 @@
 	for host in host_config:
 	    status, code = OnosCtrl.host_config(host)
 	    if status is False:
-                log.info('JSON request returned status %d' %code)
+                log_test.info('JSON request returned status %d' %code)
                 assert_equal(status, True)
 
     @classmethod
@@ -191,18 +191,18 @@
         return proxyarp_configs
 
     def proxyarp_arpreply_verify(self, ingress, hostip, hostmac, PositiveTest=True):
-	log.info('verifying arp reply for host ip %s host mac %s on interface %s'%(hostip ,hostmac ,self.port_map[ingress]))
+	log_test.info('verifying arp reply for host ip %s host mac %s on interface %s'%(hostip ,hostmac ,self.port_map[ingress]))
 	self.success = False
         def recv_task():
             def recv_cb(pkt):
-                log.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
+                log_test.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
                 self.success = True if PositiveTest == True else False
             sniff(count=1, timeout=2, lfilter = lambda p: ARP in p and p[ARP].op == 2 and p[ARP].hwsrc == hostmac,
                   prn = recv_cb, iface = self.port_map[ingress])
         t = threading.Thread(target = recv_task)
         t.start()
         pkt = (Ether(dst = 'ff:ff:ff:ff:ff:ff')/ARP(op=1,pdst=hostip))
-        log.info('sending arp request  for dest ip %s on interface %s' %
+        log_test.info('sending arp request  for dest ip %s on interface %s' %
                  (hostip, self.port_map[ingress]))
         sendp( pkt, count = 10, iface = self.port_map[ingress])
         t.join()
@@ -213,10 +213,10 @@
 
     def __proxyarp_hosts_verify(self, hosts = 1,PositiveTest = True):
         _,_,hosts_config = self.proxyarp_config(hosts = hosts)
-	log.info('\nhosts_config %s and its type %s'%(hosts_config,type(hosts_config)))
+	log_test.info('\nhosts_config %s and its type %s'%(hosts_config,type(hosts_config)))
         self.cliEnter()
         connected_hosts = json.loads(self.cli.hosts(jsonFormat = True))
-        log.info('Discovered hosts: %s' %connected_hosts)
+        log_test.info('Discovered hosts: %s' %connected_hosts)
         #We read from cli if we expect less number of routes to avoid cli timeouts
         if hosts <= 10000:
             assert_equal(len(connected_hosts), hosts)
@@ -243,12 +243,12 @@
 	for hostip, hostmac in hosts_config:
 	    self.proxyarp_arpreply_verify(ingress,hostip,hostmac,PositiveTest = True)
 	    time.sleep(1)
-	log.info('Deactivating proxyarp  app and expecting not to get arp reply from ONOS')
+	log_test.info('Deactivating proxyarp  app and expecting not to get arp reply from ONOS')
 	self.proxyarp_activate(deactivate = True)
 	for hostip, hostmac in hosts_config:
 	    self.proxyarp_arpreply_verify(ingress,hostip,hostmac,PositiveTest = False)
 	    time.sleep(1)
-	log.info('activating proxyarp  app and expecting to get arp reply from ONOS')
+	log_test.info('activating proxyarp  app and expecting to get arp reply from ONOS')
 	self.proxyarp_activate(deactivate = False)
 	for hostip, hostmac in hosts_config:
             self.proxyarp_arpreply_verify(ingress,hostip,hostmac,PositiveTest = True)
@@ -263,10 +263,10 @@
 	new_host[2] = str(int(new_host[2])+1)
 	new_host = '.'.join(new_host)
 	new_mac =  RandMAC()._fix()
-	log.info('verifying arp reply for host ip %s on interface %s'%(new_host,self.port_map[ingress]))
+	log_test.info('verifying arp reply for host ip %s on interface %s'%(new_host,self.port_map[ingress]))
 	res=srp1(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(op=1,pdst=new_host),timeout=2,iface=self.port_map[ingress])
 	assert_equal(res, None)
-	log.info('arp reply not seen for host ip %s on interface %s as expected'%(new_host,self.port_map[ingress]))
+	log_test.info('arp reply not seen for host ip %s on interface %s as expected'%(new_host,self.port_map[ingress]))
 	hosts = hosts + 1
 	_,_,hosts_config = self.proxyarp_config(hosts = hosts)
 	for host in hosts_config:
@@ -281,7 +281,7 @@
             self.proxyarp_arpreply_verify(ingress,hostip,hostmac,PositiveTest = True)
             time.sleep(1)
 	host_mac = hosts_config[0][1]
-        log.info('removing host entry %s' % host_mac)
+        log_test.info('removing host entry %s' % host_mac)
         self.cliEnter()
         hostentries = json.loads(self.cli.hosts(jsonFormat = True))
         for host in hostentries:
@@ -316,14 +316,14 @@
             ingress,hostmac,hostip = r[0],r[1],r[2]
             def mac_recv_task():
                 def recv_cb(pkt):
-		    log.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
+		    log_test.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
                     success_dir[current_thread().name] = True
 		sniff(count=1, timeout=5,lfilter = lambda p: ARP in p and p[ARP].op == 2 and p[ARP].hwsrc == hostmac,
                     prn = recv_cb, iface = self.port_map[ingress])
 	    t = threading.Thread(target = mac_recv_task)
 	    t.start()
 	    pkt = (Ether(dst = 'ff:ff:ff:ff:ff:ff')/ARP(op=1,pdst= hostip))
-            log.info('sending arp request  for dest ip %s on interface %s' %
+            log_test.info('sending arp request  for dest ip %s on interface %s' %
                  (hostip,self.port_map[ingress]))
             sendp(pkt, count = 10,iface = self.port_map[ingress])
             t.join()
@@ -354,14 +354,14 @@
             ingress,hostmac,hostip = r[0],r[1],r[2]
             def mac_recv_task():
                 def recv_cb(pkt):
-                    log.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
+                    log_test.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
                     success_dir[current_thread().name] = True
                 sniff(count=1, timeout=5,lfilter = lambda p: ARP in p and p[ARP].op == 2 and p[ARP].hwsrc == hostmac,
                     prn = recv_cb, iface = self.port_map[ingress])
             t = threading.Thread(target = mac_recv_task)
             t.start()
             pkt = (Ether(dst = 'ff:ff:ff:ff:ff:ff')/ARP(op=1,pdst= hostip))
-            log.info('sending arp request  for dest ip %s on interface %s' %
+            log_test.info('sending arp request  for dest ip %s on interface %s' %
                  (hostip,self.port_map[ingress]))
             sendp(pkt, count = 10,iface = self.port_map[ingress])
             t.join()
@@ -426,7 +426,7 @@
             ingress,hostmac,hostip = r[0],r[1],r[2]
             def mac_recv_task():
                 def recv_cb(pkt):
-                    log.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
+                    log_test.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
                     success_dir[current_thread().name] = True
 		    replied_hosts.append(hostip)
                 sniff(count=1, timeout=5,lfilter = lambda p: ARP in p and p[ARP].op == 2 and p[ARP].psrc == hostip,
@@ -434,7 +434,7 @@
             t = threading.Thread(target = mac_recv_task)
             t.start()
             pkt = (Ether(dst = 'ff:ff:ff:ff:ff:ff')/ARP(op=1,pdst= hostip))
-            log.info('sending arp request  for dest ip %s on interface %s' %
+            log_test.info('sending arp request  for dest ip %s on interface %s' %
                  (hostip,self.port_map[ingress]))
             sendp(pkt, count = 10,iface = self.port_map[ingress])
             t.join()
diff --git a/src/test/subscriber/subscriberTest.py b/src/test/subscriber/subscriberTest.py
index a79a3a4..c1545e4 100644
--- a/src/test/subscriber/subscriberTest.py
+++ b/src/test/subscriber/subscriberTest.py
@@ -17,7 +17,6 @@
 from nose.tools import *
 from nose.twistedtools import reactor, deferred
 from twisted.internet import defer
-from scapy.all import *
 import time, monotonic
 import os, sys
 import tempfile
@@ -35,6 +34,7 @@
 from CordContainer import *
 from CordTestServer import cord_test_radius_restart
 from CordLogger import CordLogger
+from CordTestUtils import log_test as log
 import copy
 log.setLevel('INFO')
 DEFAULT_NO_CHANNELS = 1
diff --git a/src/test/tls/tlsTest.py b/src/test/tls/tlsTest.py
index f659f0f..6ac5e6b 100644
--- a/src/test/tls/tlsTest.py
+++ b/src/test/tls/tlsTest.py
@@ -22,10 +22,11 @@
 from EapTLS import TLSAuthTest
 from OnosCtrl import OnosCtrl
 from CordLogger import CordLogger
+from CordTestUtils import log_test
 from scapy.all import *
 from scapy_ssl_tls.ssl_tls import *
 from scapy_ssl_tls.ssl_tls_crypto import *
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 class eap_auth_exchange(CordLogger):
 
@@ -90,7 +91,7 @@
     def onos_load_config(self, config):
         status, code = OnosCtrl.config(config)
         if status is False:
-            log.info('Configure request for AAA returned status %d' %code)
+            log_test.info('Configure request for AAA returned status %d' %code)
             assert_equal(status, True)
             time.sleep(3)
 
@@ -109,7 +110,7 @@
         df = defer.Deferred()
         def eap_tls_no_cert(df):
             def tls_no_cert_cb():
-                log.info('TLS authentication failed with no certificate')
+                log_test.info('TLS authentication failed with no certificate')
             tls = TLSAuthTest(fail_cb = tls_no_cert_cb, client_cert = '')
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -122,7 +123,7 @@
         df = defer.Deferred()
         def eap_tls_invalid_cert(df):
             def tls_invalid_cert_cb():
-                log.info('TLS authentication failed with invalid certificate')
+                log_test.info('TLS authentication failed with invalid certificate')
 
             tls = TLSAuthTest(fail_cb = tls_invalid_cert_cb,
                               client_cert = self.CLIENT_CERT_INVALID)
@@ -149,7 +150,7 @@
         df = defer.Deferred()
         def eap_tls_invalid_session_id(df):
             def tls_invalid_session_id_cb():
-                log.info('TLS authentication failed with invalid session  id')
+                log_test.info('TLS authentication failed with invalid session  id')
             tls = TLSAuthTest(fail_cb = tls_invalid_session_id_cb,session_id = 12345, session_id_length = 1)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -162,9 +163,9 @@
         df = defer.Deferred()
         def eap_tls_invalid_gmt_unix_time(df):
             def eap_tls_invalid_gmt_unix_time_cb():
-                log.info('TLS authentication failed with invalid gmt_unix_time in Client Hello Packet')
+                log_test.info('TLS authentication failed with invalid gmt_unix_time in Client Hello Packet')
             for i in [0,7265,98758,23627238]:
-                log.info("\nExecuting test case with gmt_unix_time value is set to %d"%i)
+                log_test.info("\nExecuting test case with gmt_unix_time value is set to %d"%i)
                 tls = TLSAuthTest(fail_cb = eap_tls_invalid_gmt_unix_time_cb, gmt_unix_time = i)
                 tls.runTest()
                 assert_equal(tls.failTest, True)
@@ -177,7 +178,7 @@
         df = defer.Deferred()
         def eap_tls_invalid_content_type(df):
             def tls_invalid_content_type_cb():
-                log.info('TLS authentication failed with invalid content type in TLSContentType packet')
+                log_test.info('TLS authentication failed with invalid content type in TLSContentType packet')
             tls = TLSAuthTest(fail_cb = tls_invalid_content_type_cb, invalid_content_type = 24)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -190,7 +191,7 @@
         df = defer.Deferred()
         def eap_tls_invalid_record_fragment_length(df):
             def eap_tls_invalid_record_fragment_length_cb():
-                log.info('TLS authentication failed with invalid fragment length field in TLSRecord packet')
+                log_test.info('TLS authentication failed with invalid fragment length field in TLSRecord packet')
             tls = TLSAuthTest(fail_cb = eap_tls_invalid_record_fragment_length_cb, record_fragment_length = 17384)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -204,7 +205,7 @@
         df = defer.Deferred()
         def eap_tls_with_invalid_id_in_identifier_response_packet(df):
             def tls_with_invalid_id_in_identifier_response_packet_cb():
-                log.info('TLS authentication failed with invalid id in identifier packet')
+                log_test.info('TLS authentication failed with invalid id in identifier packet')
             tls = TLSAuthTest(fail_cb = tls_with_invalid_id_in_identifier_response_packet_cb,
                               id_mismatch_in_identifier_response_packet = True)
             tls.runTest()
@@ -219,7 +220,7 @@
         df = defer.Deferred()
         def eap_tls_with_invalid_id_in_client_hello_packet(df):
             def tls_with_invalid_id_in_client_hello_packet_cb():
-                log.info('TLS authentication failed with invalid id in client hello packet')
+                log_test.info('TLS authentication failed with invalid id in client hello packet')
             tls = TLSAuthTest(fail_cb = tls_with_invalid_id_in_client_hello_packet_cb,
                               id_mismatch_in_client_hello_packet = True)
             tls.runTest()
@@ -233,7 +234,7 @@
         df = defer.Deferred()
         def eap_tls_without_sending_client_hello(df):
             def tls_without_sending_client_hello_cb():
-                log.info('TLS authentication failed with not sending client hello')
+                log_test.info('TLS authentication failed with not sending client hello')
             tls = TLSAuthTest(fail_cb = tls_without_sending_client_hello_cb,
                               dont_send_client_hello = True)
             tls.runTest()
@@ -247,7 +248,7 @@
         df = defer.Deferred()
         def eap_tls_aaa_app_deactivate(df):
             def tls_aaa_app_deactivate_cb():
-                log.info('TLS authentication failed with aaa app deactivated in ONOS')
+                log_test.info('TLS authentication failed with aaa app deactivated in ONOS')
             tls = TLSAuthTest(fail_cb = tls_aaa_app_deactivate_cb)
             self.onos_ctrl.deactivate()
             tls.runTest()
@@ -263,7 +264,7 @@
         df = defer.Deferred()
         def eap_tls_incorrect_cipher_suite_length_field(df):
             def tls_incorrect_cipher_suite_length_field_cb():
-                log.info('TLS authentication failed with incorrect cipher suite length field in client hello packet')
+                log_test.info('TLS authentication failed with incorrect cipher suite length field in client hello packet')
             tls = TLSAuthTest(fail_cb = tls_incorrect_cipher_suite_length_field_cb, cipher_suites_length = 0)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -277,7 +278,7 @@
         df = defer.Deferred()
         def eap_tls_incorrect_compression_methods_length_field(df):
             def tls_incorrect_compression_methods_length_field_cb():
-                log.info('TLS authentication failed with incorrect compression methods length field in client hello packet')
+                log_test.info('TLS authentication failed with incorrect compression methods length field in client hello packet')
             tls = TLSAuthTest(fail_cb = tls_incorrect_compression_methods_length_field_cb, compression_methods_length=1,compression_methods=TLSCompressionMethod.LZS)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -291,7 +292,7 @@
         df = defer.Deferred()
         def eap_tls_invalid_source_mac_broadcast(df):
             def tls_invalid_source_mac_broadcast_cb():
-                log.info('TLS authentication failed with invalid source mac as broadcast in EAPOL packet')
+                log_test.info('TLS authentication failed with invalid source mac as broadcast in EAPOL packet')
             tls = TLSAuthTest(fail_cb = tls_invalid_source_mac_broadcast_cb, src_mac='bcast')
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -305,7 +306,7 @@
         df = defer.Deferred()
         def eap_tls_invalid_source_mac_multicast(df):
             def tls_invalid_source_mac_multicast_cb():
-                log.info('TLS authentication failed with invalid source mac as multicast in EAPOL packet')
+                log_test.info('TLS authentication failed with invalid source mac as multicast in EAPOL packet')
             tls = TLSAuthTest(fail_cb = tls_invalid_source_mac_multicast_cb, src_mac='mcast')
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -319,7 +320,7 @@
         df = defer.Deferred()
         def eap_tls_invalid_source_mac_zero(df):
             def tls_invalid_source_mac_zero_cb():
-                log.info('TLS authentication failed with invalid source mac as zero in EAPOL packet')
+                log_test.info('TLS authentication failed with invalid source mac as zero in EAPOL packet')
             tls = TLSAuthTest(fail_cb = tls_invalid_source_mac_zero_cb, src_mac='zeros')
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -333,7 +334,7 @@
         df = defer.Deferred()
         def eap_tls_restart_radius_server(df):
             def tls_restart_radius_server_cb():
-                log.info('TLS authentication failed with  radius server down in middle of authentication process')
+                log_test.info('TLS authentication failed with  radius server down in middle of authentication process')
             tls = TLSAuthTest(fail_cb = tls_restart_radius_server_cb, restart_radius=True)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -346,7 +347,7 @@
         df = defer.Deferred()
         def eap_tls_incorrect_handshake_type_client_hello(df):
             def tls_incorrect_handshake_type_client_hello_cb():
-                log.info('TLS authentication failed with incorrect handshake type in client hello packet')
+                log_test.info('TLS authentication failed with incorrect handshake type in client hello packet')
             tls = TLSAuthTest(fail_cb = tls_incorrect_handshake_type_client_hello_cb, invalid_client_hello_handshake_type=True)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -360,7 +361,7 @@
         df = defer.Deferred()
         def eap_tls_incorrect_handshake_type_certificate_request(df):
             def tls_incorrect_handshake_type_certificate_request_cb():
-                log.info('TLS authentication failed with incorrect handshake type in client certificate request packet')
+                log_test.info('TLS authentication failed with incorrect handshake type in client certificate request packet')
             tls = TLSAuthTest(fail_cb = tls_incorrect_handshake_type_certificate_request_cb, invalid_cert_req_handshake=True)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -374,7 +375,7 @@
         df = defer.Deferred()
         def eap_tls_incorrect_tlsrecord_certificate_request(df):
             def tls_incorrect_tlsrecord_certificate_request_cb():
-                log.info('TLS authentication failed with incorrect tlsrecord type  in certificate request packet')
+                log_test.info('TLS authentication failed with incorrect tlsrecord type  in certificate request packet')
             tls = TLSAuthTest(fail_cb = tls_incorrect_tlsrecord_certificate_request_cb, incorrect_tlsrecord_type_cert_req=True)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -388,7 +389,7 @@
         df = defer.Deferred()
         def eap_tls_invalid_handshake_length_client_hello(df):
             def tls_invalid_handshake_length_client_hello_cb():
-                log.info('TLS authentication failed with invalid handshake length in client hello packet')
+                log_test.info('TLS authentication failed with invalid handshake length in client hello packet')
             tls = TLSAuthTest(fail_cb = tls_invalid_handshake_length_client_hello_cb, invalid_client_hello_handshake_length=True)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -401,7 +402,7 @@
         df = defer.Deferred()
         def eap_tls_clientkeyex_replace_with_serverkeyex(df):
             def tls_clientkeyex_replace_with_serverkeyex_cb():
-                log.info('TLS authentication failed with client key exchange replaced with server key exchange')
+                log_test.info('TLS authentication failed with client key exchange replaced with server key exchange')
             tls = TLSAuthTest(fail_cb = tls_clientkeyex_replace_with_serverkeyex_cb,clientkeyex_replace_with_serverkeyex=True)
             tls.runTest()
             assert_equal(tls.failTest, True)
@@ -417,7 +418,7 @@
             for i in xrange(1000):
                 tls = TLSAuthTest(src_mac = 'random')
                 tls.runTest()
-		log.info('Authentication successfull for user %d'%i)
+		log_test.info('Authentication successfull for user %d'%i)
             df.callback(0)
         reactor.callLater(0, eap_tls_1k_with_diff_mac, df)
         return df
@@ -430,7 +431,7 @@
             for i in xrange(5000):
                 tls = TLSAuthTest(src_mac = 'random')
                 tls.runTest()
-                log.info('Authentication successfull for user %d'%i)
+                log_test.info('Authentication successfull for user %d'%i)
             df.callback(0)
         reactor.callLater(0, eap_tls_5k_with_diff_mac, df)
         return df
diff --git a/src/test/utils/ACL.py b/src/test/utils/ACL.py
index ecb159e..d54692f 100644
--- a/src/test/utils/ACL.py
+++ b/src/test/utils/ACL.py
@@ -19,10 +19,10 @@
 import logging
 logging.getLogger('scapy.runtime').setLevel(logging.ERROR)
 from scapy.all import *
-from CordTestUtils import get_mac, get_controller
+from CordTestUtils import get_mac, get_controller, log_test
 from OnosCtrl import OnosCtrl
 from OnosFlowCtrl import OnosFlowCtrl
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 conf.verb = 0 # Disable Scapy verbosity
 conf.checkIPaddr = 0 # Don't check response packets for matching destination IPs
@@ -71,7 +71,7 @@
             resp = requests.post(self.add_acl_rule_url, auth = self.auth, data = json_data)
 	else:
 	    add_acl_rule_url = 'http://%s:8181/onos/v1/acl/rules' %(controller)
-	    log.info('add_acl_rule_acl url is %s'%add_acl_rule_url)
+	    log_test.info('add_acl_rule_acl url is %s'%add_acl_rule_url)
             resp = requests.post(add_acl_rule_url, auth = self.auth, data = json_data)
         return resp.ok, resp.status_code
 
@@ -81,7 +81,7 @@
             resp = requests.get(self.add_acl_rule_url, auth = self.auth)
 	else:
 	    add_acl_rule_url = 'http://%s:8181/onos/v1/acl/rules' %(controller)
-	    log.info('get_acl_rule_url is %s'%add_acl_rule_url)
+	    log_test.info('get_acl_rule_url is %s'%add_acl_rule_url)
 	    resp = requests.get(add_acl_rule_url, auth = self.auth)
         return resp
 
@@ -98,7 +98,7 @@
                 remove_acl_rule_url = 'http://%s:8181/onos/v1/acl/rules/%s' %(cls.controller, id)
 	    else:
 		remove_acl_rule_url = 'http://%s:8181/onos/v1/acl/rules/%s' %(controller, id)
-	log.info('remove_acl_rule_url is %s'%remove_acl_rule_url)
+	log_test.info('remove_acl_rule_url is %s'%remove_acl_rule_url)
         resp = requests.delete(remove_acl_rule_url, auth = cls.auth)
         return resp.ok, resp.status_code
 
diff --git a/src/test/utils/Channels.py b/src/test/utils/Channels.py
index 8266c7e..84d4921 100644
--- a/src/test/utils/Channels.py
+++ b/src/test/utils/Channels.py
@@ -25,8 +25,9 @@
 from McastTraffic import *
 from IGMP import *
 from OnosCtrl import OnosCtrl
+from CordTestUtils import log_test
 from nose.tools import *
-log.setLevel('DEBUG')
+log_test.setLevel('DEBUG')
 
 conf.verb = 0
 
@@ -85,7 +86,7 @@
     def onos_load_config(self, config):
         status, code = OnosCtrl.config(config,controller=self.controller)
         if status is False:
-            log.info('JSON config request returned status %d' %code)
+            log_test.info('JSON config request returned status %d' %code)
         time.sleep(2)
 
     def ssm_table_load(self, groups):
@@ -144,7 +145,7 @@
             for i in range(start, end):
                 if i&255:
                     g = '%s.%s.%s.%s' %((i>>24) &0xff, (i>>16)&0xff, (i>>8)&0xff, i&0xff)
-                    log.debug('Adding group %s' %g)
+                    log_test.debug('Adding group %s' %g)
                     group_addrs.append(g)
                     count += 1
             start = end
@@ -235,10 +236,10 @@
 
     def recv_cb(self, pkt):
         '''Default channel receive callback'''
-        log.debug('Received packet from source %s, destination %s' %(pkt[IP].src, pkt[IP].dst))
+        log_test.debug('Received packet from source %s, destination %s' %(pkt[IP].src, pkt[IP].dst))
         send_time = float(pkt[IP].payload.load)
         recv_time = monotonic.monotonic()
-        log.debug('Packet received in %.3f usecs' %(recv_time - send_time))
+        log_test.debug('Packet received in %.3f usecs' %(recv_time - send_time))
 
     def recv(self, chan, cb = None, count = 1, timeout = 5):
         if chan is None:
diff --git a/src/test/utils/Cluster.py b/src/test/utils/Cluster.py
index 31b6bbb..5e248ec 100644
--- a/src/test/utils/Cluster.py
+++ b/src/test/utils/Cluster.py
@@ -7,7 +7,7 @@
 from Channels import Channels, IgmpChannel
 from subscriberDb import SubscriberDB
 import time, monotonic
-from CordTestUtils import get_mac
+from CordTestUtils import get_mac, log_test
 from OltConfig import OltConfig
 from OnosCtrl import OnosCtrl
 from OnosFlowCtrl import OnosFlowCtrl
@@ -35,7 +35,7 @@
 import random
 import collections
 import requests
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 class cluster_igmp(object):
     V_INF1 = 'veth0'
     V_INF2 = 'veth1'
@@ -84,10 +84,10 @@
     def tearDown(self): pass
 
     def onos_load_config(self, config,controller=None):
-        log.info('onos load config is %s'%config)
+        log_test.info('onos load config is %s'%config)
         status, code = OnosCtrl(self.app).config(config,controller=controller)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         time.sleep(2)
 
@@ -203,9 +203,9 @@
             rx_stats = recvState.group_map[g][1]
             rx = rx_stats.count
             assert_greater(rx, 0)
-            log.info('Receive stats %s for group %s' %(rx_stats, g))
+            log_test.info('Receive stats %s for group %s' %(rx_stats, g))
 
-        log.info('IGMP test verification success')
+        log_test.info('IGMP test verification success')
 
     def igmp_verify_leave(self, igmpStateList, leave_groups):
         sendState, recvState = igmpStateList[0], igmpStateList[1]
@@ -217,12 +217,12 @@
             rx = rx_stats.count
             assert_greater(tx, 0)
             if g not in leave_groups:
-                log.info('Received %d packets for group %s' %(rx, g))
+                log_test.info('Received %d packets for group %s' %(rx, g))
         for g in leave_groups:
             rx = recvState.group_map[g][1].count
             assert_equal(rx, 0)
 
-        log.info('IGMP test verification success')
+        log_test.info('IGMP test verification success')
 
     def mcast_traffic_timer(self):
           self.mcastTraffic.stopReceives()
@@ -239,9 +239,9 @@
               send_time = float(p.payload.load)
               recv_time = monotonic.monotonic()
         except:
-              log.info('Unexpected Payload received: %s' %p.payload.load)
+              log_test.info('Unexpected Payload received: %s' %p.payload.load)
               return 0
-        #log.info( 'Recv in %.6f secs' %(recv_time - send_time))
+        #log_test.info( 'Recv in %.6f secs' %(recv_time - send_time))
         igmpState.update(p.dst, rx = 1, t = recv_time - send_time)
         return 0
 
@@ -260,7 +260,7 @@
         pkt = ip_pkt/igmp
         IGMPv3.fixup(pkt)
         sendp(pkt, iface=iface)
-        log.info('igmp join packet is %s'%pkt.show())
+        log_test.info('igmp join packet is %s'%pkt.show())
         if delay != 0:
             time.sleep(delay)
 
@@ -301,7 +301,7 @@
         self.onos_aaa_config(controller=controller)
 
     def onos_aaa_config(self,controller=None):
-	log.info('controller in onos_aaa_config is %s'%controller)
+	log_test.info('controller in onos_aaa_config is %s'%controller)
         aaa_dict = {'apps' : { 'org.opencord.aaa' : { 'AAA' : { 'radiusSecret': 'radius_password',
                                                                 'radiusIp': '172.17.0.2' } } } }
         radius_ip = os.getenv('ONOS_AAA_IP') or '172.17.0.2'
@@ -311,11 +311,11 @@
         self.onos_load_config(aaa_dict,controller=controller)
 
     def onos_load_config(self, config,controller=None):
-	log.info('controller in onos_load_config is %s'%controller)
-        log.info('onos load config is %s'%config)
+	log_test.info('controller in onos_load_config is %s'%controller)
+        log_test.info('onos load config is %s'%config)
         status, code = OnosCtrl(self.eap_app).config(config,controller=controller)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         time.sleep(2)
 
@@ -503,7 +503,7 @@
         for host in host_config:
             status, code = OnosCtrl(cls.app).host_config(host,onos_ip=controller)
             if status is False:
-                log.info('JSON request returned status %d' %code)
+                log_test.info('JSON request returned status %d' %code)
                 assert_equal(status, True)
 
     @classmethod
@@ -570,18 +570,18 @@
         return proxyarp_configs
 
     def proxyarp_arpreply_verify(self, ingress, hostip, hostmac, PositiveTest=True):
-        #log.info('verifying arp reply for host ip %s host mac %s on interface %s'%(hostip ,hostmac ,self.port_map[ingress]))
+        #log_test.info('verifying arp reply for host ip %s host mac %s on interface %s'%(hostip ,hostmac ,self.port_map[ingress]))
         self.success = False
         def recv_task():
             def recv_cb(pkt):
-                log.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
+                log_test.info('Arp Reply seen with source Mac is %s' %(pkt[ARP].hwsrc))
                 self.success = True if PositiveTest == True else False
             sniff(count=1, timeout=2, lfilter = lambda p: ARP in p and p[ARP].op == 2 and p[ARP].hwsrc == hostmac,
                   prn = recv_cb, iface = self.port_map[ingress])
         t = threading.Thread(target = recv_task)
         t.start()
         pkt = (Ether(dst = 'ff:ff:ff:ff:ff:ff')/ARP(op=1,pdst=hostip))
-        log.info('sending arp request  for dest ip %s on interface %s' %
+        log_test.info('sending arp request  for dest ip %s on interface %s' %
                  (hostip, self.port_map[ingress]))
         sendp( pkt, count = 10, iface = self.port_map[ingress])
         t.join()
@@ -591,12 +591,12 @@
             assert_equal(self.success, False)
 
     def proxyarp_hosts_verify(self, hosts = 1,PositiveTest = True):
-	log.info('verifying arp reply for host ip host mac on interface %s'%(self.port_map[2]))
+	log_test.info('verifying arp reply for host ip host mac on interface %s'%(self.port_map[2]))
         _,_,hosts_config = self.proxyarp_config(hosts = hosts)
-        log.info('\nhosts_config %s and its type %s'%(hosts_config,type(hosts_config)))
+        log_test.info('\nhosts_config %s and its type %s'%(hosts_config,type(hosts_config)))
         self.cliEnter()
         connected_hosts = json.loads(self.cli.hosts(jsonFormat = True))
-        log.info('Discovered hosts: %s' %connected_hosts)
+        log_test.info('Discovered hosts: %s' %connected_hosts)
         #We read from cli if we expect less number of routes to avoid cli timeouts
         if hosts <= 10000:
             assert_equal(len(connected_hosts), hosts)
@@ -694,7 +694,7 @@
     def onos_load_config(cls, config,controller=None):
         status, code = OnosCtrl.config(config,controller=controller)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
 
     @classmethod
@@ -713,13 +713,13 @@
 	    #iface = cls.port_map[index]
 	    mac = RandMAC()._fix()
             #port = num + 1 if num < cls.MAX_PORTS - 1 else cls.MAX_PORTS - 1
-	    log.info('creating host with ip %s and mac %s'%(host,mac))
+	    log_test.info('creating host with ip %s and mac %s'%(host,mac))
             hosts_dict[host] = {'mac':mac, 'vlan':'none', 'ipAddresses':[host], 'location':{ 'elementId' : '{}'.format(cls.device_id), 'port': index}}
 	    index += 1
 	for host in hosts_dict.values():
             status, code = OnosCtrl.host_config(host,onos_ip=controller)
             if status is False:
-                log.info('JSON request returned status %d' %code)
+                log_test.info('JSON request returned status %d' %code)
                 return False
         return True
 
@@ -732,7 +732,7 @@
         for host,_ in peer_info:
             iface = cls.port_map[index]
             index += 1
-            log.info('Assigning ip %s to interface %s' %(host, iface))
+            log_test.info('Assigning ip %s to interface %s' %(host, iface))
             config_cmds = ( 'ifconfig {} 0'.format(iface),
                             'ifconfig {0} {1}'.format(iface, host),
                             'arping -I {0} {1} -c 2'.format(iface, host),
@@ -762,7 +762,7 @@
         else:
             config = network_cfg
 	cfg = json.dumps(config)
-        log.info('Restarting ONOS with new network configuration %s'%config)
+        log_test.info('Restarting ONOS with new network configuration %s'%config)
         #return cord_test_onos_restart(config = config)
 	with open('{}/network-cfg.json'.format(cls.onos_config_path), 'w') as f:
             f.write(cfg)
@@ -770,7 +770,7 @@
 
     @classmethod
     def start_quagga(cls, networks = 4, peer_address = None, router_address = None):
-        log.info('Restarting Quagga container with configuration for %d networks' %(networks))
+        log_test.info('Restarting Quagga container with configuration for %d networks' %(networks))
         config = cls.generate_conf(networks = networks, peer_address = peer_address, router_address = router_address)
         if networks <= 10000:
             boot_delay = 25
@@ -864,7 +864,7 @@
         cls.network_list = network_list
         cls.network_mask = network_mask
         zebra_routes = '\n'.join(net_list)
-        #log.info('Zebra routes: \n:%s\n' %cls.zebra_conf + zebra_routes)
+        #log_test.info('Zebra routes: \n:%s\n' %cls.zebra_conf + zebra_routes)
         return cls.zebra_conf + zebra_routes
 
     @classmethod
@@ -897,7 +897,7 @@
         self.start_sending = True
         def recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
                 self.success = True if positive_test else False
             sniff(count=count, timeout=timeout,
                   lfilter = lambda p: IP in p and p[IP].dst == dst_ip and p[IP].src == src_ip,
@@ -909,7 +909,7 @@
         L2 = Ether(src = src_mac, dst = dst_mac)
         L3 = IP(src = src_ip, dst = dst_ip)
         pkt = L2/L3
-        log.info('Sending a packet with dst ip %s, dst mac %s on port %s to verify if flows are correct' %
+        log_test.info('Sending a packet with dst ip %s, dst mac %s on port %s to verify if flows are correct' %
                  (dst_ip, dst_mac, self.port_map[egress]))
         while self.start_sending is True:
             sendp(pkt, count=50, iface = self.port_map[egress])
@@ -959,11 +959,11 @@
         self.cliEnter(controller=controller)
         ##Now verify
         hosts = json.loads(self.cli.hosts(jsonFormat = True))
-        log.info('Discovered hosts: %s' %hosts)
+        log_test.info('Discovered hosts: %s' %hosts)
         ##We read from cli if we expect less number of routes to avoid cli timeouts
         if networks <= 10000:
             routes = json.loads(self.cli.routes(jsonFormat = True))
-            #log.info('Routes: %s' %routes)
+            #log_test.info('Routes: %s' %routes)
             if start_network is not None:
                if start_network.split('/')[1] is 24:
                   assert_equal(len(routes['routes4']), networks)
@@ -975,7 +975,7 @@
                assert_equal(len(routes['routes4']), 0)
             flows = json.loads(self.cli.flows(jsonFormat = True))
             flows = filter(lambda f: f['flows'], flows)
-            #log.info('Flows: %s' %flows)
+            #log_test.info('Flows: %s' %flows)
             assert_not_equal(len(flows), 0)
         if invalid_peers is None:
             self.vrouter_traffic_verify()
@@ -990,11 +990,11 @@
             self.vrouter_traffic_verify(positive_test = False)
             self.network_list = network_list_backup
         if deactivate_activate_vrouter is True:
-            log.info('Deactivating vrouter app in ONOS controller for negative scenario')
+            log_test.info('Deactivating vrouter app in ONOS controller for negative scenario')
             self.vrouter_activate(deactivate = True)
             #routes = json.loads(self.cli.routes(jsonFormat = False, cmd_exist = False))
             #assert_equal(len(routes['routes4']), 'Command not found')
-            log.info('Activating vrouter app again in ONOS controller for negative scenario')
+            log_test.info('Activating vrouter app again in ONOS controller for negative scenario')
             self.vrouter_activate(deactivate = False)
             routes = json.loads(self.cli.routes(jsonFormat = True))
             assert_equal(len(routes['routes4']), networks)
@@ -1004,7 +1004,7 @@
 
     def vrouter_network_verify_negative(self, networks, peers = 1):
         ##Stop quagga. Test traffic again to see if flows were removed
-        log.info('Stopping Quagga container')
+        log_test.info('Stopping Quagga container')
         cord_test_quagga_stop()
         if networks <= 10000:
             routes = json.loads(self.cli.routes(jsonFormat = True))
@@ -1012,14 +1012,14 @@
             if routes and routes.has_key('routes4'):
                 assert_equal(len(routes['routes4']), 0)
         self.vrouter_traffic_verify(positive_test = False)
-        log.info('OVS flows have been removed successfully after Quagga was stopped')
+        log_test.info('OVS flows have been removed successfully after Quagga was stopped')
         self.start_quagga(networks = networks)
         ##Verify the flows again after restarting quagga back
         if networks <= 10000:
             routes = json.loads(self.cli.routes(jsonFormat = True))
             assert_equal(len(routes['routes4']), networks)
         self.vrouter_traffic_verify()
-        log.info('OVS flows have been successfully reinstalled after Quagga was restarted')
+        log_test.info('OVS flows have been successfully reinstalled after Quagga was restarted')
 
     def quagga_shell(self, cmd):
         shell_cmds = ('vtysh', '"conf t"', '"{}"'.format(cmd))
@@ -1055,7 +1055,7 @@
         if not cls.port_map:
             cls.port_map = g_subscriber_port_map
         time.sleep(3)
-        log.info('port_map = %s'%cls.port_map[1] )
+        log_test.info('port_map = %s'%cls.port_map[1] )
 
     @classmethod
     def tearDownClass(cls):
@@ -1069,12 +1069,12 @@
         assert_equal(status, True)
         time.sleep(1)
         #status, _ = ACLTest.remove_acl_rule()
-        #log.info('Start setup')
+        #log_test.info('Start setup')
         #assert_equal(status, True)
 
     def tearDown(self):
         '''Deactivate the acl app'''
-        log.info('Tear down setup')
+        log_test.info('Tear down setup')
         self.CURRENT_PORT_NUM = 4
 
     def cliEnter(self):
@@ -1098,7 +1098,7 @@
             egress_iface_num = cls.egress_iface
         for ip,_ in dstHostIpMac:
             egress = cls.port_map[egress_iface_num]
-            log.info('Assigning ip %s to interface %s' %(ip, egress))
+            log_test.info('Assigning ip %s to interface %s' %(ip, egress))
             config_cmds_egress = ( 'ifconfig {} 0'.format(egress),
                                    'ifconfig {0} up'.format(egress),
                                    'ifconfig {0} {1}'.format(egress, ip),
@@ -1140,7 +1140,7 @@
         self.start_sending = True
         def recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
                 self.success = True if positive_test else False
             sniff(count=count, timeout=timeout,
                   lfilter = lambda p: IP in p and p[IP].dst == dstIp.split('/')[0] and p[IP].src == srcIp.split('/')[0],
@@ -1152,7 +1152,7 @@
         L2 = Ether(src = srcMac, dst = dstMac)
         L3 = IP(src = srcIp.split('/')[0], dst = dstIp.split('/')[0])
         pkt = L2/L3
-        log.info('Sending a packet with dst ip %s, src ip %s , dst mac %s src mac %s on port %s to verify if flows are correct' %
+        log_test.info('Sending a packet with dst ip %s, src ip %s , dst mac %s src mac %s on port %s to verify if flows are correct' %
                  (dstIp.split('/')[0], srcIp.split('/')[0], dstMac, srcMac, ingress))
         while self.start_sending is True:
             sendp(pkt, count=50, iface = ingress)
@@ -1163,7 +1163,7 @@
     def onos_load_config(cls, config,controller=None):
         status, code = OnosCtrl.config(config,controller=controller)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
 
 class cluster_dhcprelay(object):
@@ -1205,7 +1205,7 @@
 
     @classmethod
     def setUpClass(cls,controller=None):
-	log.info('controller ip in dhcp setup def is %s'%controller)
+	log_test.info('controller ip in dhcp setup def is %s'%controller)
         ''' Activate the dhcprelay app'''
         OnosCtrl(cls.app_dhcp,controller=controller).deactivate()
         time.sleep(3)
@@ -1268,15 +1268,15 @@
     def dhcp_relay_cleanup(cls):
         ##reset the ONOS port configuration back to default
         if cls.onos_restartable is True:
-            log.info('Cleaning up dhcp relay config by restarting ONOS with default network cfg')
+            log_test.info('Cleaning up dhcp relay config by restarting ONOS with default network cfg')
             return cord_test_onos_restart(config = {})
 
     @classmethod
     def onos_load_config(cls, config,controller=None):
-	log.info('loading onos config in controller %s'%controller)
+	log_test.info('loading onos config in controller %s'%controller)
         status, code = OnosCtrl.config(config,controller=controller)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
         time.sleep(2)
 
@@ -1377,7 +1377,7 @@
 
         intf_str = ','.join(intf_list)
         dhcpd_cmd = '/usr/sbin/dhcpd -4 --no-pid -cf {0} -lf {1} {2}'.format(conf_file, lease_file, intf_str)
-        log.info('Starting DHCPD server with command: %s' %dhcpd_cmd)
+        log_test.info('Starting DHCPD server with command: %s' %dhcpd_cmd)
         ret = os.system(dhcpd_cmd)
         assert_equal(ret, 0)
         time.sleep(3)
@@ -1428,7 +1428,7 @@
 
             if only_discover:
                 cip, sip, mac, _ = self.dhcp.only_discover(multiple = True)
-                log.info('Got dhcp client IP %s from server %s for mac %s' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s' %
                         (cip, sip, mac))
             else:
                 cip, sip = self.send_recv(mac, update_seed = True, validate = False)
@@ -1437,7 +1437,7 @@
                 self.ip_count +=1
             elif cip == None:
                 self.failure_count += 1
-                log.info('Failed to get ip')
+                log_test.info('Failed to get ip')
                 if success_rate and self.ip_count > 0:
                         break
 
@@ -1454,7 +1454,7 @@
         if validate:
             assert_not_equal(cip, None)
             assert_not_equal(sip, None)
-        log.info('Got dhcp client IP %s from server %s for mac %s' %
+        log_test.info('Got dhcp client IP %s from server %s for mac %s' %
                 (cip, sip, self.dhcp.get_mac(cip)[0]))
         return cip,sip
 
@@ -1482,7 +1482,7 @@
         except:
             self.tx_intf = self.port_map[self.PORT_TX_DEFAULT]
             self.rx_intf = self.port_map[self.PORT_RX_DEFAULT]
-        log.info('Subscriber %s, rx interface %s, uplink interface %s' %(name, self.rx_intf, self.tx_intf))
+        log_test.info('Subscriber %s, rx interface %s, uplink interface %s' %(name, self.rx_intf, self.tx_intf))
         Channels.__init__(self, num, channel_start = channel_start,
                                    iface = self.rx_intf, iface_mcast = self.tx_intf, mcast_cb = mcast_cb)
         self.name = name
@@ -1551,20 +1551,20 @@
             if self.join_map.has_key(c):
                 self.join_map[c][stats_type].update(packets = packets, t = t)
     def channel_receive(self, chan, cb = None, count = 1, timeout = 5):
-        log.info('Subscriber %s on port %s receiving from group %s, channel %d' %
+        log_test.info('Subscriber %s on port %s receiving from group %s, channel %d' %
                   (self.name, self.rx_intf, self.gaddr(chan), chan))
         r = self.recv(chan, cb = cb, count = count, timeout = timeout)
         if len(r) == 0:
-            log.info('Subscriber %s on port %s timed out' %(self.name, self.rx_intf))
+            log_test.info('Subscriber %s on port %s timed out' %(self.name, self.rx_intf))
         else:
-            log.info('Subscriber %s on port %s received %d packets' %(self.name, self.rx_intf, len(r)))
+            log_test.info('Subscriber %s on port %s received %d packets' %(self.name, self.rx_intf, len(r)))
         if self.recv_timeout:
             ##Negative test case is disabled for now
             assert_equal(len(r), 0)
 
     def recv_channel_cb(self, pkt):
         ##First verify that we have received the packet for the joined instance
-        log.info('Packet received for group %s, subscriber %s, port %s' %
+        log_test.info('Packet received for group %s, subscriber %s, port %s' %
                  (pkt[IP].dst, self.name, self.rx_intf))
         if self.recv_timeout:
             return
@@ -1575,7 +1575,7 @@
         delta = recv_time - join_time
         self.join_rx_stats.update(packets=1, t = delta, usecs = True)
         self.channel_update(chan, self.STATS_RX, 1, t = delta)
-        log.debug('Packet received in %.3f usecs for group %s after join' %(delta, pkt[IP].dst))
+        log_test.debug('Packet received in %.3f usecs for group %s after join' %(delta, pkt[IP].dst))
 
 class subscriber_pool:
 
@@ -1590,9 +1590,9 @@
                 if self.test_status is not True:
                     ## This is chaning for other sub status has to check again
                     self.test_status = True
-                    log.info('This service is failed and other services will not run for this subscriber')
+                    log_test.info('This service is failed and other services will not run for this subscriber')
                     break
-        log.info('This Subscriber is tested for multiple service eligibility ')
+        log_test.info('This Subscriber is tested for multiple service eligibility ')
         self.test_status = True
 
 class cluster_subscriber(object):
@@ -1690,7 +1690,7 @@
 
       @classmethod
       def setUpClass(cls,controller=None):
-	  log.info('controller ip in cluster.py setupclass is %s'%controller)
+	  log_test.info('controller ip in cluster.py setupclass is %s'%controller)
           '''Load the OLT config and activate relevant apps'''
           did = cls.load_device_id()
           network_cfg = { "devices" : {
@@ -1706,7 +1706,7 @@
           cls.start_onos(network_cfg = network_cfg)
 	  #status, code = OnosCtrl.config(network_cfg)
           #if status is False:
-          #   log.info('JSON config request for app %s returned status %d' %(app, code))
+          #   log_test.info('JSON config request for app %s returned status %d' %(app, code))
           #assert_equal(status, True)
           #time.sleep(2)
           cls.install_app_table(controller=controller)
@@ -1737,7 +1737,7 @@
             ##Uninstall the existing app if any
             OnosCtrl.uninstall_app(cls.table_app,onos_ip=controller)
             time.sleep(2)
-            log.info('Installing the multi table app %s for subscriber test' %(cls.table_app_file))
+            log_test.info('Installing the multi table app %s for subscriber test' %(cls.table_app_file))
             OnosCtrl.install_app(cls.table_app_file,onos_ip=controller)
             time.sleep(3)
             #onos_ctrl = OnosCtrl(cls.vtn_app)
@@ -1748,7 +1748,7 @@
             ##Uninstall the table app on class exit
             OnosCtrl.uninstall_app(cls.table_app,onos_ip=controller)
             time.sleep(2)
-            log.info('Installing back the cord igmp app %s for subscriber test on exit' %(cls.app_file))
+            log_test.info('Installing back the cord igmp app %s for subscriber test on exit' %(cls.app_file))
             OnosCtrl.install_app(cls.app_file,onos_ip=controller)
             #onos_ctrl = OnosCtrl(cls.vtn_app)
             #onos_ctrl.activate()
@@ -1756,7 +1756,7 @@
       @classmethod
       def start_onos(cls, network_cfg = None):
             if cls.onos_restartable is False:
-                  log.info('ONOS restart is disabled. Skipping ONOS restart')
+                  log_test.info('ONOS restart is disabled. Skipping ONOS restart')
                   return
             if network_cfg is None:
                   network_cfg = cls.device_dict
@@ -1768,7 +1768,7 @@
                   config = dict(res)
             else:
                   config = network_cfg
-            log.info('Restarting ONOS with new network configuration')
+            log_test.info('Restarting ONOS with new network configuration')
             #return cord_test_onos_restart(config = config)
 
       @classmethod
@@ -1805,7 +1805,7 @@
             except: pass
 
       def onos_aaa_load(self,controller=None):
-	    log.info('controller ip in cluster.py onos_aaa_load is %s'%controller)
+	    log_test.info('controller ip in cluster.py onos_aaa_load is %s'%controller)
             if self.aaa_loaded:
                   return
             aaa_dict = {'apps' : { 'org.opencord.aaa' : { 'AAA' : { 'radiusSecret': 'radius_password',
@@ -1816,7 +1816,7 @@
             self.aaa_loaded = True
 
       def onos_dhcp_table_load(self, config = None,controller=None):
-	  log.info('controller ip in cluster.py onos_dhcp_table_load is %s'%controller)
+	  log_test.info('controller ip in cluster.py onos_dhcp_table_load is %s'%controller)
           dhcp_dict = {'apps' : { 'org.onosproject.dhcp' : { 'dhcp' : copy.copy(self.dhcp_server_config) } } }
           dhcp_config = dhcp_dict['apps']['org.onosproject.dhcp']['dhcp']
           if config:
@@ -1826,17 +1826,17 @@
           self.onos_load_config('org.onosproject.dhcp', dhcp_dict,controller=controller)
 
       def onos_load_config(self, app, config,controller=None):
-	  log.info('controller ip in cluster.py onos_load_config is %s'%controller)
+	  log_test.info('controller ip in cluster.py onos_load_config is %s'%controller)
           status, code = OnosCtrl(controller=controller).config(config)
           if status is False:
-             log.info('JSON config request for app %s returned status %d' %(app, code))
+             log_test.info('JSON config request for app %s returned status %d' %(app, code))
              assert_equal(status, True)
           time.sleep(2)
       def dhcp_sndrcv(self, dhcp, update_seed = False):
             cip, sip = dhcp.discover(update_seed = update_seed)
             assert_not_equal(cip, None)
             assert_not_equal(sip, None)
-            log.info('Got dhcp client IP %s from server %s for mac %s' %
+            log_test.info('Got dhcp client IP %s from server %s for mac %s' %
                      (cip, sip, dhcp.get_mac(cip)[0]))
             return cip,sip
 
@@ -1858,7 +1858,7 @@
             delta = recv_time - join_time
             self.subscriber.join_rx_stats.update(packets=1, t = delta, usecs = True)
             self.subscriber.channel_update(chan, self.subscriber.STATS_RX, 1, t = delta)
-            log.debug('Packet received in %.3f usecs for group %s after join' %(delta, pkt[IP].dst))
+            log_test.debug('Packet received in %.3f usecs for group %s after join' %(delta, pkt[IP].dst))
             self.test_status = True
 
       def traffic_verify(self, subscriber):
@@ -1867,10 +1867,10 @@
                   resp = requests.get(url)
                   self.test_status = resp.ok
                   if resp.ok == False:
-                        log.info('Subscriber %s failed get from url %s with status code %d'
+                        log_test.info('Subscriber %s failed get from url %s with status code %d'
                                  %(subscriber.name, url, resp.status_code))
                   else:
-                        log.info('GET request from %s succeeded for subscriber %s'
+                        log_test.info('GET request from %s succeeded for subscriber %s'
                                  %(url, subscriber.name))
                   return self.test_status
 
@@ -1878,7 +1878,7 @@
             if subscriber.has_service('TLS'):
                   time.sleep(2)
                   tls = TLSAuthTest(intf = subscriber.rx_intf)
-                  log.info('Running subscriber %s tls auth test' %subscriber.name)
+                  log_test.info('Running subscriber %s tls auth test' %subscriber.name)
                   tls.runTest()
                   self.test_status = True
                   return self.test_status
@@ -1888,7 +1888,7 @@
       def dhcp_verify(self, subscriber):
             if subscriber.has_service('DHCP'):
                   cip, sip = self.dhcp_request(subscriber, update_seed = True)
-                  log.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
+                  log_test.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
                   subscriber.src_list = [cip]
                   self.test_status = True
                   return self.test_status
@@ -1900,7 +1900,7 @@
       def dhcp_jump_verify(self, subscriber):
             if subscriber.has_service('DHCP'):
                   cip, sip = self.dhcp_request(subscriber, seed_ip = '10.10.200.1')
-                  log.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
+                  log_test.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
                   subscriber.src_list = [cip]
                   self.test_status = True
                   return self.test_status
@@ -1912,7 +1912,7 @@
       def dhcp_next_verify(self, subscriber):
             if subscriber.has_service('DHCP'):
                   cip, sip = self.dhcp_request(subscriber, seed_ip = '10.10.150.1')
-                  log.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
+                  log_test.info('Subscriber %s got client ip %s from server %s' %(subscriber.name, cip, sip))
                   subscriber.src_list = [cip]
                   self.test_status = True
                   return self.test_status
@@ -1930,20 +1930,20 @@
                   self.num_joins += 1
                   while self.num_joins < self.num_subscribers:
                         time.sleep(5)
-                  log.info('All subscribers have joined the channel')
+                  log_test.info('All subscribers have joined the channel')
                   for i in range(10):
                         subscriber.channel_receive(chan, cb = subscriber.recv_channel_cb, count = 10)
-                        log.info('Leaving channel %d for subscriber %s' %(chan, subscriber.name))
+                        log_test.info('Leaving channel %d for subscriber %s' %(chan, subscriber.name))
                         subscriber.channel_leave(chan)
                         time.sleep(5)
-                        log.info('Interface %s Join RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name,subscriber.join_rx_stats))
+                        log_test.info('Interface %s Join RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name,subscriber.join_rx_stats))
                         #Should not receive packets for this subscriber
                         self.recv_timeout = True
                         subscriber.recv_timeout = True
                         subscriber.channel_receive(chan, cb = subscriber.recv_channel_cb, count = 10)
                         subscriber.recv_timeout = False
                         self.recv_timeout = False
-                        log.info('Joining channel %d for subscriber %s' %(chan, subscriber.name))
+                        log_test.info('Joining channel %d for subscriber %s' %(chan, subscriber.name))
                         subscriber.channel_join(chan, delay = 0)
                   self.test_status = True
                   return self.test_status
@@ -1951,12 +1951,12 @@
       def igmp_jump_verify(self, subscriber):
             if subscriber.has_service('IGMP'):
                   for i in xrange(subscriber.num):
-                        log.info('Subscriber %s jumping channel' %subscriber.name)
+                        log_test.info('Subscriber %s jumping channel' %subscriber.name)
                         chan = subscriber.channel_jump(delay=0)
                         subscriber.channel_receive(chan, cb = subscriber.recv_channel_cb, count = 1)
-                        log.info('Verified receive for channel %d, subscriber %s' %(chan, subscriber.name))
+                        log_test.info('Verified receive for channel %d, subscriber %s' %(chan, subscriber.name))
                         time.sleep(3)
-                  log.info('Interface %s Jump RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name, subscriber.join_rx_stats))
+                  log_test.info('Interface %s Jump RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name, subscriber.join_rx_stats))
                   self.test_status = True
                   return self.test_status
       def igmp_next_verify(self, subscriber):
@@ -1966,11 +1966,11 @@
                               chan = subscriber.channel_join_next(delay=0)
                         else:
                               chan = subscriber.channel_join(i, delay=0)
-                        log.info('Joined next channel %d for subscriber %s' %(chan, subscriber.name))
+                        log_test.info('Joined next channel %d for subscriber %s' %(chan, subscriber.name))
                         subscriber.channel_receive(chan, cb = subscriber.recv_channel_cb, count=1)
-                        log.info('Verified receive for channel %d, subscriber %s' %(chan, subscriber.name))
+                        log_test.info('Verified receive for channel %d, subscriber %s' %(chan, subscriber.name))
                         time.sleep(3)
-                  log.info('Interface %s Join Next RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name, subscriber.join_rx_stats))
+                  log_test.info('Interface %s Join Next RX stats for subscriber %s, %s' %(subscriber.iface, subscriber.name, subscriber.join_rx_stats))
                   self.test_status = True
                   return self.test_status
 
@@ -2007,7 +2007,7 @@
             igmpChannel.igmp_load_ssm_config(ssm_list)
       def subscriber_join_verify( self, num_subscribers = 10, num_channels = 1,
                                   channel_start = 0, cbs = None, port_list = [], negative_subscriber_auth = None,controller=None):
-	  log.info('controller ip in cluster.py subscriber_join_verify is %s'%controller)
+	  log_test.info('controller ip in cluster.py subscriber_join_verify is %s'%controller)
           self.test_status = False
           self.ovs_cleanup()
           subscribers_count = num_subscribers
@@ -2043,7 +2043,7 @@
       def tls_invalid_cert(self, subscriber):
           if subscriber.has_service('TLS'):
              time.sleep(2)
-             log.info('Running subscriber %s tls auth test' %subscriber.name)
+             log_test.info('Running subscriber %s tls auth test' %subscriber.name)
              tls = TLSAuthTest(client_cert = self.CLIENT_CERT_INVALID)
              tls.runTest()
              if tls.failTest == True:
@@ -2056,7 +2056,7 @@
       def tls_no_cert(self, subscriber):
           if subscriber.has_service('TLS'):
              time.sleep(2)
-             log.info('Running subscriber %s tls auth test' %subscriber.name)
+             log_test.info('Running subscriber %s tls auth test' %subscriber.name)
              tls = TLSAuthTest(client_cert = '')
              tls.runTest()
              if tls.failTest == True:
@@ -2069,7 +2069,7 @@
       def tls_self_signed_cert(self, subscriber):
           if subscriber.has_service('TLS'):
              time.sleep(2)
-             log.info('Running subscriber %s tls auth test' %subscriber.name)
+             log_test.info('Running subscriber %s tls auth test' %subscriber.name)
              tls = TLSAuthTest(client_cert = self.CLIENT_CERT)
              tls.runTest()
              if tls.failTest == False:
@@ -2082,7 +2082,7 @@
       def tls_non_ca_authrized_cert(self, subscriber):
           if subscriber.has_service('TLS'):
              time.sleep(2)
-             log.info('Running subscriber %s tls auth test' %subscriber.name)
+             log_test.info('Running subscriber %s tls auth test' %subscriber.name)
              tls = TLSAuthTest(client_cert = self.CLIENT_CERT_NON_CA_AUTHORIZED)
              tls.runTest()
              if tls.failTest == False:
@@ -2094,7 +2094,7 @@
       def tls_Nsubscribers_use_same_valid_cert(self, subscriber):
           if subscriber.has_service('TLS'):
              time.sleep(2)
-             log.info('Running subscriber %s tls auth test' %subscriber.name)
+             log_test.info('Running subscriber %s tls auth test' %subscriber.name)
              num_users = 3
              for i in xrange(num_users):
                  tls = TLSAuthTest(intf = 'veth{}'.format(i*2))
@@ -2109,7 +2109,7 @@
       def dhcp_discover_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
              time.sleep(2)
-             log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+             log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
              t1 = self.subscriber_dhcp_1release()
              self.test_status = True
              return self.test_status
@@ -2125,18 +2125,18 @@
              self.onos_dhcp_table_load(config)
              self.dhcp = DHCPTest(seed_ip = '10.10.100.10', iface = iface)
              cip, sip = self.send_recv()
-             log.info('Releasing ip %s to server %s' %(cip, sip))
+             log_test.info('Releasing ip %s to server %s' %(cip, sip))
              assert_equal(self.dhcp.release(cip), True)
-             log.info('Triggering DHCP discover again after release')
+             log_test.info('Triggering DHCP discover again after release')
              cip2, sip2 = self.send_recv(update_seed = True)
-             log.info('Verifying released IP was given back on rediscover')
+             log_test.info('Verifying released IP was given back on rediscover')
              assert_equal(cip, cip2)
-             log.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
+             log_test.info('Test done. Releasing ip %s to server %s' %(cip2, sip2))
              assert_equal(self.dhcp.release(cip2), True)
       def dhcp_client_reboot_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                   time.sleep(2)
-                  log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                  log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                   tl = self.subscriber_dhcp_client_request_after_reboot()
                   self.test_status = True
                   return self.test_status
@@ -2154,38 +2154,38 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
 
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
 
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
 
           else:
                 new_cip, new_sip = self.dhcp.only_request(cip, mac)
                 if new_cip == None:
-                        log.info("Got DHCP server NAK.")
+                        log_test.info("Got DHCP server NAK.")
                 os.system('ifconfig '+iface+' down')
-                log.info('Client goes down.')
-                log.info('Delay for 5 seconds.')
+                log_test.info('Client goes down.')
+                log_test.info('Delay for 5 seconds.')
 
                 time.sleep(5)
 
                 os.system('ifconfig '+iface+' up')
-                log.info('Client is up now.')
+                log_test.info('Client is up now.')
 
                 new_cip, new_sip = self.dhcp.only_request(cip, mac)
                 if new_cip == None:
-                        log.info("Got DHCP server NAK.")
+                        log_test.info("Got DHCP server NAK.")
                         assert_not_equal(new_cip, None)
                 elif new_cip != None:
-                        log.info("Got DHCP ACK.")
+                        log_test.info("Got DHCP ACK.")
       def dhcp_client_renew_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_client_renew_time()
                 self.test_status = True
                 return self.test_status
@@ -2201,34 +2201,34 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
           cip, sip, mac , lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
 
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
           elif cip and sip and mac:
-                log.info("Triggering DHCP Request.")
+                log_test.info("Triggering DHCP Request.")
                 new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, renew_time = True)
                 if new_cip and new_sip and lval:
-                        log.info("Client 's Renewal time is :%s",lval)
-                        log.info("Generating delay till renewal time.")
+                        log_test.info("Client 's Renewal time is :%s",lval)
+                        log_test.info("Generating delay till renewal time.")
                         time.sleep(lval)
-                        log.info("Client Sending Unicast DHCP request.")
+                        log_test.info("Client Sending Unicast DHCP request.")
                         latest_cip, latest_sip = self.dhcp.only_request(new_cip, mac, unicast = True)
                         if latest_cip and latest_sip:
-                                log.info("Got DHCP Ack. Lease Renewed for ip %s and mac %s from server %s." %
+                                log_test.info("Got DHCP Ack. Lease Renewed for ip %s and mac %s from server %s." %
                                                 (latest_cip, mac, latest_sip) )
 
                         elif latest_cip == None:
-                                log.info("Got DHCP NAK. Lease not renewed.")
+                                log_test.info("Got DHCP NAK. Lease not renewed.")
                 elif new_cip == None or new_sip == None or lval == None:
-                        log.info("Got DHCP NAK.")
+                        log_test.info("Got DHCP NAK.")
       def dhcp_server_reboot_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_server_after_reboot()
                 self.test_status = True
                 return self.test_status
@@ -2244,50 +2244,50 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
           else:
                 new_cip, new_sip = self.dhcp.only_request(cip, mac)
                 if new_cip == None:
-                        log.info("Got DHCP server NAK.")
+                        log_test.info("Got DHCP server NAK.")
                         assert_not_equal(new_cip, None)
-                log.info('Getting DHCP server Down.')
+                log_test.info('Getting DHCP server Down.')
                 onos_ctrl = OnosCtrl(self.dhcp_app)
                 onos_ctrl.deactivate()
                 for i in range(0,4):
-                        log.info("Sending DHCP Request.")
-                        log.info('')
+                        log_test.info("Sending DHCP Request.")
+                        log_test.info('')
                         new_cip, new_sip = self.dhcp.only_request(cip, mac)
                         if new_cip == None and new_sip == None:
-                                log.info('')
-                                log.info("DHCP Request timed out.")
+                                log_test.info('')
+                                log_test.info("DHCP Request timed out.")
                         elif new_cip and new_sip:
-                                log.info("Got Reply from DHCP server.")
+                                log_test.info("Got Reply from DHCP server.")
                                 assert_equal(new_cip,None) #Neagtive Test Case
-                log.info('Getting DHCP server Up.')
+                log_test.info('Getting DHCP server Up.')
 #               self.activate_apps(self.dhcp_app)
                 onos_ctrl = OnosCtrl(self.dhcp_app)
                 status, _ = onos_ctrl.activate()
                 assert_equal(status, True)
                 time.sleep(3)
                 for i in range(0,4):
-                        log.info("Sending DHCP Request after DHCP server is up.")
-                        log.info('')
+                        log_test.info("Sending DHCP Request after DHCP server is up.")
+                        log_test.info('')
                         new_cip, new_sip = self.dhcp.only_request(cip, mac)
                         if new_cip == None and new_sip == None:
-                                log.info('')
-                                log.info("DHCP Request timed out.")
+                                log_test.info('')
+                                log_test.info("DHCP Request timed out.")
                         elif new_cip and new_sip:
-                                log.info("Got Reply from DHCP server.")
+                                log_test.info("Got Reply from DHCP server.")
                                 assert_equal(new_cip,None) #Neagtive Test Case
       def dhcp_client_rebind_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_client_rebind_time()
                 self.test_status = True
                 return self.test_status
@@ -2303,36 +2303,36 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
           elif cip and sip and mac:
-                log.info("Triggering DHCP Request.")
+                log_test.info("Triggering DHCP Request.")
                 new_cip, new_sip, lval = self.dhcp.only_request(cip, mac, rebind_time = True)
                 if new_cip and new_sip and lval:
-                        log.info("Client 's Rebind time is :%s",lval)
-                        log.info("Generating delay till rebind time.")
+                        log_test.info("Client 's Rebind time is :%s",lval)
+                        log_test.info("Generating delay till rebind time.")
                         time.sleep(lval)
-                        log.info("Client Sending broadcast DHCP requests for renewing lease or for getting new ip.")
+                        log_test.info("Client Sending broadcast DHCP requests for renewing lease or for getting new ip.")
                         self.dhcp.after_T2 = True
                         for i in range(0,4):
                                 latest_cip, latest_sip = self.dhcp.only_request(new_cip, mac)
                                 if latest_cip and latest_sip:
-                                        log.info("Got DHCP Ack. Lease Renewed for ip %s and mac %s from server %s." %
+                                        log_test.info("Got DHCP Ack. Lease Renewed for ip %s and mac %s from server %s." %
                                                         (latest_cip, mac, latest_sip) )
                                         break
                                 elif latest_cip == None:
-                                        log.info("Got DHCP NAK. Lease not renewed.")
+                                        log_test.info("Got DHCP NAK. Lease not renewed.")
                         assert_not_equal(latest_cip, None)
                 elif new_cip == None or new_sip == None or lval == None:
-                        log.info("Got DHCP NAK.Lease not Renewed.")
+                        log_test.info("Got DHCP NAK.Lease not Renewed.")
       def dhcp_starvation_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_starvation()
                 self.test_status = True
                 return self.test_status
@@ -2348,11 +2348,11 @@
                     'subnet': '255.255.255.0', 'broadcast':'182.17.0.255', 'router':'182.17.0.1'}
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '182.17.0.1', iface = iface)
-          log.info('Verifying 1 ')
+          log_test.info('Verifying 1 ')
           for x in xrange(50):
               mac = RandMAC()._fix()
               self.send_recv(mac = mac)
-          log.info('Verifying 2 ')
+          log_test.info('Verifying 2 ')
           cip, sip = self.send_recv(update_seed = True, validate = False)
           assert_equal(cip, None)
           assert_equal(sip, None)
@@ -2360,7 +2360,7 @@
       def dhcp_same_client_multi_discovers_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_same_client_multiple_discover()
                 self.test_status = True
                 return self.test_status
@@ -2376,22 +2376,22 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s . Not going to send DHCPREQUEST.' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s . Not going to send DHCPREQUEST.' %
                   (cip, sip, mac) )
-          log.info('Triggering DHCP discover again.')
+          log_test.info('Triggering DHCP discover again.')
           new_cip, new_sip, new_mac , lval = self.dhcp.only_discover()
           if cip == new_cip:
-                 log.info('Got same ip for 2nd DHCP discover for client IP %s from server %s for mac %s. Triggering DHCP Request. '
+                 log_test.info('Got same ip for 2nd DHCP discover for client IP %s from server %s for mac %s. Triggering DHCP Request. '
                           % (new_cip, new_sip, new_mac) )
           elif cip != new_cip:
-                log.info('Ip after 1st discover %s' %cip)
-                log.info('Map after 2nd discover %s' %new_cip)
+                log_test.info('Ip after 1st discover %s' %cip)
+                log_test.info('Map after 2nd discover %s' %new_cip)
                 assert_equal(cip, new_cip)
 
       def dhcp_same_client_multi_request_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_same_client_multiple_request()
                 self.test_status = True
                 return self.test_status
@@ -2406,16 +2406,16 @@
                     'subnet': '255.255.255.0', 'broadcast':'10.10.10.255', 'router':'10.10.10.1'}
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '10.10.10.1', iface = iface)
-          log.info('Sending DHCP discover and DHCP request.')
+          log_test.info('Sending DHCP discover and DHCP request.')
           cip, sip = self.send_recv()
           mac = self.dhcp.get_mac(cip)[0]
-          log.info("Sending DHCP request again.")
+          log_test.info("Sending DHCP request again.")
           new_cip, new_sip = self.dhcp.only_request(cip, mac)
           if (new_cip,new_sip) == (cip,sip):
-                log.info('Got same ip for 2nd DHCP Request for client IP %s from server %s for mac %s.'
+                log_test.info('Got same ip for 2nd DHCP Request for client IP %s from server %s for mac %s.'
                           % (new_cip, new_sip, mac) )
           elif (new_cip,new_sip):
-                log.info('No DHCP ACK')
+                log_test.info('No DHCP ACK')
                 assert_equal(new_cip, None)
                 assert_equal(new_sip, None)
           else:
@@ -2424,7 +2424,7 @@
       def dhcp_client_desired_ip_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_client_desired_address()
                 self.test_status = True
                 return self.test_status
@@ -2441,20 +2441,20 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.31', iface = iface)
           cip, sip, mac , lval = self.dhcp.only_discover(desired = True)
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
           if cip == self.dhcp.seed_ip:
-                log.info('Got dhcp client IP %s from server %s for mac %s as desired .' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s as desired .' %
                   (cip, sip, mac) )
           elif cip != self.dhcp.seed_ip:
-                log.info('Got dhcp client IP %s from server %s for mac %s .' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
-                log.info('The desired ip was: %s .' % self.dhcp.seed_ip)
+                log_test.info('The desired ip was: %s .' % self.dhcp.seed_ip)
                 assert_equal(cip, self.dhcp.seed_ip)
       def dhcp_client_request_pkt_with_non_offered_ip_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_server_nak_packet()
                 self.test_status = True
                 return self.test_status
@@ -2470,22 +2470,22 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover()
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet. Those should not be none, which is expected.")
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
           else:
                 new_cip, new_sip = self.dhcp.only_request('20.20.20.31', mac)
                 if new_cip == None:
-                        log.info("Got DHCP server NAK.")
+                        log_test.info("Got DHCP server NAK.")
                         assert_equal(new_cip, None)  #Negative Test Case
 
       def dhcp_client_requested_out_pool_ip_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_client_desired_address_out_of_pool()
                 self.test_status = True
                 return self.test_status
@@ -2501,26 +2501,26 @@
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.35', iface = iface)
           cip, sip, mac, lval = self.dhcp.only_discover(desired = True)
-          log.info('Got dhcp client IP %s from server %s for mac %s .' %
+          log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
           if cip == self.dhcp.seed_ip:
-                log.info('Got dhcp client IP %s from server %s for mac %s as desired .' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s as desired .' %
                   (cip, sip, mac) )
                 assert_equal(cip, self.dhcp.seed_ip) #Negative Test Case
 
           elif cip != self.dhcp.seed_ip:
-                log.info('Got dhcp client IP %s from server %s for mac %s .' %
+                log_test.info('Got dhcp client IP %s from server %s for mac %s .' %
                   (cip, sip, mac) )
-                log.info('The desired ip was: %s .' % self.dhcp.seed_ip)
+                log_test.info('The desired ip was: %s .' % self.dhcp.seed_ip)
                 assert_not_equal(cip, self.dhcp.seed_ip)
 
           elif cip == None:
-                log.info('Got DHCP NAK')
+                log_test.info('Got DHCP NAK')
 
       def dhcp_client_specific_lease_scenario(self, subscriber):
           if subscriber.has_service('DHCP'):
                 time.sleep(2)
-                log.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
+                log_test.info('Running subscriber %s DHCP rediscover scenario test' %subscriber.name)
                 tl = self.subscriber_dhcp_specific_lease_packet()
                 self.test_status = True
                 return self.test_status
@@ -2535,14 +2535,14 @@
                    'subnet': '255.255.255.0', 'broadcast':'20.20.20.255', 'router':'20.20.20.1'}
           self.onos_dhcp_table_load(config)
           self.dhcp = DHCPTest(seed_ip = '20.20.20.45', iface = iface)
-          log.info('Sending DHCP discover with lease time of 700')
+          log_test.info('Sending DHCP discover with lease time of 700')
           cip, sip, mac, lval = self.dhcp.only_discover(lease_time = True)
 
-          log.info("Verifying Client 's IP and mac in DHCP Offer packet.")
+          log_test.info("Verifying Client 's IP and mac in DHCP Offer packet.")
           if (cip == None and mac != None):
-                log.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
+                log_test.info("Verified that Client 's IP and mac in DHCP Offer packet are none, which is not expected behavior.")
                 assert_not_equal(cip, None)
           elif lval != 700:
-                log.info('Getting dhcp client IP %s from server %s for mac %s with lease time %s. That is not 700.' %
+                log_test.info('Getting dhcp client IP %s from server %s for mac %s with lease time %s. That is not 700.' %
                          (cip, sip, mac, lval) )
                 assert_not_equal(lval, 700)
diff --git a/src/test/utils/CordLogger.py b/src/test/utils/CordLogger.py
index cbebee5..18517b4 100644
--- a/src/test/utils/CordLogger.py
+++ b/src/test/utils/CordLogger.py
@@ -1,7 +1,7 @@
 from OnosLog import OnosLog
 import logging
 logging.getLogger('scapy.runtime').setLevel(logging.ERROR)
-from scapy.all import log
+from CordTestUtils import log_test as log
 from onosclidriver import OnosCliDriver
 from OnosCtrl import OnosCtrl
 from docker import Client
diff --git a/src/test/utils/CordTestBase.py b/src/test/utils/CordTestBase.py
index 1402ffc..0170662 100644
--- a/src/test/utils/CordTestBase.py
+++ b/src/test/utils/CordTestBase.py
@@ -28,8 +28,8 @@
     def runTest(self):
         while self.currentState != self.stopState and self.currentEvent != None:
             if self.stateTable and self.eventTable:
-                print 'Current state: %s, Current event: %s' %(self.stateTable.toStr(self.currentState),
-                                                               self.eventTable.toStr(self.currentEvent))
+                print('Current state: %s, Current event: %s' %(self.stateTable.toStr(self.currentState),
+                                                               self.eventTable.toStr(self.currentEvent)))
             key = (self.currentState, self.currentEvent)
             (actions, nextState) = self.fsmTable[key]
             if actions:
diff --git a/src/test/utils/DHCP.py b/src/test/utils/DHCP.py
index 1ca73bb..eaad0d4 100644
--- a/src/test/utils/DHCP.py
+++ b/src/test/utils/DHCP.py
@@ -14,6 +14,7 @@
 # limitations under the License.
 #
 from scapy.all import *
+from CordTestUtils import log_test
 
 conf.verb = 0 # Disable Scapy verbosity
 conf.checkIPaddr = 0 # Don't check response packets for matching destination IPs
@@ -50,7 +51,7 @@
                 mac = self.seed_mac
 
         chmac = self.macToChaddr(mac)
-	#log.info('mac and chmac are %s %s'%(mac, chmac))
+	#log_test.info('mac and chmac are %s %s'%(mac, chmac))
 	self.bootpmac = chmac
         L2 = Ether(dst="ff:ff:ff:ff:ff:ff", src=mac)
         L3 = IP(src="0.0.0.0", dst="255.255.255.255")
@@ -58,14 +59,14 @@
         L5 = BOOTP(chaddr=chmac)
         L6 = DHCP(options=[("message-type","discover"),"end"])
         resp = srp1(L2/L3/L4/L5/L6, filter="udp and port 68", timeout=10, iface=self.iface)
-	#log.info('dhcp discover packet is %s'%(L2/L3/L4/L5/L6).show())
+	#log_test.info('dhcp discover packet is %s'%(L2/L3/L4/L5/L6).show())
         self.dhcpresp = resp
-	#log.info('discover response is %s'%resp.show())
+	#log_test.info('discover response is %s'%resp.show())
         try:
             srcIP = resp.yiaddr
             serverIP = resp.siaddr
         except AttributeError:
-            log.info("Failed to acquire IP via DHCP for %s on interface %s" %(mac, self.iface))
+            log_test.info("Failed to acquire IP via DHCP for %s on interface %s" %(mac, self.iface))
             return (None, None)
 
         subnet_mask = "0.0.0.0"
@@ -82,7 +83,7 @@
         L6 = DHCP(options=[("message-type","request"), ("server_id",server_id),
                            ("subnet_mask",subnet_mask), ("requested_addr",srcIP), "end"])
         resp2 = srp1(L2/L3/L4/L5/L6, filter="udp and port 68", timeout=10, iface=self.iface)
-	#log.info('request response is %s'%resp2.show())
+	#log_test.info('request response is %s'%resp2.show())
         self.mac_map[mac] = (srcIP, serverIP)
         self.mac_inverse_map[srcIP] = (mac, serverIP)
         return (srcIP, serverIP)
@@ -111,13 +112,13 @@
 
 	else:
 	        L6 = DHCP(options=[("message-type","discover"),"end"])
-	#log.info('only discover packet is %s'%(L2/L3/L4/L5/L6).show())
+	#log_test.info('only discover packet is %s'%(L2/L3/L4/L5/L6).show())
 
         resp = srp1(L2/L3/L4/L5/L6, filter="udp and port 68", timeout=10, iface=self.iface)
-	#log.info('discovery packet is %s'%(L2/L3/L4/L5/L6).show())
+	#log_test.info('discovery packet is %s'%(L2/L3/L4/L5/L6).show())
 	if resp == None:
                 return (None, None, mac, None)
-	#log.info('only discover response is %s'%resp.show())
+	#log_test.info('only discover response is %s'%resp.show())
 
 	self.dhcpresp = resp
         for x in resp.lastlayer().options:
@@ -132,8 +133,8 @@
             			srcIP = resp.yiaddr
             			serverIP = resp.siaddr
         		except AttributeError:
-           			log.info("In Attribute error.")
-            		 	log.info("Failed to acquire IP via DHCP for %s on interface %s" %(mac, self.iface))
+           			log_test.info("In Attribute error.")
+            		 	log_test.info("Failed to acquire IP via DHCP for %s on interface %s" %(mac, self.iface))
                                 return (None, None, None, None)
 
 			if self.return_option:
@@ -221,8 +222,8 @@
                            	("subnet_mask",subnet_mask), ("requested_addr",cip), "end"])
 
 	resp=srp1(L2/L3/L4/L5/L6, filter="udp and port 68", timeout=10, iface=self.iface)
-	#log.info('request packet is %s'%(L2/L3/L4/L5/L6).show())
-	#log.info('response packet is %s'%resp.show())
+	#log_test.info('request packet is %s'%(L2/L3/L4/L5/L6).show())
+	#log_test.info('response packet is %s'%resp.show())
 	if resp == None:
         	return (None, None)
 
@@ -242,8 +243,8 @@
 					self.mac_map[mac] = (srcIP, serverIP)
                                         self.mac_inverse_map[srcIP] = (mac, serverIP)
         			except AttributeError:
-           				log.info("In Attribute error.")
-            				log.info("Failed to acquire IP via DHCP for %s on interface %s" %(mac, self.iface))
+           				log_test.info("In Attribute error.")
+            				log_test.info("Failed to acquire IP via DHCP for %s on interface %s" %(mac, self.iface))
             				return (None, None)
 
 				if lease_time or renew_time or rebind_time or self.specific_lease:
@@ -276,7 +277,7 @@
 					return (srcIP, serverIP)
 			elif(val == 6):
 
-				log.info("Got DHCP NAK.")
+				log_test.info("Got DHCP NAK.")
 				return (None, None)
 
 
@@ -299,7 +300,7 @@
         L5 = BOOTP(chaddr=chmac, ciaddr = ip)
         L6 = DHCP(options=[("message-type","release"), ("server_id", server_ip), "end"])
         sendp(L2/L3/L4/L5/L6, iface = self.iface, count=2)
-	#log.info('release response is %s'%resp)
+	#log_test.info('release response is %s'%resp)
         del self.mac_map[mac]
         del self.mac_inverse_map[ip]
         return True
@@ -350,4 +351,3 @@
 
         n -= 1
         return self.incIP(".".join(o), n)
-
diff --git a/src/test/utils/EapMD5.py b/src/test/utils/EapMD5.py
index be71b18..8467a78 100644
--- a/src/test/utils/EapMD5.py
+++ b/src/test/utils/EapMD5.py
@@ -1,12 +1,12 @@
-# 
+#
 # Copyright 2016-present Ciena Corporation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 # http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -54,58 +54,56 @@
         self.nextEvent = None
 
     def _eapSetup(self):
-        print 'Inside EAP Setup'
+        print('Inside EAP Setup')
         self.setup()
         self.nextEvent = self.md5EventTable.EVT_EAP_START
-        
+
     def _eapStart(self):
-        print 'Inside EAP Start'
+        print('Inside EAP Start')
         self.eapol_start()
         self.nextEvent = self.md5EventTable.EVT_EAP_ID_REQ
 
     def _eapIdReq(self):
-        print 'Inside EAP ID Req'
+        print('Inside EAP ID Req')
         p = self.eapol_recv()
         code, pkt_id, eaplen = unpack("!BBH", p[0:4])
-        print "Code %d, id %d, len %d" %(code, pkt_id, eaplen)
+        print("Code %d, id %d, len %d" %(code, pkt_id, eaplen))
         assert_equal(code, EAP_REQUEST)
         reqtype = unpack("!B", p[4:5])[0]
         reqdata = p[5:4+eaplen]
         assert_equal(reqtype, EAP_TYPE_ID)
-        print "<====== Send EAP Response with identity = %s ================>" % USER
+        print("<====== Send EAP Response with identity = %s ================>" % USER)
         self.eapol_id_req(pkt_id, USER)
         self.nextEvent = self.md5EventTable.EVT_EAP_MD5_CHALLENGE
 
     def _eapMd5Challenge(self):
-        print 'Inside EAP MD5 Challenge Exchange'
+        print('Inside EAP MD5 Challenge Exchange')
         challenge,pkt_id =self.eap_md5_challenge_recv(self.passwd)
         resp=md5(challenge).digest()
         resp=chr(len(resp))+resp
         length= 5+len(resp)
-        print "Generated MD5 challenge is %s Length : %d" % (resp,length)
-        print "--> Send EAP response with MD5 challenge"
+        print("Generated MD5 challenge is %s Length : %d" % (resp,length))
+        print("--> Send EAP response with MD5 challenge")
         eap_payload = self.eap(EAP_RESPONSE, pkt_id, EAP_TYPE_MD5, str(resp))
         self.eapol_send(EAPOL_EAPPACKET, eap_payload)
         self.nextEvent = self.md5EventTable.EVT_EAP_STATUS
 
     def _eapStatus(self):
-       print 'Inside EAP Status -- Sucess/Failure'
+       print('Inside EAP Status -- Sucess/Failure')
        if self.req_status == "EAP_SUCCESS":
          status=self.eap_Status()
-         print "<============EAP code received is = %d ====================>" % status
+         print("<============EAP code received is = %d ====================>" % status)
          assert_equal(status, EAP_SUCCESS)
-         print"Received EAP SUCCESS"
+         print("Received EAP SUCCESS")
        else:
-         print 'Inside EAP Status -- Sucess/Failure ===> SUCCESS should not be received , Since Negative Testcase'
+         print('Inside EAP Status -- Sucess/Failure ===> SUCCESS should not be received , Since Negative Testcase')
          self.s.settimeout(10)
          assert_equal(self.s.gettimeout(), 10)
-         print "Check if the socket timed out ====> Since negative testcase socket should timeout because ONOS is not sending the EAP FAILURE Message"
+         print("Check if the socket timed out ====> Since negative testcase socket should timeout because ONOS is not sending the EAP FAILURE Message")
          assert_raises(socket.error, self.s.recv, 1024)
        self.nextEvent = self.md5EventTable.EVT_EAP_MD5_DONE
 
     def _wrong_password(self):
-       print 'Start Testcase for EAP-MD5 Wrong Password'
+       print('Start Testcase for EAP-MD5 Wrong Password')
        #self._eap_md5_states()
        self.__init__(intf = 'veth0', password = "wrong_password", required_status = "EAP_FAILURE")
-      
-
diff --git a/src/test/utils/EapPAP.py b/src/test/utils/EapPAP.py
index a342132..accb660 100644
--- a/src/test/utils/EapPAP.py
+++ b/src/test/utils/EapPAP.py
@@ -1,12 +1,12 @@
-# 
+#
 # Copyright 2016-present Ciena Corporation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 # http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -22,9 +22,10 @@
 from scapy.all import *
 from nose.tools import *
 from CordTestBase import CordTester
+from CordTestUtils import log_test
 PAP_USER = "raduser"
 PAP_PASSWD = "radpass"
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 class PAPAuthTest(EapolPacket, CordTester):
 
@@ -58,18 +59,18 @@
         print 'Inside EAP PAP Setup'
         self.setup()
         self.nextEvent = self.PAPEventTable.EVT_EAP_START
-        
+
     def _eapStart(self):
         print 'Inside EAP PAP Start'
         self.eapol_start()
         self.nextEvent = self.PAPEventTable.EVT_EAP_ID_REQ
 
     def _eapIdReq(self):
-        log.info( 'Inside EAP ID Req' )
+        log_test.info( 'Inside EAP ID Req' )
         def eapol_cb(pkt):
-                log.info('Got EAPOL packet with type id and code request')
-                log.info('Packet code: %d, type: %d, id: %s', pkt[EAP].code, pkt[EAP].type, pkt[EAP].id)
-                log.info("<====== Send EAP Response with identity = %s ================>" % PAP_USER)
+                log_test.info('Got EAPOL packet with type id and code request')
+                log_test.info('Packet code: %d, type: %d, id: %s', pkt[EAP].code, pkt[EAP].type, pkt[EAP].id)
+                log_test.info("<====== Send EAP Response with identity = %s ================>" % PAP_USER)
                 self.eapol_id_req(pkt[EAP].id, PAP_USER)
 
         self.eapol_scapy_recv(cb = eapol_cb,
@@ -77,11 +78,11 @@
         self.nextEvent = self.PAPEventTable.EVT_EAP_PAP_USER_REQ
 
     def _eapPAPUserReq(self):
-        log.info('UserReq Inside Challenge')
+        log_test.info('UserReq Inside Challenge')
         def eapol_cb(pkt):
-                log.info('Got EAPOL packet with type id and code request')
-                log.info('Packet code: %d, id: %s', pkt[EAP].code, pkt[EAP].id)
-                log.info('Send EAP Response for id %s with Password = %s' %(pkt[EAP].id, PAP_PASSWD) )
+                log_test.info('Got EAPOL packet with type id and code request')
+                log_test.info('Packet code: %d, id: %s', pkt[EAP].code, pkt[EAP].id)
+                log_test.info('Send EAP Response for id %s with Password = %s' %(pkt[EAP].id, PAP_PASSWD) )
                 self.eapol_id_req(pkt[EAP].id, PAP_PASSWD)
 
         self.eapol_scapy_recv(cb = eapol_cb,
@@ -90,12 +91,11 @@
         self.nextEvent = None
 
     def _eapPAPPassReq(self):
-        log.info('PassReq Inside Challenge')
+        log_test.info('PassReq Inside Challenge')
         def eapol_cb(pkt):
-                log.info('Got EAPOL packet with type id and code request')
-                log.info('Packet code: %d, type: %d', pkt[EAP].code, pkt[EAP].type)
+                log_test.info('Got EAPOL packet with type id and code request')
+                log_test.info('Packet code: %d, type: %d', pkt[EAP].code, pkt[EAP].type)
 
         self.eapol_scapy_recv(cb = eapol_cb,
                               lfilter = lambda pkt: pkt[EAP].code == EAP.SUCCESS)
         self.nextEvent = self.PAPEventTable.EVT_EAP_PAP_DONE
- 
diff --git a/src/test/utils/EapTLS.py b/src/test/utils/EapTLS.py
index c92721a..6a68209 100644
--- a/src/test/utils/EapTLS.py
+++ b/src/test/utils/EapTLS.py
@@ -27,10 +27,11 @@
 from nose.tools import *
 from CordTestBase import CordTester
 from CordContainer import *
+from CordTestUtils import log_test
 import re
 import time
 
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 def bytes_to_num(data):
     try:
@@ -130,7 +131,7 @@
 
     def handle_server_hello_done(self, server_hello_done):
         if server_hello_done[-4:] == self.server_hello_done_signature:
-	    log.info('server hello received')
+	    log_test.info('server hello received')
             self.server_hello_done_received = True
 
     def __init__(self, intf = 'veth0', client_cert = None, client_priv_key = None,
@@ -215,8 +216,8 @@
         self.pkt_map[pkt_type][self.DATA_IDX] += data
         if reassembled is True:
             self.pkt_map[pkt_type][self.CB_IDX](self.pkt_map[pkt_type][self.DATA_IDX])
-            log.info('Appending packet type %02x to packet history of len %d'
-                     %(ord(pkt_type), len(self.pkt_map[pkt_type][self.DATA_IDX])))
+            log_test.info('Appending packet type %02x to packet history of len %d'
+                          %(ord(pkt_type), len(self.pkt_map[pkt_type][self.DATA_IDX])))
             self.pkt_history.append(self.pkt_map[pkt_type][self.DATA_IDX])
             data = ''.join(self.pkt_map[pkt_type][:self.DATA_IDX+1])
             self.load_tls_record(data, pkt_type = pkt_type)
@@ -225,7 +226,7 @@
 
     def tlsFail(self):
         ##Force a failure
-	log.info('entering into testFail function')
+	log_test.info('entering into testFail function')
         self.nextEvent = self.tlsEventTable.EVT_EAP_TLS_FINISHED
         self.nextState = self.tlsStateTable.ST_EAP_TLS_FINISHED
         self.failTest = True
@@ -272,7 +273,7 @@
                                     reassembled = False)
                     self.pending_bytes -= len(tls_data) - 5 - type_hdrlen
                     self.pkt_last = pkt_type
-                    log.info('Pending bytes left %d' %(self.pending_bytes))
+                    log_test.info('Pending bytes left %d' %(self.pending_bytes))
                     assert self.pending_bytes > 0
             elif tls_data[0] == self.SERVER_HELLO_DONE:
                 self.server_hello_done_eap_id = pkt[EAP].id
@@ -295,23 +296,23 @@
 	#if self.src_mac == 'mcast': self.setup(src_mac='mcast')
 	#if self.src_mac == 'zeros': self.setup(src_mac='zeros')
 	#if self.src_mac == 'default': self.setup(src_mac='default')
-	log.info('source mac is %s'%self.src_mac)
+	log_test.info('source mac is %s'%self.src_mac)
 	self.setup(src_mac=self.src_mac)
         self.nextEvent = self.tlsEventTable.EVT_EAP_START
 
     def _eapStart(self):
-	log.info('_eapStart method started')
+	log_test.info('_eapStart method started')
         self.eapol_start()
         self.nextEvent = self.tlsEventTable.EVT_EAP_ID_REQ
 
     def _eapIdReq(self):
-        log.info( 'Inside EAP ID Req' )
+        log_test.info( 'Inside EAP ID Req' )
         def eapol_cb(pkt):
-                log.info('Got EAPOL packet with type id and code request')
-                log.info('Packet code: %d, type: %d, id: %d', pkt[EAP].code, pkt[EAP].type, pkt[EAP].id)
-                log.info("<====== Send EAP Response with identity = %s ================>" % USER)
+                log_test.info('Got EAPOL packet with type id and code request')
+                log_test.info('Packet code: %d, type: %d, id: %d', pkt[EAP].code, pkt[EAP].type, pkt[EAP].id)
+                log_test.info("<====== Send EAP Response with identity = %s ================>" % USER)
 		if self.id_mismatch_in_identifier_response_packet:
-		    log.info('\nSending invalid id field in EAP Identity Response packet')
+		    log_test.info('\nSending invalid id field in EAP Identity Response packet')
                     self.eapol_id_req(pkt[EAP].id+10, USER)
 		else:
 		    self.eapol_id_req(pkt[EAP].id, USER)
@@ -328,7 +329,7 @@
     def _eapTlsHelloReq(self):
 
         def eapol_cb(pkt):
-                log.info('Got hello request for id %d', pkt[EAP].id)
+                log_test.info('Got hello request for id %d', pkt[EAP].id)
                 self.client_hello = TLSClientHello(version= self.version,
                                                    gmt_unix_time=self.gmt_unix_time,
                                                    random_bytes= '\xAB' * 28,
@@ -340,10 +341,10 @@
                                                    cipher_suites=[self.cipher_suite]
                                                    )
 		if self.invalid_client_hello_handshake_type:
-		    log.info('sending server_hello instead of client_hello handshape type in client hello packet')
+		    log_test.info('sending server_hello instead of client_hello handshape type in client hello packet')
 		    client_hello_data = TLSHandshake(type='server_hello')/self.client_hello
 		elif self.invalid_client_hello_handshake_length:
-		    log.info('sending TLS Handshake message with zero length field in client hello packet')
+		    log_test.info('sending TLS Handshake message with zero length field in client hello packet')
 		    client_hello_data = TLSHandshake(length=0)/self.client_hello
 		else:
 		    client_hello_data = TLSHandshake()/self.client_hello
@@ -354,14 +355,14 @@
 		else:
 		    reqdata = TLSRecord()/client_hello_data
                 self.load_tls_record(str(reqdata))
-                log.info("Sending Client Hello TLS payload of len %d, id %d" %(len(reqdata),pkt[EAP].id))
+                log_test.info("Sending Client Hello TLS payload of len %d, id %d" %(len(reqdata),pkt[EAP].id))
 		if self.id_mismatch_in_client_hello_packet:
-                    log.info('\nsending invalid id field in client hello packet')
+                    log_test.info('\nsending invalid id field in client hello packet')
                     eap_payload = self.eapTLS(EAP_RESPONSE, pkt[EAP].id+10, TLS_LENGTH_INCLUDED, str(reqdata))
                 else:
                     eap_payload = self.eapTLS(EAP_RESPONSE, pkt[EAP].id, TLS_LENGTH_INCLUDED, str(reqdata))
                 if self.dont_send_client_hello:
-                    log.info('\nskipping client hello packet sending part')
+                    log_test.info('\nskipping client hello packet sending part')
                     pass
                 else:
                     self.eapol_send(EAPOL_EAPPACKET, eap_payload)
@@ -405,7 +406,7 @@
         return to_raw(TLSPlaintext(data = 'GET / HTTP/1.1\r\nHOST: localhost\r\n\r\n'), self.tls_ctx)
 
     def _eapTlsCertReq(self):
-        log.info('Receiving server certificates')
+        log_test.info('Receiving server certificates')
         while self.server_hello_done_received == False:
             r = self.eapol_scapy_recv(cb = self.eapol_server_hello_cb,
                                       lfilter =
@@ -414,7 +415,7 @@
             if len(r) == 0:
                 self.tlsFail()
                 return r
-        log.info('Sending client certificate request')
+        log_test.info('Sending client certificate request')
         rex_pem = re.compile(r'\-+BEGIN[^\-]+\-+(.*?)\-+END[^\-]+\-+', re.DOTALL)
         if self.client_cert:
             der_cert = rex_pem.findall(self.client_cert)[0].decode("base64")
@@ -433,17 +434,17 @@
         self.pkt_history.append(str(client_key_ex_data))
         verify_signature = self.get_verify_signature(self.client_priv_key)
 	if self.invalid_cert_req_handshake:
-	    log.info("sending 'certificate-request' type of handshake message instead of 'certificate-verify' type")
+	    log_test.info("sending 'certificate-request' type of handshake message instead of 'certificate-verify' type")
 	    client_cert_verify = TLSHandshake(type=TLSHandshakeType.CERTIFICATE_REQUEST)/verify_signature
 	else:
             client_cert_verify = TLSHandshake(type=TLSHandshakeType.CERTIFICATE_VERIFY)/verify_signature
 	if self.incorrect_tlsrecord_type_cert_req:
-	    log.info("sending TLS Record type as ALERT instead of HANDSHAKE in certificate request packet")
+	    log_test.info("sending TLS Record type as ALERT instead of HANDSHAKE in certificate request packet")
             client_cert_record = TLSRecord(content_type=TLSContentType.ALERT)/client_cert_verify
 	else:
 	    client_cert_record = TLSRecord(content_type=TLSContentType.HANDSHAKE)/client_cert_verify
         self.pkt_history.append(str(client_cert_verify))
-        #log.info('TLS ctxt: %s' %self.tls_ctx)
+        #log_test.info('TLS ctxt: %s' %self.tls_ctx)
         client_ccs = TLSRecord(version="TLS_1_0")/TLSChangeCipherSpec()
         enc_handshake_msg = self.get_encrypted_handshake_msg()
 	if self.invalid_content_type:
@@ -452,9 +453,9 @@
 	    handshake_msg = str(TLSRecord(content_type=TLSContentType.HANDSHAKE)/enc_handshake_msg)
         reqdata = str(TLS.from_records([client_certificate, client_key_ex, client_cert_record, client_ccs]))
         reqdata += handshake_msg
-        log.info("------> Sending Client Hello TLS Certificate payload of len %d ----------->" %len(reqdata))
+        log_test.info("------> Sending Client Hello TLS Certificate payload of len %d ----------->" %len(reqdata))
 	if self.dont_send_client_certificate:
-	    log.info('\nskipping sending client certificate part')
+	    log_test.info('\nskipping sending client certificate part')
 	    pass
 	else:
             status = self.eapFragmentSend(EAP_RESPONSE, self.server_hello_done_eap_id, TLS_LENGTH_INCLUDED,
@@ -464,7 +465,7 @@
 
     def _eapTlsCertReq_delay(self):
         self.server_hello_done_received = True
-        log.info('Sending client certificate request')
+        log_test.info('Sending client certificate request')
         rex_pem = re.compile(r'\-+BEGIN[^\-]+\-+(.*?)\-+END[^\-]+\-+', re.DOTALL)
 
         if self.client_cert:
@@ -488,19 +489,19 @@
         verify_signature = self.get_verify_signature(self.client_priv_key)
 
 	if self.invalid_cert_req_handshake:
-	   log.info("Sending 'certificate-request' type of handshake message instead of 'certificate-verify' type")
+	   log_test.info("Sending 'certificate-request' type of handshake message instead of 'certificate-verify' type")
 	   client_cert_verify = TLSHandshake(type=TLSHandshakeType.CERTIFICATE_REQUEST)/verify_signature
 	else:
            client_cert_verify = TLSHandshake(type=TLSHandshakeType.CERTIFICATE_VERIFY)/verify_signature
 
 	if self.incorrect_tlsrecord_type_cert_req:
-	   log.info("Sending TLS Record type as ALERT instead of HANDSHAKE in certificate request packet")
+	   log_test.info("Sending TLS Record type as ALERT instead of HANDSHAKE in certificate request packet")
            client_cert_record = TLSRecord(content_type=TLSContentType.ALERT)/client_cert_verify
 	else:
 	   client_cert_record = TLSRecord(content_type=TLSContentType.HANDSHAKE)/client_cert_verify
 
         self.pkt_history.append(str(client_cert_verify))
-        #log.info('TLS ctxt: %s' %self.tls_ctx)
+        #log_test.info('TLS ctxt: %s' %self.tls_ctx)
         client_ccs = TLSRecord(version="TLS_1_0")/TLSChangeCipherSpec()
         enc_handshake_msg = self.get_encrypted_handshake_msg()
 
@@ -510,10 +511,10 @@
 	    handshake_msg = str(TLSRecord(content_type=TLSContentType.HANDSHAKE)/enc_handshake_msg)
         reqdata = str(TLS.from_records([client_certificate, client_key_ex, client_cert_record, client_ccs]))
         reqdata += handshake_msg
-        log.info("------> Sending Client Hello TLS Certificate payload of len %d ----------->" %len(reqdata))
+        log_test.info("------> Sending Client Hello TLS Certificate payload of len %d ----------->" %len(reqdata))
 
 	if self.dont_send_client_certificate:
-	   log.info('\nSkipping sending client certificate part')
+	   log_test.info('\nSkipping sending client certificate part')
 	   pass
 	else:
            status = self.eapFragmentSend(EAP_RESPONSE, self.server_hello_done_eap_id, TLS_LENGTH_INCLUDED,
@@ -524,11 +525,11 @@
     def _eapTlsChangeCipherSpec(self):
         def eapol_cb(pkt):
             r = str(pkt)
-	    log.info('data received in change cipher spec function is %s'%pkt.show())
+	    log_test.info('data received in change cipher spec function is %s'%pkt.show())
             tls_data = r[self.TLS_OFFSET:]
-            log.info('Verifying TLS Change Cipher spec record type %x' %ord(tls_data[0]))
+            log_test.info('Verifying TLS Change Cipher spec record type %x' %ord(tls_data[0]))
             assert tls_data[0] == self.CHANGE_CIPHER
-            log.info('Handshake finished. Sending empty data')
+            log_test.info('Handshake finished. Sending empty data')
             eap_payload = self.eapTLS(EAP_RESPONSE, pkt[EAP].id, 0, '')
             self.eapol_send(EAPOL_EAPPACKET, eap_payload)
 
@@ -544,7 +545,7 @@
     def _eapTlsFinished(self):
         self.nextEvent = None
         def eapol_cb(pkt):
-            log.info('Server authentication successfull')
+            log_test.info('Server authentication successfull')
 
         timeout = 5
         if self.failTest is True:
diff --git a/src/test/utils/EapolAAA.py b/src/test/utils/EapolAAA.py
index d256e0b..a27001a 100644
--- a/src/test/utils/EapolAAA.py
+++ b/src/test/utils/EapolAAA.py
@@ -20,6 +20,7 @@
 from struct import *
 import sys
 from nose.tools import assert_equal, assert_not_equal, assert_raises, assert_true
+from CordTestUtils import log_test
 
 USER = "raduser"
 PASS = "radpass"
@@ -71,8 +72,8 @@
         if mac is None:
             mac = self.mymac
         self.llheader = Ether(dst = PAE_GROUP_ADDR, src = mac, type = ETHERTYPE_PAE)
-	log.info('llheader packet is %s'%self.llheader.show())
-	log.info('source mac of  packet is %s'%mac)
+	log_test.info('llheader packet is %s'%self.llheader.show())
+	log_test.info('source mac of  packet is %s'%mac)
         self.recv_sock = L2Socket(iface = self.intf, type = ETHERTYPE_PAE)
 
     def cleanup(self):
@@ -225,43 +226,41 @@
 
     @classmethod
     def eap_invalid_tls_packets_info(self, invalid_field_name = None, invalid_field_value = None):
-        log.info( 'Changing invalid field values in tls auth packets' )
+        log_test.info( 'Changing invalid field values in tls auth packets' )
         if invalid_field_name == 'eapolTlsVersion':
            global EAPOL_VERSION
-           log.info( 'Changing invalid field values in tls auth packets====== version changing' )
+           log_test.info( 'Changing invalid field values in tls auth packets====== version changing' )
            EAPOL_VERSION = invalid_field_value
         if invalid_field_name == 'eapolTlsType':
            global EAP_TYPE_TLS
-           log.info( 'Changing invalid field values in tls auth packets====== EAP TYPE TLS changing' )
+           log_test.info( 'Changing invalid field values in tls auth packets====== EAP TYPE TLS changing' )
            EAP_TYPE_TLS = invalid_field_value
         if invalid_field_name == 'eapolTypeID':
            global EAP_TYPE_ID
-           log.info( 'Changing invalid field values in tls auth packets====== EAP TYPE TLS changing' )
+           log_test.info( 'Changing invalid field values in tls auth packets====== EAP TYPE TLS changing' )
            EAP_TYPE_ID = invalid_field_value
         if invalid_field_name == 'eapolResponse':
            global EAP_RESPONSE
-           log.info( 'Changing invalid field values in tls auth packets====== EAP TYPE TLS changing' )
+           log_test.info( 'Changing invalid field values in tls auth packets====== EAP TYPE TLS changing' )
            EAP_RESPONSE = invalid_field_value
 
 
     @classmethod
     def eap_tls_packets_field_value_replace(self, invalid_field_name = None):
-        log.info( 'Changing invalid field values in tls auth packets' )
+        log_test.info( 'Changing invalid field values in tls auth packets' )
         if invalid_field_name == 'eapolTlsVersion':
            global EAPOL_VERSION
            EAPOL_VERSION = 1
-           log.info( 'Changing invalid field values in tls auth packets====== version changing' )
+           log_test.info( 'Changing invalid field values in tls auth packets====== version changing' )
         if invalid_field_name == 'eapolTlsType':
            global EAP_TYPE_TLS
            EAP_TYPE_TLS = 13
-           log.info( 'Changing invalid field values in tls auth packets====== version changing' )
+           log_test.info( 'Changing invalid field values in tls auth packets====== version changing' )
         if invalid_field_name == 'eapolTypeID':
            global EAP_TYPE_ID
            EAP_TYPE_ID = 1
-           log.info( 'Changing invalid field values in tls auth packets====== version changing' )
+           log_test.info( 'Changing invalid field values in tls auth packets====== version changing' )
         if invalid_field_name == 'eapolResponse':
            global EAP_RESPONSE
            EAP_RESPONSE = 2
-           log.info( 'Changing invalid field values in tls auth packets====== version changing' )
-
-
+           log_test.info( 'Changing invalid field values in tls auth packets====== version changing' )
diff --git a/src/test/utils/IGMP.py b/src/test/utils/IGMP.py
index 7e348bc..3a243eb 100644
--- a/src/test/utils/IGMP.py
+++ b/src/test/utils/IGMP.py
@@ -66,7 +66,7 @@
     def post_build(self, pkt, payload):
         pkt += payload
         if self.aux_data_len != 0:
-            print "WARNING: Auxiliary Data Length must be zero (0)"
+            print("WARNING: Auxiliary Data Length must be zero (0)")
         return pkt
 
 
@@ -197,7 +197,7 @@
 
 if __name__ == "__main__":
 
-    print "test float encoding"
+    print("test float encoding")
     from math import log
     max_expected_error = 1.0 / (2<<3) # four bit precision
     p = IGMPv3()
@@ -207,37 +207,37 @@
         rel_err = float(v-d)/v if v!=0 else 0.0
         assert rel_err <= max_expected_error
 
-    print "construct membership query - general query"
+    print("construct membership query - general query")
     mq = IGMPv3(type=IGMP_TYPE_MEMBERSHIP_QUERY, max_resp_code=120)
     hexdump(str(mq))
 
-    print "construct membership query - group-specific query"
+    print("construct membership query - group-specific query")
     mq = IGMPv3(type=IGMP_TYPE_MEMBERSHIP_QUERY, max_resp_code=120, gaddr="224.0.0.1")
     hexdump(str(mq))
 
-    print "construct membership query - group-and-source-specific query"
+    print("construct membership query - group-and-source-specific query")
     mq = IGMPv3(type=IGMP_TYPE_MEMBERSHIP_QUERY, max_resp_code=120, gaddr="224.0.0.1")
     mq.srcs = ['1.2.3.4', '5.6.7.8']
     hexdump(str(mq))
 
-    print "fixup"
+    print("fixup")
     mq = IGMPv3(type=IGMP_TYPE_MEMBERSHIP_QUERY)
     mq.srcs = ['1.2.3.4', '5.6.7.8']
     pkt = Ether() / IP() / mq
-    print "before fixup:"
+    print("before fixup:")
     hexdump(str(pkt))
 
-    print "after fixup:"
+    print("after fixup:")
 
     IGMPv3.fixup(pkt,'no')
     hexdump(str(pkt))
 
-    print "construct v3 membership report - join a single group"
+    print("construct v3 membership report - join a single group")
     mr = IGMPv3(type=IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30, gaddr="224.0.0.1")
     mr.grps = [IGMPv3gr( rtype=IGMP_V3_GR_TYPE_EXCLUDE, mcaddr="229.10.20.30")]
     hexdump(mr)
 
-    print "construct v3 membership report - join two groups"
+    print("construct v3 membership report - join two groups")
     mr = IGMPv3(type=IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30, gaddr="224.0.0.1")
     mr.grps = [
         IGMPv3gr(rtype=IGMP_V3_GR_TYPE_EXCLUDE, mcaddr="229.10.20.30"),
@@ -245,9 +245,9 @@
     ]
     hexdump(mr)
 
-    print "construct v3 membership report - leave a group"
+    print("construct v3 membership report - leave a group")
     mr = IGMPv3(type=IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30, gaddr="224.0.0.1")
     mr.grps = [IGMPv3gr(rtype=IGMP_V3_GR_TYPE_INCLUDE, mcaddr="229.10.20.30")]
     hexdump(mr)
 
-    print "all ok"
+    print("all ok")
diff --git a/src/test/utils/OnosFlowCtrl.py b/src/test/utils/OnosFlowCtrl.py
index 8ccc095..f3ab4fe 100644
--- a/src/test/utils/OnosFlowCtrl.py
+++ b/src/test/utils/OnosFlowCtrl.py
@@ -19,8 +19,8 @@
 from nose.tools import *
 import logging
 logging.getLogger('scapy.runtime').setLevel(logging.ERROR)
-from scapy.all import *
 from OnosCtrl import OnosCtrl, get_controller
+from CordTestUtils import log_test
 
 class OnosFlowCtrl:
 
@@ -296,13 +296,13 @@
         response = requests.post(url, auth = self.auth, data = json.dumps(flowJson) )
         if response.ok:
             if response.status_code in [200, 201]:
-                log.info('Successfully POSTED flow for device %s' %str(deviceId))
+                log_test.info('Successfully POSTED flow for device %s' %str(deviceId))
                 return True
             else:
-                log.info('Post flow for device %s failed with status %d' %(str(deviceId),
+                log_test.info('Post flow for device %s failed with status %d' %(str(deviceId),
                                                                            response.status_code))
                 return False
         else:
-            log.error('Flow post request returned with status %d' %response.status_code)
+            log_test.error('Flow post request returned with status %d' %response.status_code)
 
         return False
diff --git a/src/test/utils/SSHTestAgent.py b/src/test/utils/SSHTestAgent.py
index e9022af..b2d1342 100644
--- a/src/test/utils/SSHTestAgent.py
+++ b/src/test/utils/SSHTestAgent.py
@@ -2,7 +2,7 @@
 from paramiko import SSHClient, WarningPolicy, AutoAddPolicy
 import logging
 logging.getLogger('scapy.runtime').setLevel(logging.ERROR)
-from scapy.all import *
+from CordTestUtils import log_test
 
 class SSHTestAgent(object):
     key_file = os.getenv('SSH_KEY_FILE', None)
@@ -30,7 +30,7 @@
             self.client.connect(self.host, username = self.user, password = self.password,
                                 key_filename = self.key_file, timeout=timeout, port = self.port)
         except:
-            log.error('Unable to connect to test host %s' %self.host)
+            log_test.error('Unable to connect to test host %s' %self.host)
             return False, None
 
         channel = self.client.get_transport().open_session()
diff --git a/src/test/utils/Xos.py b/src/test/utils/Xos.py
index 20f2ee7..d4ce783 100644
--- a/src/test/utils/Xos.py
+++ b/src/test/utils/Xos.py
@@ -1,5 +1,6 @@
 import os,time
 from CordContainer import Container
+from CordTestUtils import log_test
 
 class XosBase(object):
     workspace = '/tmp/xos_scratch_workspace'
@@ -69,13 +70,13 @@
 
     def start_services(self):
         if not self.__ssh_key_check():
-            log.info('SSH keys need to be generated before building XOS service containers')
-            log.info('Use the following commands to generate ssh keys')
-            log.info('ssh-keygen -t rsa -q -N ""')
-            log.info('ssh-copy-id -i $HOME/.ssh/id_rsa ubuntu@localhost')
+            log_test.info('SSH keys need to be generated before building XOS service containers')
+            log_test.info('Use the following commands to generate ssh keys')
+            log_test.info('ssh-keygen -t rsa -q -N ""')
+            log_test.info('ssh-copy-id -i $HOME/.ssh/id_rsa ubuntu@localhost')
             return False
         if not os.access(self.profile_dir, os.F_OK):
-            log.error('Profile directory %s does not exist' %self.profile_dir)
+            log_test.error('Profile directory %s does not exist' %self.profile_dir)
             return False
         self.build_images()
         ##copy the keys to the profile dir
diff --git a/src/test/vrouter/vrouterTest.py b/src/test/vrouter/vrouterTest.py
index dc1f281..ee7328d 100644
--- a/src/test/vrouter/vrouterTest.py
+++ b/src/test/vrouter/vrouterTest.py
@@ -16,7 +16,7 @@
 import unittest
 from nose.tools import *
 from scapy.all import *
-from CordTestUtils import get_mac
+from CordTestUtils import get_mac, log_test
 from OnosCtrl import OnosCtrl
 from OltConfig import OltConfig
 from OnosFlowCtrl import OnosFlowCtrl
@@ -38,7 +38,7 @@
 #from cli import system
 #from generic import *
 
-log.setLevel('INFO')
+log_test.setLevel('INFO')
 
 class vrouter_exchange(CordLogger):
 
@@ -136,7 +136,7 @@
     def onos_load_config(cls, config):
         status, code = OnosCtrl.config(config)
         if status is False:
-            log.info('JSON request returned status %d' %code)
+            log_test.info('JSON request returned status %d' %code)
             assert_equal(status, True)
 
     @classmethod
@@ -158,7 +158,7 @@
         for host,_ in peer_info:
             iface = cls.port_map[index]
             index += 1
-            log.info('Assigning ip %s to interface %s' %(host, iface))
+            log_test.info('Assigning ip %s to interface %s' %(host, iface))
             config_cmds = ( 'ifconfig {} 0'.format(iface),
                             'ifconfig {0} {1}'.format(iface, host),
                             'arping -I {0} {1} -c 2'.format(iface, host),
@@ -187,12 +187,12 @@
             config = dict(res)
         else:
             config = network_cfg
-        log.info('Restarting ONOS with new network configuration')
+        log_test.info('Restarting ONOS with new network configuration')
         return cord_test_onos_restart(config = config)
 
     @classmethod
     def start_quagga(cls, networks = 4, peer_address = None, router_address = None):
-        log.info('Restarting Quagga container with configuration for %d networks' %(networks))
+        log_test.info('Restarting Quagga container with configuration for %d networks' %(networks))
         config = cls.generate_conf(networks = networks, peer_address = peer_address, router_address = router_address)
         if networks <= 10000:
             boot_delay = 25
@@ -286,7 +286,7 @@
         cls.network_list = network_list
         cls.network_mask = network_mask
         zebra_routes = '\n'.join(net_list)
-        #log.info('Zebra routes: \n:%s\n' %cls.zebra_conf + zebra_routes)
+        #log_test.info('Zebra routes: \n:%s\n' %cls.zebra_conf + zebra_routes)
         return cls.zebra_conf + zebra_routes
 
     @classmethod
@@ -321,7 +321,7 @@
         self.start_sending = True
         def recv_task():
             def recv_cb(pkt):
-                log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
+                log_test.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
                 self.success = True if positive_test else False
             sniff(count=count, timeout=timeout,
                   lfilter = lambda p: IP in p and p[IP].dst == dst_ip and p[IP].src == src_ip,
@@ -333,7 +333,7 @@
         L2 = Ether(src = src_mac, dst = dst_mac)
         L3 = IP(src = src_ip, dst = dst_ip)
         pkt = L2/L3
-        log.info('Sending a packet with dst ip %s, dst mac %s on port %s to verify if flows are correct' %
+        log_test.info('Sending a packet with dst ip %s, dst mac %s on port %s to verify if flows are correct' %
                  (dst_ip, dst_mac, self.port_map[egress]))
         while self.start_sending is True:
             sendp(pkt, count=50, iface = self.port_map[egress])
@@ -382,11 +382,11 @@
         self.cliEnter()
         ##Now verify
         hosts = json.loads(self.cli.hosts(jsonFormat = True))
-        log.info('Discovered hosts: %s' %hosts)
+        log_test.info('Discovered hosts: %s' %hosts)
         ##We read from cli if we expect less number of routes to avoid cli timeouts
         if networks <= 10000:
             routes = json.loads(self.cli.routes(jsonFormat = True))
-            #log.info('Routes: %s' %routes)
+            #log_test.info('Routes: %s' %routes)
             if start_network is not None:
                if start_network.split('/')[1] is 24:
                   assert_equal(len(routes['routes4']), networks)
@@ -398,7 +398,7 @@
                assert_equal(len(routes['routes4']), 0)
             flows = json.loads(self.cli.flows(jsonFormat = True))
             flows = filter(lambda f: f['flows'], flows)
-            #log.info('Flows: %s' %flows)
+            #log_test.info('Flows: %s' %flows)
             assert_not_equal(len(flows), 0)
         if invalid_peers is None:
             self.vrouter_traffic_verify()
@@ -413,11 +413,11 @@
             self.vrouter_traffic_verify(positive_test = False)
             self.network_list = network_list_backup
         if deactivate_activate_vrouter is True:
-            log.info('Deactivating vrouter app in ONOS controller for negative scenario')
+            log_test.info('Deactivating vrouter app in ONOS controller for negative scenario')
             self.vrouter_activate(deactivate = True)
             #routes = json.loads(self.cli.routes(jsonFormat = False, cmd_exist = False))
             #assert_equal(len(routes['routes4']), 'Command not found')
-            log.info('Activating vrouter app again in ONOS controller for negative scenario')
+            log_test.info('Activating vrouter app again in ONOS controller for negative scenario')
             self.vrouter_activate(deactivate = False)
             routes = json.loads(self.cli.routes(jsonFormat = True))
             assert_equal(len(routes['routes4']), networks)
@@ -428,7 +428,7 @@
 
     def __vrouter_network_verify_negative(self, networks, peers = 1):
         ##Stop quagga. Test traffic again to see if flows were removed
-        log.info('Stopping Quagga container')
+        log_test.info('Stopping Quagga container')
         cord_test_quagga_stop()
         if networks <= 10000:
             routes = json.loads(self.cli.routes(jsonFormat = True))
@@ -436,14 +436,14 @@
             if routes and routes.has_key('routes4'):
                 assert_equal(len(routes['routes4']), 0)
         self.vrouter_traffic_verify(positive_test = False)
-        log.info('OVS flows have been removed successfully after Quagga was stopped')
+        log_test.info('OVS flows have been removed successfully after Quagga was stopped')
         self.start_quagga(networks = networks)
         ##Verify the flows again after restarting quagga back
         if networks <= 10000:
             routes = json.loads(self.cli.routes(jsonFormat = True))
             assert_equal(len(routes['routes4']), networks)
         self.vrouter_traffic_verify()
-        log.info('OVS flows have been successfully reinstalled after Quagga was restarted')
+        log_test.info('OVS flows have been successfully reinstalled after Quagga was restarted')
 
     def quagga_shell(self, cmd):
         shell_cmds = ('vtysh', '"conf t"', '"{}"'.format(cmd))
diff --git a/src/test/xos/xosTest.py b/src/test/xos/xosTest.py
index baefb01..d3ffcf7 100644
--- a/src/test/xos/xosTest.py
+++ b/src/test/xos/xosTest.py
@@ -18,8 +18,8 @@
 from docker import Client
 from itertools import chain
 from nose.tools import *
-from scapy.all import *
 from CordContainer import *
+from CordTestUtils import log_test as log
 import threading
 import time
 import os
@@ -522,4 +522,3 @@
 
     def test_xos_api_core_get_all_users(self):
         self.validate_url_response_data(url = self.XOS_API_CORE_GET_ALL_USERS)
-
