diff --git a/TestON/bin/cli.py b/TestON/bin/cli.py
index a7e1297..5a0b3d5 100755
--- a/TestON/bin/cli.py
+++ b/TestON/bin/cli.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-'''
+"""
 Created on 20-Dec-2012
 Copyright 2012 Open Networking Foundation
 
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,9 +21,7 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
-'''
-
-
+"""
 """
 cli will provide the CLI shell for teston framework.
 
@@ -35,7 +33,6 @@
 teston> run test DpctlTest
 Several useful commands are provided.
 """
-
 from subprocess import call
 from cmd import Cmd
 from os import isatty
@@ -46,16 +43,18 @@
 import threading
 import __builtin__
 import pprint
-dump = pprint.PrettyPrinter(indent=4)
+dump = pprint.PrettyPrinter( indent=4 )
 __builtin__.testthread = False
 introduction = "TestON is the testing framework \nDeveloped by Paxterra Solutions (www.paxterrasolutions.com)"
 __builtin__.COLORS = False
 
-path = re.sub( "/bin$", "", sys.path[0] )
+path = re.sub( "/bin$", "", sys.path[ 0 ] )
 sys.path.insert( 1, path )
 from core.teston import *
 
-class CLI( threading.Thread,Cmd,object ):
+
+class CLI( threading.Thread, Cmd, object ):
+
     "command-line interface to execute the test."
 
     prompt = 'teston> '
@@ -64,7 +63,7 @@
         self.teston = teston
 
         self._mainevent = threading.Event()
-        threading.Thread.__init__(self)
+        threading.Thread.__init__( self )
         self.main_stop = False
         self.locals = { 'test': teston }
         self.stdin = stdin
@@ -86,69 +85,70 @@
         Cmd.do_help( self, line )
         if line is '':
             output( self.helpStr )
-    def do_run(self,args):
-        '''
+
+    def do_run( self, args ):
+        """
         run command will execute the test with following optional command line arguments
         logdir <directory to store logs in>
         testcases <list of testcases separated by comma or range of testcases separated by hypen>
         mail <mail-id or list of mail-ids seperated by comma>
         example 1, to execute the examples specified in the ~/examples diretory.
-        '''
+        """
         try:
             args = args.split()
             options = {}
-            options = self.parseArgs(args,options)
-            options = dictToObj(options)
+            options = self.parseArgs( args, options )
+            options = dictToObj( options )
             if not testthread:
-                test = TestThread(options)
+                test = TestThread( options )
                 test.start()
                 while test.isAlive():
-                    test.join(1)
+                    test.join( 1 )
             else:
-                print main.TEST+ " test execution paused, please resume that before executing to another test"
+                print main.TEST + " test execution paused, please resume that before executing to another test"
         except KeyboardInterrupt, SystemExit:
             print "Interrupt called, Exiting."
             test._Thread__stop()
             main.cleanup()
             main.exit()
 
-    def do_resume(self, line):
-        '''
+    def do_resume( self, line ):
+        """
         resume command will continue the execution of paused test.
         teston>resume
-        [2013-01-07 23:03:44.640723] [PoxTest] [STEP]  1.1: Checking the host reachability using pingHost
+        [ 2013-01-07 23:03:44.640723 ] [ PoxTest ] [ STEP ]  1.1: Checking the host reachability using pingHost
         2013-01-07 23:03:44,858 - PoxTest - INFO - Expected Prompt Found
         ....
-        '''
+        """
         if testthread:
             testthread.play()
-        else :
+        else:
             print "There is no test to resume"
 
-    def do_nextstep(self,line):
-        '''
+    def do_nextstep( self, line ):
+        """
         nextstep will execute the next-step of the paused test and
         it will pause the test after finishing of step.
 
         teston> nextstep
         Will pause the test's execution, after completion of this step.....
 
-        teston> [2013-01-07 21:24:26.286601] [PoxTest] [STEP]  1.8: Checking the host reachability using pingHost
+        teston> [ 2013-01-07 21:24:26.286601 ] [ PoxTest ] [ STEP ]  1.8: Checking the host reachability using pingHost
         2013-01-07 21:24:26,455 - PoxTest - INFO - Expected Prompt Found
         .....
         teston>
 
-        '''
+        """
         if testthread:
-            main.log.info("Executing the nextstep, Will pause test execution, after completion of the step")
+            main.log.info( "Executing the nextstep, Will pause test execution, after completion of the step" )
             testthread.play()
-            time.sleep(.1)
+            time.sleep( .1 )
             testthread.pause()
         else:
             print "There is no paused test "
 
-    def do_dumpvar(self,line):
-        '''
+    def do_dumpvar( self, line ):
+        """
         dumpvar will print all the test data in raw format.
         usgae :
         teston>dumpvar main
@@ -159,56 +159,54 @@
 
         teston>dumpvar topology
         here 'topology' will be topology specification of the test specified in topo file.
-        '''
+        """
         if testthread:
             if line == "main":
-                dump.pprint(vars(main))
-            else :
-                try :
-                    dump.pprint(vars(main)[line])
+                dump.pprint( vars( main ) )
+            else:
+                try:
+                    dump.pprint( vars( main )[ line ] )
                 except KeyError as e:
                     print e
-        else :
+        else:
             print "There is no paused test "
 
-    def do_currentcase(self,line):
-        '''
+    def do_currentcase( self, line ):
+        """
         currentcase will return the current case in the test execution.
 
         teston>currentcase
         Currently executing test case is: 2
 
-        '''
+        """
         if testthread:
-            print "Currently executing test case is: "+str(main.CurrentTestCaseNumber)
-        else :
+            print "Currently executing test case is: " + str( main.CurrentTestCaseNumber )
+        else:
             print "There is no paused test "
 
-
-    def do_currentstep(self,line):
-        '''
+    def do_currentstep( self, line ):
+        """
         currentstep will return the current step in the test execution.
 
         teston>currentstep
         Currently executing test step is: 2.3
-        '''
+        """
         if testthread:
-            print "Currently executing test step is: "+str(main.CurrentTestCaseNumber)+'.'+str(main.stepCount)
-        else :
+            print "Currently executing test step is: " + str( main.CurrentTestCaseNumber ) + '.' + str( main.stepCount )
+        else:
             print "There is no paused test "
 
-
-    def do_stop(self,line):
-        '''
+    def do_stop( self, line ):
+        """
         Will stop the paused test, if any !
-        '''
+        """
         if testthread:
             testthread.stop()
 
         return 'exited by user command'
 
-    def do_gettest(self,line):
-        '''
+    def do_gettest( self, line ):
+        """
         gettest will return the test name which is under execution or recently executed.
 
         Test under execution:
@@ -217,18 +215,18 @@
 
         Test recently executed:
         Recently executed test is: MininetTest
-        '''
-        try :
-            if testthread :
-                print "Currently executing Test is: "+main.TEST
-            else :
-                print "Recently executed test is: "+main.TEST
+        """
+        try:
+            if testthread:
+                print "Currently executing Test is: " + main.TEST
+            else:
+                print "Recently executed test is: " + main.TEST
 
         except NameError:
             print "There is no previously executed Test"
 
-    def do_showlog(self,line):
-        '''
+    def do_showlog( self, line ):
+        """
         showlog will show the test's Log
         teston>showlog
         Last executed test's log is : //home/openflow/TestON/logs/PoxTest_07_Jan_2013_21_42_11/PoxTest_07_Jan_2013_21_42_11.log
@@ -236,17 +234,17 @@
         teston>showlog
         Currently executing Test's log is: /home/openflow/TestON/logs/PoxTest_07_Jan_2013_21_46_58/PoxTest_07_Jan_2013_21_46_58.log
         .....
-        '''
-        try :
-            if testthread :
-                print "Currently executing Test's log is: "+main.LogFileName
+        """
+        try:
+            if testthread:
+                print "Currently executing Test's log is: " + main.LogFileName
 
-            else :
-                print "Last executed test's log is : "+main.LogFileName
+            else:
+                print "Last executed test's log is : " + main.LogFileName
 
             logFile = main.LogFileName
-            logFileHandler = open(logFile, 'r')
-            for msg in logFileHandler.readlines() :
+            logFileHandler = open( logFile, 'r' )
+            for msg in logFileHandler.readlines():
                 print msg,
 
             logFileHandler.close()
@@ -254,79 +252,77 @@
         except NameError:
             print "There is no previously executed Test"
 
-
-
-    def parseArgs(self,args,options):
-        '''
+    def parseArgs( self, args, options ):
+        """
         This will parse the command line arguments.
-        '''
-        options = self.initOptions(options)
-        try :
+        """
+        options = self.initOptions( options )
+        try:
             index = 0
             while index < len( args ):
-                option = args[index]
-                if index > 0 :
-                    if re.match("--params", option, flags=0):
+                option = args[ index ]
+                if index > 0:
+                    if re.match( "--params", option, flags=0 ):
                         # check if there is a params
-                        options['params'].append(args[index+1])
-                    elif re.match("logdir|mail|example|testdir|testcases|onoscell", option, flags = 0):
-                        options[option] = args[index+1]
-                        options = self.testcasesInRange(index+1,option,args,options)
+                        options[ 'params' ].append( args[ index + 1 ] )
+                    elif re.match( "logdir|mail|example|testdir|testcases|onoscell", option, flags=0 ):
+                        options[ option ] = args[ index + 1 ]
+                        options = self.testcasesInRange( index + 1, option, args, options )
                     index += 2
-                else :
-                    options['testname'] = option
+                else:
+                    options[ 'testname' ] = option
                     index += 1
         except IndexError as e:
-            print (e)
+            print ( e )
             main.cleanup()
             main.exit()
 
         return options
 
-    def initOptions(self,options):
-        '''
+    def initOptions( self, options ):
+        """
         This will initialize the commandline options.
-        '''
-        options['logdir'] = None
-        options['mail'] = None
-        options['example'] = None
-        options['testdir'] = None
-        options['testcases'] = None
-        options['onoscell'] = None
+        """
+        options[ 'logdir' ] = None
+        options[ 'mail' ] = None
+        options[ 'example' ] = None
+        options[ 'testdir' ] = None
+        options[ 'testcases' ] = None
+        options[ 'onoscell' ] = None
         # init params as a empty list
-        options['params'] = []
+        options[ 'params' ] = []
         return options
 
-    def testcasesInRange(self,index,option,args,options):
-        '''
-        This method will handle testcases list,specified in range [1-10].
-        '''
-        if re.match("testcases",option,1):
+    def testcasesInRange( self, index, option, args, options ):
+        """
+        This method will handle testcases list,specified in range [ 1-10 ].
+        """
+        if re.match( "testcases", option, 1 ):
             testcases = []
-            args[index] = re.sub("\[|\]","",args[index],0)
-            m = re.match("(\d+)\-(\d+)",args[index],flags=0)
+            args[ index ] = re.sub( "\[|\]", "", args[ index ], 0 )
+            m = re.match( "(\d+)\-(\d+)", args[ index ], flags=0 )
             if m:
-                start_case = eval(m.group(1))
-                end_case = eval(m.group(2))
-                if (start_case <= end_case):
+                start_case = eval( m.group( 1 ) )
+                end_case = eval( m.group( 2 ) )
+                if ( start_case <= end_case ):
                     i = start_case
                     while i <= end_case:
-                        testcases.append(i)
-                        i= i+1
-                else :
+                        testcases.append( i )
+                        i = i + 1
+                else:
                     print "Please specify testcases properly like 1-5"
-            else :
-                options[option] = args[index]
+            else:
+                options[ option ] = args[ index ]
                 return options
-            options[option] = str(testcases)
+            options[ option ] = str( testcases )
 
         return options
 
-    def cmdloop(self, intro=introduction):
+    def cmdloop( self, intro=introduction ):
         print introduction
         while True:
             try:
-                super(CLI, self).cmdloop(intro="")
+                super( CLI, self ).cmdloop( intro="" )
                 self.postloop()
             except KeyboardInterrupt:
                 if testthread:
@@ -336,69 +332,68 @@
                     sys.exit()
 
     def do_echo( self, line ):
-        '''
+        """
         Echoing of given input.
-        '''
-        output(line)
+        """
+        output( line )
 
     def do_sh( self, line ):
-        '''
+        """
         Run an external shell command
         sh pwd
         sh ifconfig etc.
-        '''
+        """
         call( line, shell=True )
 
-
     def do_py( self, line ):
-        '''
+        """
         Evaluate a Python expression.
 
-        py main.log.info("Sample Log Information")
+        py main.log.info( "Sample Log Information" )
         2013-01-07 12:07:26,804 - PoxTest - INFO - Sample Log Information
 
-        '''
+        """
         try:
             exec( line )
         except Exception as e:
             output( str( e ) + '\n' )
 
-    def do_interpret(self,line):
-        '''
+    def do_interpret( self, line ):
+        """
         interpret will translate the single line openspeak statement to equivalent python script.
 
         teston> interpret ASSERT result EQUALS main.TRUE ONPASS "Ping executed successfully" ONFAIL "Ping failed"
-        utilities.assert_equals(expect=main.TRUE,actual=result,onpass="Ping executed successfully",onfail="Ping failed")
+        utilities.assert_equals( expect=main.TRUE,actual=result,onpass="Ping executed successfully",onfail="Ping failed" )
 
-        '''
+        """
         from core import openspeak
         ospk = openspeak.OpenSpeak()
-        try :
-            translated_code = ospk.interpret(text=line)
+        try:
+            translated_code = ospk.interpret( text=line )
             print translated_code
         except AttributeError as e:
             print 'Dynamic params are not allowed in single statement translations'
 
-    def do_do (self,line):
-        '''
+    def do_do( self, line ):
+        """
         Do will translate and execute the openspeak statement for the paused test.
         do <OpenSpeak statement>
-        '''
+        """
         if testthread:
             from core import openspeak
             ospk = openspeak.OpenSpeak()
-            try :
-                translated_code = ospk.interpret(text=line)
-                eval(translated_code)
+            try:
+                translated_code = ospk.interpret( text=line )
+                eval( translated_code )
             except ( AttributeError, SyntaxError ) as e:
                 print 'Dynamic params are not allowed in single statement translations:'
                 print e
-        else :
+        else:
             print "Do will translate and execute the openspeak statement for the paused test.\nPlease use interpret to translate the OpenSpeak statement."
 
-    def do_compile(self,line):
-        '''
-        compile will translate the openspeak (.ospk) file into TestON test script (python).
+    def do_compile( self, line ):
+        """
+        compile will translate the openspeak ( .ospk ) file into TestON test script ( python ).
         It will receive the openspeak file path as input and will generate
         equivalent test-script file in the same directory.
 
@@ -407,15 +402,15 @@
         teston>compile /home/openflow/TestON/PoxTest.ospk
 
         Auto-generated test-script file is /home/openflow/TestON/PoxTest.py
-        '''
+        """
         from core import openspeak
         openspeak = openspeak.OpenSpeak()
         openspeakfile = line
-        if os.path.exists(openspeakfile) :
-            openspeak.compiler(openspeakfile=openspeakfile,writetofile=1)
-            print "Auto-generated test-script file is "+ re.sub("ospk","py",openspeakfile,0)
+        if os.path.exists( openspeakfile ):
+            openspeak.compiler( openspeakfile=openspeakfile, writetofile=1 )
+            print "Auto-generated test-script file is " + re.sub( "ospk", "py", openspeakfile, 0 )
         else:
-            print 'There is no such file : '+line
+            print 'There is no such file : ' + line
 
     def do_exit( self, _line ):
         "Exit"
@@ -440,7 +435,7 @@
         return isatty( self.stdin.fileno() )
 
     def do_source( self, line ):
-        '''
+        """
         Read shell commands from an input file and execute them sequentially.
         cmdsource.txt :
 
@@ -451,10 +446,9 @@
         /home/openflow/TestON/bin/
         cli.py  __init__.py
 
-        '''
-
+        """
         args = line.split()
-        if len(args) != 1:
+        if len( args ) != 1:
             error( 'usage: source <file>\n' )
             return
         try:
@@ -471,43 +465,45 @@
     def do_time( self, line ):
         "Measure time taken for any command in TestON."
         start = time.time()
-        self.onecmd(line)
+        self.onecmd( line )
         elapsed = time.time() - start
-        self.stdout.write("*** Elapsed time: %0.6f secs\n" % elapsed)
+        self.stdout.write( "*** Elapsed time: %0.6f secs\n" % elapsed )
 
     def default( self, line ):
-        """Called on an input line when the command prefix is not recognized."""
+        "Called on an input line when the command prefix is not recognized."
         first, args, line = self.parseline( line )
         if not args:
             return
-        if args and len(args) > 0 and args[ -1 ] == '\n':
+        if args and len( args ) > 0 and args[ -1 ] == '\n':
             args = args[ :-1 ]
         rest = args.split( ' ' )
 
         error( '*** Unknown command: %s\n' % first )
 
-class TestThread(threading.Thread):
-    '''
+
+class TestThread( threading.Thread ):
+
+    """
     TestThread class will handle the test execution and will communicate with the thread in the do_run.
-    '''
-    def __init__(self,options):
+    """
+    def __init__( self, options ):
         self._stopevent = threading.Event()
-        threading.Thread.__init__(self)
+        threading.Thread.__init__( self )
         self.is_stop = False
         self.options = options
         __builtin__.testthread = self
 
-    def run(self):
-        '''
+    def run( self ):
+        """
         Will execute the test.
-        '''
-        while not self.is_stop :
+        """
+        while not self.is_stop:
             if not self._stopevent.isSet():
-                self.test_on = TestON(self.options)
-                try :
+                self.test_on = TestON( self.options )
+                try:
                     if self.test_on.init_result:
                         result = self.test_on.run()
-                        if not self.is_stop :
+                        if not self.is_stop:
                             result = self.test_on.cleanup()
                         self.is_stop = True
                 except KeyboardInterrupt:
@@ -517,10 +513,10 @@
 
         __builtin__.testthread = False
 
-    def pause(self):
-        '''
+    def pause( self ):
+        """
         Will pause the test.
-        '''
+        """
         if not cli.pause:
             print "Will pause the test's execution, after completion of this step.....\n\n\n\n"
             cli.pause = True
@@ -533,56 +529,59 @@
             result = self.test_on.cleanup()
             self.is_stop = True
 
-    def play(self):
-        '''
+    def play( self ):
+        """
         Will resume the paused test.
-        '''
+        """
         self._stopevent.clear()
         cli.pause = False
 
-    def stop(self):
-        '''
+    def stop( self ):
+        """
         Will stop the test execution.
-        '''
-
+        """
         print "Stopping the test"
         self.is_stop = True
         cli.stop = True
         __builtin__.testthread = False
 
-def output(msg):
-    '''
+
+def output( msg ):
+    """
     Simply, print the message in console
-    '''
+    """
     print msg
 
-def error(msg):
-    '''
+
+def error( msg ):
+    """
     print the error message.
-    '''
+    """
     print msg
 
-def dictToObj(dictionary):
-    '''
+
+def dictToObj( dictionary ):
+    """
     This will facilitates the converting of the dictionary to the object.
     This method will help to send options as object format to the test.
-    '''
-    if isinstance(dictionary, list):
-        dictionary = [dictToObj(x) for x in dictionary]
-    if not isinstance(dictionary, dict):
+    """
+    if isinstance( dictionary, list ):
+        dictionary = [ dictToObj( x ) for x in dictionary ]
+    if not isinstance( dictionary, dict ):
         return dictionary
-    class Convert(object):
+
+    class Convert( object ):
         pass
     obj = Convert()
     for k in dictionary:
-        obj.__dict__[k] = dictToObj(dictionary[k])
+        obj.__dict__[ k ] = dictToObj( dictionary[ k ] )
     return obj
 
 
 if __name__ == '__main__':
-    if len(sys.argv) > 1:
+    if len( sys.argv ) > 1:
         __builtin__.COLORS = True
-        CLI("test").onecmd(' '.join(sys.argv[1:]))
+        CLI( "test" ).onecmd( ' '.join( sys.argv[ 1: ] ) )
     else:
         __builtin__.COLORS = False
-        CLI("test").cmdloop()
+        CLI( "test" ).cmdloop()
diff --git a/TestON/core/Thread.py b/TestON/core/Thread.py
index 4c040a6..9c655a5 100644
--- a/TestON/core/Thread.py
+++ b/TestON/core/Thread.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
-'''
-Copyright 2015 Open Networking Foundation (ONF)
+"""
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,10 +19,12 @@
 
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-'''
+"""
 import threading
 
+
 class Thread( threading.Thread ):
+
     def __init__( self, target=None, threadID=None, name="", args=(),
                   kwargs={} ):
         super( Thread, self ).__init__()
diff --git a/TestON/core/ast.py b/TestON/core/ast.py
index fd5dfdb..33464da 100644
--- a/TestON/core/ast.py
+++ b/TestON/core/ast.py
@@ -19,7 +19,7 @@
     Additionally various helper functions are provided that make working with
     the trees simpler.  The main intention of the helper functions and this
     module in general is to provide an easy to use interface for libraries
-    that work tightly with the python syntax (template engines for example).
+    that work tightly with the python syntax ( template engines for example ).
 
 
     :copyright: Copyright 2008 by Armin Ronacher.
@@ -29,58 +29,59 @@
 from _ast import __version__
 
 
-def parse(source, filename='<unknown>', mode='exec'):
+def parse( source, filename='<unknown>', mode='exec' ):
     """
     Parse the source into an AST node.
-    Equivalent to compile(source, filename, mode, PyCF_ONLY_AST).
+    Equivalent to compile( source, filename, mode, PyCF_ONLY_AST ).
     """
-    return compile(source, filename, mode, PyCF_ONLY_AST)
+    return compile( source, filename, mode, PyCF_ONLY_AST )
 
 
-def literal_eval(node_or_string):
+def literal_eval( node_or_string ):
     """
     Safely evaluate an expression node or a string containing a Python
     expression.  The string or node provided may only consist of the following
     Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
     and None.
     """
-    _safe_names = {'None': None, 'True': True, 'False': False}
-    if isinstance(node_or_string, basestring):
-        node_or_string = parse(node_or_string, mode='eval')
-    if isinstance(node_or_string, Expression):
+    _safe_names = { 'None': None, 'True': True, 'False': False }
+    if isinstance( node_or_string, basestring ):
+        node_or_string = parse( node_or_string, mode='eval' )
+    if isinstance( node_or_string, Expression ):
         node_or_string = node_or_string.body
-    def _convert(node):
-        if isinstance(node, Str):
+
+    def _convert( node ):
+        if isinstance( node, Str ):
             return node.s
-        elif isinstance(node, Num):
+        elif isinstance( node, Num ):
             return node.n
-        elif isinstance(node, Tuple):
-            return tuple(map(_convert, node.elts))
-        elif isinstance(node, List):
-            return list(map(_convert, node.elts))
-        elif isinstance(node, Dict):
-            return dict((_convert(k), _convert(v)) for k, v
-                        in zip(node.keys, node.values))
-        elif isinstance(node, Name):
+        elif isinstance( node, Tuple ):
+            return tuple( map( _convert, node.elts ) )
+        elif isinstance( node, List ):
+            return list( map( _convert, node.elts ) )
+        elif isinstance( node, Dict ):
+            return dict( ( _convert( k ), _convert( v ) ) for k, v
+                         in zip( node.keys, node.values ) )
+        elif isinstance( node, Name ):
             if node.id in _safe_names:
-                return _safe_names[node.id]
-        elif isinstance(node, BinOp) and \
-             isinstance(node.op, (Add, Sub)) and \
-             isinstance(node.right, Num) and \
-             isinstance(node.right.n, complex) and \
-             isinstance(node.left, Num) and \
-             isinstance(node.left.n, (int, long, float)):
+                return _safe_names[ node.id ]
+        elif isinstance( node, BinOp ) and \
+             isinstance( node.op, ( Add, Sub ) ) and \
+             isinstance( node.right, Num ) and \
+             isinstance( node.right.n, complex ) and \
+             isinstance( node.left, Num ) and \
+             isinstance( node.left.n, ( int, long, float ) ):
             left = node.left.n
             right = node.right.n
-            if isinstance(node.op, Add):
+            if isinstance( node.op, Add ):
                 return left + right
             else:
                 return left - right
-        raise ValueError('malformed string')
-    return _convert(node_or_string)
+        raise ValueError( 'malformed string' )
+    return _convert( node_or_string )
 
 
-def dump(node, annotate_fields=True, include_attributes=False):
+def dump( node, annotate_fields=True, include_attributes=False ):
     """
     Return a formatted dump of the tree in *node*.  This is mainly useful for
     debugging purposes.  The returned string will show the names and the values
@@ -89,40 +90,40 @@
     numbers and column offsets are not dumped by default.  If this is wanted,
     *include_attributes* can be set to True.
     """
-    def _format(node):
-        if isinstance(node, AST):
-            fields = [(a, _format(b)) for a, b in iter_fields(node)]
-            rv = '%s(%s' % (node.__class__.__name__, ', '.join(
-                ('%s=%s' % field for field in fields)
+    def _format( node ):
+        if isinstance( node, AST ):
+            fields = [ ( a, _format( b ) ) for a, b in iter_fields( node ) ]
+            rv = '%s(%s' % ( node.__class__.__name__, ', '.join(
+                ( '%s=%s' % field for field in fields )
                 if annotate_fields else
-                (b for a, b in fields)
-            ))
+                ( b for a, b in fields )
+            ) )
             if include_attributes and node._attributes:
                 rv += fields and ', ' or ' '
-                rv += ', '.join('%s=%s' % (a, _format(getattr(node, a)))
-                                for a in node._attributes)
+                rv += ', '.join( '%s=%s' % ( a, _format( getattr( node, a ) ) )
+                                 for a in node._attributes )
             return rv + ')'
-        elif isinstance(node, list):
-            return '[%s]' % ', '.join(_format(x) for x in node)
-        return repr(node)
-    if not isinstance(node, AST):
-        raise TypeError('expected AST, got %r' % node.__class__.__name__)
-    return _format(node)
+        elif isinstance( node, list ):
+            return '[%s]' % ', '.join( _format( x ) for x in node )
+        return repr( node )
+    if not isinstance( node, AST ):
+        raise TypeError( 'expected AST, got %r' % node.__class__.__name__ )
+    return _format( node )
 
 
-def copy_location(new_node, old_node):
+def copy_location( new_node, old_node ):
     """
-    Copy source location (`lineno` and `col_offset` attributes) from
+    Copy source location ( `lineno` and `col_offset` attributes ) from
     *old_node* to *new_node* if possible, and return *new_node*.
     """
     for attr in 'lineno', 'col_offset':
         if attr in old_node._attributes and attr in new_node._attributes \
-           and hasattr(old_node, attr):
-            setattr(new_node, attr, getattr(old_node, attr))
+           and hasattr( old_node, attr ):
+            setattr( new_node, attr, getattr( old_node, attr ) )
     return new_node
 
 
-def fix_missing_locations(node):
+def fix_missing_locations( node ):
     """
     When you compile a node tree with compile(), the compiler expects lineno and
     col_offset attributes for every node that supports them.  This is rather
@@ -130,91 +131,92 @@
     recursively where not already set, by setting them to the values of the
     parent node.  It works recursively starting at *node*.
     """
-    def _fix(node, lineno, col_offset):
+    def _fix( node, lineno, col_offset ):
         if 'lineno' in node._attributes:
-            if not hasattr(node, 'lineno'):
+            if not hasattr( node, 'lineno' ):
                 node.lineno = lineno
             else:
                 lineno = node.lineno
         if 'col_offset' in node._attributes:
-            if not hasattr(node, 'col_offset'):
+            if not hasattr( node, 'col_offset' ):
                 node.col_offset = col_offset
             else:
                 col_offset = node.col_offset
-        for child in iter_child_nodes(node):
-            _fix(child, lineno, col_offset)
-    _fix(node, 1, 0)
+        for child in iter_child_nodes( node ):
+            _fix( child, lineno, col_offset )
+    _fix( node, 1, 0 )
     return node
 
 
-def increment_lineno(node, n=1):
+def increment_lineno( node, n=1 ):
     """
     Increment the line number of each node in the tree starting at *node* by *n*.
     This is useful to "move code" to a different location in a file.
     """
-    for child in walk(node):
+    for child in walk( node ):
         if 'lineno' in child._attributes:
-            child.lineno = getattr(child, 'lineno', 0) + n
+            child.lineno = getattr( child, 'lineno', 0 ) + n
     return node
 
 
-def iter_fields(node):
+def iter_fields( node ):
     """
-    Yield a tuple of ``(fieldname, value)`` for each field in ``node._fields``
+    Yield a tuple of ``( fieldname, value )`` for each field in ``node._fields``
     that is present on *node*.
     """
     for field in node._fields:
         try:
-            yield field, getattr(node, field)
+            yield field, getattr( node, field )
         except AttributeError:
             pass
 
 
-def iter_child_nodes(node):
+def iter_child_nodes( node ):
     """
     Yield all direct child nodes of *node*, that is, all fields that are nodes
     and all items of fields that are lists of nodes.
     """
-    for name, field in iter_fields(node):
-        if isinstance(field, AST):
+    for name, field in iter_fields( node ):
+        if isinstance( field, AST ):
             yield field
-        elif isinstance(field, list):
+        elif isinstance( field, list ):
             for item in field:
-                if isinstance(item, AST):
+                if isinstance( item, AST ):
                     yield item
 
 
-def get_docstring(node, clean=True):
+def get_docstring( node, clean=True ):
     """
     Return the docstring for the given node or None if no docstring can
     be found.  If the node provided does not have docstrings a TypeError
     will be raised.
     """
-    if not isinstance(node, (FunctionDef, ClassDef, Module)):
-        raise TypeError("%r can't have docstrings" % node.__class__.__name__)
-    if node.body and isinstance(node.body[0], Expr) and \
-       isinstance(node.body[0].value, Str):
+    if not isinstance( node, ( FunctionDef, ClassDef, Module ) ):
+        raise TypeError( "%r can't have docstrings" % node.__class__.__name__ )
+    if node.body and isinstance( node.body[ 0 ], Expr ) and \
+       isinstance( node.body[ 0 ].value, Str ):
         if clean:
             import inspect
-            return inspect.cleandoc(node.body[0].value.s)
-        return node.body[0].value.s
+            return inspect.cleandoc( node.body[ 0 ].value.s )
+        return node.body[ 0 ].value.s
 
 
-def walk(node):
+def walk( node ):
     """
     Recursively yield all descendant nodes in the tree starting at *node*
-    (including *node* itself), in no specified order.  This is useful if you
+    ( including *node* itself ), in no specified order.  This is useful if you
     only want to modify nodes in place and don't care about the context.
     """
     from collections import deque
-    todo = deque([node])
+    todo = deque( [ node ] )
     while todo:
         node = todo.popleft()
-        todo.extend(iter_child_nodes(node))
+        todo.extend( iter_child_nodes( node ) )
         yield node
 
 
-class NodeVisitor(object):
+class NodeVisitor( object ):
+
     """
     A node visitor base class that walks the abstract syntax tree and calls a
     visitor function for every node found.  This function may return a value
@@ -227,31 +229,31 @@
     class name of the node.  So a `TryFinally` node visit function would
     be `visit_TryFinally`.  This behavior can be changed by overriding
     the `visit` method.  If no visitor function exists for a node
-    (return value `None`) the `generic_visit` visitor is used instead.
+    ( return value `None` ) the `generic_visit` visitor is used instead.
 
     Don't use the `NodeVisitor` if you want to apply changes to nodes during
-    traversing.  For this a special visitor exists (`NodeTransformer`) that
+    traversing.  For this a special visitor exists ( `NodeTransformer` ) that
     allows modifications.
     """
-
-    def visit(self, node):
-        """Visit a node."""
+    def visit( self, node ):
+        "Visit a node."
         method = 'visit_' + node.__class__.__name__
-        visitor = getattr(self, method, self.generic_visit)
-        return visitor(node)
+        visitor = getattr( self, method, self.generic_visit )
+        return visitor( node )
 
-    def generic_visit(self, node):
-        """Called if no explicit visitor function exists for a node."""
-        for field, value in iter_fields(node):
-            if isinstance(value, list):
+    def generic_visit( self, node ):
+        "Called if no explicit visitor function exists for a node."
+        for field, value in iter_fields( node ):
+            if isinstance( value, list ):
                 for item in value:
-                    if isinstance(item, AST):
-                        self.visit(item)
-            elif isinstance(value, AST):
-                self.visit(value)
+                    if isinstance( item, AST ):
+                        self.visit( item )
+            elif isinstance( value, AST ):
+                self.visit( value )
 
 
-class NodeTransformer(NodeVisitor):
+class NodeTransformer( NodeVisitor ):
+
     """
     A :class:`NodeVisitor` subclass that walks the abstract syntax tree and
     allows modification of nodes.
@@ -263,49 +265,48 @@
     original node in which case no replacement takes place.
 
     Here is an example transformer that rewrites all occurrences of name lookups
-    (``foo``) to ``data['foo']``::
+    ( ``foo`` ) to ``data[ 'foo' ]``::
 
-       class RewriteName(NodeTransformer):
+       class RewriteName( NodeTransformer ):
 
-           def visit_Name(self, node):
-               return copy_location(Subscript(
-                   value=Name(id='data', ctx=Load()),
-                   slice=Index(value=Str(s=node.id)),
+           def visit_Name( self, node ):
+               return copy_location( Subscript(
+                   value=Name( id='data', ctx=Load() ),
+                   slice=Index( value=Str( s=node.id ) ),
                    ctx=node.ctx
-               ), node)
+               ), node )
 
     Keep in mind that if the node you're operating on has child nodes you must
     either transform the child nodes yourself or call the :meth:`generic_visit`
     method for the node first.
 
-    For nodes that were part of a collection of statements (that applies to all
-    statement nodes), the visitor may also return a list of nodes rather than
+    For nodes that were part of a collection of statements ( that applies to all
+    statement nodes ), the visitor may also return a list of nodes rather than
     just a single node.
 
     Usually you use the transformer like this::
 
-       node = YourTransformer().visit(node)
+       node = YourTransformer().visit( node )
     """
-
-    def generic_visit(self, node):
-        for field, old_value in iter_fields(node):
-            old_value = getattr(node, field, None)
-            if isinstance(old_value, list):
+    def generic_visit( self, node ):
+        for field, old_value in iter_fields( node ):
+            old_value = getattr( node, field, None )
+            if isinstance( old_value, list ):
                 new_values = []
                 for value in old_value:
-                    if isinstance(value, AST):
-                        value = self.visit(value)
+                    if isinstance( value, AST ):
+                        value = self.visit( value )
                         if value is None:
                             continue
-                        elif not isinstance(value, AST):
-                            new_values.extend(value)
+                        elif not isinstance( value, AST ):
+                            new_values.extend( value )
                             continue
-                    new_values.append(value)
-                old_value[:] = new_values
-            elif isinstance(old_value, AST):
-                new_node = self.visit(old_value)
+                    new_values.append( value )
+                old_value[ : ] = new_values
+            elif isinstance( old_value, AST ):
+                new_node = self.visit( old_value )
                 if new_node is None:
-                    delattr(node, field)
+                    delattr( node, field )
                 else:
-                    setattr(node, field, new_node)
+                    setattr( node, field, new_node )
         return node
diff --git a/TestON/core/graph.py b/TestON/core/graph.py
index b1cbdb2..b5bf9f6 100644
--- a/TestON/core/graph.py
+++ b/TestON/core/graph.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
-'''
-Copyright 2016 Open Networking Foundation (ONF)
+"""
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,29 +20,28 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
-'''
-
-
+"""
 import time
 import random
 
+
 class Graph:
+
     """
     Graph class provides implementations of graph algorithms.
     The functions currently supported include:
     - Comparing two graphs with specified attributes for vertices and edges
-    - Getting DFI (Depth First Index) and back edges during a DFS
+    - Getting DFI ( Depth First Index ) and back edges during a DFS
     - Chain decomposition of a graph
-    - Finding (non-)cut-edges and vertices
+    - Finding ( non- )cut-edges and vertices
     """
-
     def __init__( self ):
         # We use a dictionary to store all information about the graph
         self.graphDict = {}
         # Depth-first index of each vertex
         self.DFI = {}
         self.currentDFI = 0
-        # Parent vertex (and edge to that vertex) of each vertex in depth-first search tree
+        # Parent vertex ( and edge to that vertex ) of each vertex in depth-first search tree
         self.parentVertexInDFS = {}
         self.parentEdgeInDFS = {}
         # Back edges of the graph generated during DFS
@@ -60,7 +59,7 @@
           vertex2: { 'edges': ..., 'name': ..., 'protocol': ... } }
         Each vertex should at least have an 'edges' attribute which describes the
         adjacency information. The value of 'edges' attribute is also represented by
-        a dictionary, which maps each edge (identified by the neighbor vertex) to a
+        a dictionary, which maps each edge ( identified by the neighbor vertex ) to a
         list of attributes.
         An example of the edges dictionary:
         'edges': { vertex2: { 'port': ..., 'type': ... },
@@ -69,7 +68,7 @@
         self.graphDict = graphDict
         return main.TRUE
 
-    def compareGraphs( self, graphDictA, graphDictB, vertexAttributes=['edges'], edgeAttributes=['port'] ):
+    def compareGraphs( self, graphDictA, graphDictB, vertexAttributes=[ 'edges' ], edgeAttributes=[ 'port' ] ):
         """
         Compare two graphs.
         By default only the adjacency relationship, i.e. 'port' attribute in
@@ -103,7 +102,7 @@
                         # Compare two attributes
                         attributeValueA = graphDictA[ vertex ][ vertexAttribute ]
                         attributeValueB = graphDictB[ vertex ][ vertexAttribute ]
-                        # FIXME: the comparison may not work for (sub)attribute values that are of list type
+                        # FIXME: the comparison may not work for ( sub )attribute values that are of list type
                         # For attributes except for 'edges', we just rely on '==' for comparison
                         if not vertexAttribute == 'edges':
                             if not attributeValueA == attributeValueB:
@@ -150,8 +149,8 @@
                                                                                                                                    attributeValueA,
                                                                                                                                    attributeValueB ) )
             if not result:
-                #main.log.debug( "Graph: graphDictA: {}".format( graphDictA ) )
-                #main.log.debug( "Graph: graphDictB: {}".format( graphDictB ) )
+                # main.log.debug( "Graph: graphDictA: {}".format( graphDictA ) )
+                # main.log.debug( "Graph: graphDictB: {}".format( graphDictB ) )
                 pass
             return result
         except TypeError:
@@ -166,8 +165,8 @@
 
     def getNonCutEdges( self ):
         """
-        Get a list of non-cut-edges (non-bridges).
-        The definition of a cut-edge (bridge) is: the deletion of a cut-edge will
+        Get a list of non-cut-edges ( non-bridges ).
+        The definition of a cut-edge ( bridge ) is: the deletion of a cut-edge will
         increase the number of connected component of a graph.
         The function is realized by impelementing Schmidt's algorithm based on
         chain decomposition.
@@ -183,7 +182,7 @@
             for chain in self.chains:
                 for edge in chain:
                     nonCutEdges.append( edge )
-            #main.log.debug( 'Non-cut-edges: {}'.format( nonCutEdges ) )
+            # main.log.debug( 'Non-cut-edges: {}'.format( nonCutEdges ) )
             return nonCutEdges
         except Exception:
             main.log.exception( "Graph: Uncaught exception" )
@@ -207,16 +206,16 @@
                 # chain, the chain is a cycle chain
                 if chain[ 0 ][ 0 ] == chain[ -1 ][ 1 ]:
                     cycleChains.append( chain )
-            #main.log.debug( 'Cycle chains: {}'.format( cycleChains ) )
+            # main.log.debug( 'Cycle chains: {}'.format( cycleChains ) )
             # Get a set of vertices which are the first vertices of a cycle chain (excluding the first
             # cycle chain), and these vertices are a subset of all cut-vertices
             subsetOfCutVertices = []
             if len( cycleChains ) > 1:
                 for cycleChain in cycleChains[ 1: ]:
                     subsetOfCutVertices.append( cycleChain[ 0 ][ 0 ] )
-            #main.log.debug( 'Subset of cut vertices: {}'.format( subsetOfCutVertices ) )
+            # main.log.debug( 'Subset of cut vertices: {}'.format( subsetOfCutVertices ) )
             nonCutVertices = []
-            assert nonCutEdges != None
+            assert nonCutEdges is not None
             for vertex in self.graphDict.keys():
                 if vertex in subsetOfCutVertices:
                     continue
@@ -224,12 +223,12 @@
                 for neighbor in self.graphDict[ vertex ][ 'edges' ].keys():
                     edge = [ vertex, neighbor ]
                     backwardEdge = [ neighbor, vertex ]
-                    if not edge in nonCutEdges and not backwardEdge in nonCutEdges:
+                    if edge not in nonCutEdges and backwardEdge not in nonCutEdges:
                         vertexIsNonCut = False
                         break
                 if vertexIsNonCut:
                     nonCutVertices.append( vertex )
-            #main.log.debug( 'Non-cut-vertices: {}'.format( nonCutVertices ) )
+            # main.log.debug( 'Non-cut-vertices: {}'.format( nonCutVertices ) )
             return nonCutVertices
         except KeyError:
             main.log.exception( "Graph: KeyError exception found" )
@@ -247,7 +246,7 @@
         as generates the back edges
         """
         try:
-            assert self.graphDict != None and len( self.graphDict ) != 0
+            assert self.graphDict is not None and len( self.graphDict ) != 0
             for vertex in self.graphDict.keys():
                 self.DFI[ vertex ] = -1
                 self.parentVertexInDFS[ vertex ] = ''
@@ -288,14 +287,14 @@
                 else:
                     key = self.DFI[ neighbor ]
                     if key in self.backEdges.keys():
-                        if not edge in self.backEdges[ key ] and\
-                        not backwardEdge in self.backEdges[ key ]:
+                        if edge not in self.backEdges[ key ] and\
+                                backwardEdge not in self.backEdges[ key ]:
                             self.backEdges[ key ].append( backwardEdge )
                     else:
                         tempKey = self.DFI[ vertex ]
                         if tempKey in self.backEdges.keys():
-                            if not edge in self.backEdges[ tempKey ] and\
-                            not backwardEdge in self.backEdges[ tempKey ]:
+                            if edge not in self.backEdges[ tempKey ] and\
+                                    backwardEdge not in self.backEdges[ tempKey ]:
                                 self.backEdges[ key ] = [ backwardEdge ]
                         else:
                             self.backEdges[ key ] = [ backwardEdge ]
@@ -311,8 +310,7 @@
         """
         This function finds all the chains in chain-decomposition algorithm
         """
-        keyList = self.backEdges.keys()
-        keyList.sort()
+        keyList = sorted( self.backEdges.keys() )
         vertexIsVisited = {}
         self.chains = []
         for vertex in self.graphDict.keys():
@@ -329,7 +327,7 @@
                         nextVertex = currentEdge[ 1 ]
                         vertexIsVisited[ currentVertex ] = True
                         chain.append( currentEdge )
-                        if nextVertex == sourceVertex or vertexIsVisited[ nextVertex ] == True:
+                        if nextVertex == sourceVertex or vertexIsVisited[ nextVertex ]:
                             break
                         currentEdge = self.parentEdgeInDFS[ nextVertex ]
                     self.chains.append( chain )
diff --git a/TestON/core/logger.py b/TestON/core/logger.py
index ed9b0bd..559f84d 100644
--- a/TestON/core/logger.py
+++ b/TestON/core/logger.py
@@ -1,5 +1,5 @@
-#/usr/bin/env python
-'''
+# /usr/bin/env python
+"""
 Created on 07-Jan-2013
 Modified 2015 by ON.Lab
 
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,105 +21,107 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
-'''
-
+"""
 import logging
 import datetime
 import re
 import os
+
+
 class Logger:
-    '''
+
+    """
         Add continuous logs and reports of the test.
 
-        @author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
-    '''
-    def _printHeader(self,main) :
-        '''
+        author:: Raghav Kashyap( raghavkashyap@paxterrasolutions.com )
+    """
+    def _printHeader( self, main ):
+        """
             Log's header will be append to the Log file
-        '''
-        logmsg = "\n"+" " * 32+"+----------------+\n" +"-" * 30+" { Script And Files }  "+"-" * 30+"\n" +" " * 32+"+----------------+\n";
+        """
+        logmsg = "\n" + " " * 32 + "+----------------+\n" + "-" * 30 + " { Script And Files }  " + "-" * 30 + "\n" + " " * 32 + "+----------------+\n"
         logmsg = logmsg + "\n\tScript Log File : " + main.LogFileName + ""
         logmsg = logmsg + "\n\tReport Log File : " + main.ReportFileName + ""
         for component in main.componentDictionary.keys():
-            logmsg = logmsg + "\n\t"+component+" Session Log : " + main.logdir+"/"+component+".session" + ""
+            logmsg = logmsg + "\n\t" + component + " Session Log : " + main.logdir + "/" + component + ".session" + ""
 
-        logmsg = logmsg + "\n\tTest Script :" + path + "Tests/" + main.TEST + ".py"+ ""
+        logmsg = logmsg + "\n\tTest Script :" + path + "Tests/" + main.TEST + ".py" + ""
         logmsg = logmsg + "\n\tTest Params : " + path + "Tests/" + main.TEST + ".params" + ""
-        logmsg = logmsg + "\n\tTopology : " + path + "Tests/" +main.TEST + ".topo" + ""
-        logmsg = logmsg + "\n"+" " * 30+"+" +"-" * 18+"+" +"\n" +"-" * 27+"  { Script Exec Params }  "+"-" * 27 +"\n" +" " * 30 +"+"+"-" * 18 +"+\n";
-        values = "\n\t" + str(main.params)
-        values = re.sub(",", "\n\t", values)
-        values = re.sub("{", "\n\t", values)
-        values = re.sub("}", "\n\t", values)
+        logmsg = logmsg + "\n\tTopology : " + path + "Tests/" + main.TEST + ".topo" + ""
+        logmsg = logmsg + "\n" + " " * 30 + "+" + "-" * 18 + "+" + "\n" + "-" * 27 + "  { Script Exec Params }  " + "-" * 27 + "\n" + " " * 30 + "+" + "-" * 18 + "+\n"
+        values = "\n\t" + str( main.params )
+        values = re.sub( ",", "\n\t", values )
+        values = re.sub( "{", "\n\t", values )
+        values = re.sub( "}", "\n\t", values )
         logmsg = logmsg + values
-        logmsg = logmsg + "\n\n"+" " * 31+"+---------------+\n" +"-" * 29+" { Components Used }  " +"-" * 29+"\n"+" " * 31+"+---------------+\n"
+        logmsg = logmsg + "\n\n" + " " * 31 + "+---------------+\n" + "-" * 29 + " { Components Used }  " + "-" * 29 + "\n" + " " * 31 + "+---------------+\n"
         component_list = []
-        component_list.append(None)
+        component_list.append( None )
 
         # Listing the components in the order of test_target component should be first.
-        if type(main.componentDictionary) == dict:
+        if isinstance( main.componentDictionary, dict ):
             for key in main.componentDictionary.keys():
-                if main.test_target == key :
-                    component_list[0] = key+"-Test Target"
-                else :
-                    component_list.append(key)
+                if main.test_target == key:
+                    component_list[ 0 ] = key + "-Test Target"
+                else:
+                    component_list.append( key )
 
-        for index in range(len(component_list)) :
-            if index==0:
-                if component_list[index]:
-                    logmsg+="\t"+component_list[index]+"\n"
-            elif index > 0 :
-                logmsg+="\t"+str(component_list[index])+"\n"
+        for index in range( len( component_list ) ):
+            if index == 0:
+                if component_list[ index ]:
+                    logmsg += "\t" + component_list[ index ] + "\n"
+            elif index > 0:
+                logmsg += "\t" + str( component_list[ index ] ) + "\n"
 
-        logmsg = logmsg + "\n\n"+" " * 30+"+--------+\n" +"-" * 28+" { Topology }  "+"-" * 28 +"\n" +" " * 30+"+--------+\n"
-        values = "\n\t" + str(main.topology['COMPONENT'])
-        values = re.sub(",", "\n\t", values)
-        values = re.sub("{", "\n\t", values)
-        values = re.sub("}", "\n\t", values)
+        logmsg = logmsg + "\n\n" + " " * 30 + "+--------+\n" + "-" * 28 + " { Topology }  " + "-" * 28 + "\n" + " " * 30 + "+--------+\n"
+        values = "\n\t" + str( main.topology[ 'COMPONENT' ] )
+        values = re.sub( ",", "\n\t", values )
+        values = re.sub( "{", "\n\t", values )
+        values = re.sub( "}", "\n\t", values )
         logmsg = logmsg + values
-        logmsg = logmsg + "\n"+"-" * 60+"\n"
+        logmsg = logmsg + "\n" + "-" * 60 + "\n"
 
         # enter into log file all headers
-        logfile = open(main.LogFileName,"w+")
-        logfile.write (logmsg)
+        logfile = open( main.LogFileName, "w+" )
+        logfile.write( logmsg )
         print logmsg
         main.logHeader = logmsg
         logfile.close()
 
-        #enter into report file all headers
-        main.reportFile = open(main.ReportFileName,"w+")
-        main.reportFile.write(logmsg)
+        # enter into report file all headers
+        main.reportFile = open( main.ReportFileName, "w+" )
+        main.reportFile.write( logmsg )
         main.reportFile.close()
 
-        #Sumamry file header
-        currentTime = str( main.STARTTIME.strftime("%d %b %Y %H:%M:%S") )
+        # Sumamry file header
+        currentTime = str( main.STARTTIME.strftime( "%d %b %Y %H:%M:%S" ) )
         main.summaryFile = open( main.SummaryFileName, "w+" )
         main.summaryFile.write( main.TEST + " at " + currentTime + "\n" )
         main.summaryFile.close()
 
-        #wiki file header
-        currentTime = str( main.STARTTIME.strftime("%d %b %Y %H:%M:%S") )
+        # wiki file header
+        currentTime = str( main.STARTTIME.strftime( "%d %b %Y %H:%M:%S" ) )
         main.wikiFile = open( main.WikiFileName, "w+" )
         main.wikiFile.write( main.TEST + " at " + currentTime + "<p></p>\n" )
         main.wikiFile.close()
 
-    def initlog(self,main):
-        '''
+    def initlog( self, main ):
+        """
             Initialise all the log handles.
-        '''
+        """
         main._getTest()
         main.STARTTIME = datetime.datetime.now()
 
-        currentTime = re.sub("-|\s|:|\.", "_", str(main.STARTTIME.strftime("%d %b %Y %H:%M:%S")))
+        currentTime = re.sub( "-|\s|:|\.", "_", str( main.STARTTIME.strftime( "%d %b %Y %H:%M:%S" ) ) )
         if main.logdir:
-            main.logdir = main.logdir+ "/"+main.TEST + "_" + currentTime
+            main.logdir = main.logdir + "/" + main.TEST + "_" + currentTime
         else:
             main.logdir = main.logs_path + main.TEST + "_" + currentTime
 
-        os.mkdir(main.logdir)
+        os.mkdir( main.logdir )
 
-        main.LogFileName = main.logdir + "/" + main.TEST + "_" +str(currentTime) + ".log"
-        main.ReportFileName = main.logdir + "/" + main.TEST + "_" + str(currentTime) + ".rpt"
+        main.LogFileName = main.logdir + "/" + main.TEST + "_" + str( currentTime ) + ".log"
+        main.ReportFileName = main.logdir + "/" + main.TEST + "_" + str( currentTime ) + ".rpt"
         main.WikiFileName = main.logdir + "/" + main.TEST + "Wiki.txt"
         main.SummaryFileName = main.logdir + "/" + main.TEST + "Summary.txt"
         main.JenkinsCSV = main.logdir + "/" + main.TEST + ".csv"
@@ -127,126 +129,128 @@
 
         main.TOTAL_TC_SUCCESS = 0
 
-        #### Add log-level - Report
-        logging.addLevelName(9, "REPORT")
-        logging.addLevelName(7, "EXACT")
-        logging.addLevelName(11, "CASE")
-        logging.addLevelName(12, "STEP")
-        main.log = logging.getLogger(main.TEST)
-        def report(msg):
-            '''
+        # Add log-level - Report
+        logging.addLevelName( 9, "REPORT" )
+        logging.addLevelName( 7, "EXACT" )
+        logging.addLevelName( 11, "CASE" )
+        logging.addLevelName( 12, "STEP" )
+        main.log = logging.getLogger( main.TEST )
+
+        def report( msg ):
+            """
                 Will append the report message to the logs.
-            '''
-            main.log._log(9,msg,"OpenFlowAutoMattion","OFAutoMation")
+            """
+            main.log._log( 9, msg, "OpenFlowAutoMattion", "OFAutoMation" )
             currentTime = datetime.datetime.now()
-            currentTime = currentTime.strftime("%d %b %Y %H:%M:%S")
-            newmsg = "\n[REPORT] " +"["+ str(currentTime)+"] "+msg
+            currentTime = currentTime.strftime( "%d %b %Y %H:%M:%S" )
+            newmsg = "\n[REPORT] " + "[" + str( currentTime ) + "] " + msg
             print newmsg
-            main.reportFile = open(main.ReportFileName,"a+")
-            main.reportFile.write(newmsg)
+            main.reportFile = open( main.ReportFileName, "a+" )
+            main.reportFile.write( newmsg )
             main.reportFile.close()
 
         main.log.report = report
 
         def summary( msg ):
-            '''
+            """
                 Will append the message to the txt file for the summary.
-            '''
-            main.log._log(6,msg,"OpenFlowAutoMattion","OFAutoMation")
-            main.summaryFile = open(main.SummaryFileName,"a+")
-            main.summaryFile.write(msg+"\n")
+            """
+            main.log._log( 6, msg, "OpenFlowAutoMattion", "OFAutoMation" )
+            main.summaryFile = open( main.SummaryFileName, "a+" )
+            main.summaryFile.write( msg + "\n" )
             main.summaryFile.close()
 
         main.log.summary = summary
 
         def wiki( msg ):
-            '''
+            """
                 Will append the message to the txt file for the wiki.
-            '''
-            main.log._log(6,msg,"OpenFlowAutoMattion","OFAutoMation")
-            main.wikiFile = open(main.WikiFileName,"a+")
-            main.wikiFile.write(msg+"\n")
+            """
+            main.log._log( 6, msg, "OpenFlowAutoMattion", "OFAutoMation" )
+            main.wikiFile = open( main.WikiFileName, "a+" )
+            main.wikiFile.write( msg + "\n" )
             main.wikiFile.close()
 
         main.log.wiki = wiki
 
-        def exact(exmsg):
-            '''
+        def exact( exmsg ):
+            """
                Will append the raw formatted message to the logs
-            '''
-            main.log._log(7,exmsg,"OpenFlowAutoMattion","OFAutoMation")
-            main.reportFile = open(main.ReportFileName,"a+")
-            main.reportFile.write(exmsg)
+            """
+            main.log._log( 7, exmsg, "OpenFlowAutoMattion", "OFAutoMation" )
+            main.reportFile = open( main.ReportFileName, "a+" )
+            main.reportFile.write( exmsg )
             main.reportFile.close()
-            logfile = open(main.LogFileName,"a")
-            logfile.write("\n"+ str(exmsg) +"\n")
+            logfile = open( main.LogFileName, "a" )
+            logfile.write( "\n" + str( exmsg ) + "\n" )
             logfile.close()
             print exmsg
 
         main.log.exact = exact
 
-        def case(msg):
-            '''
+        def case( msg ):
+            """
                Format of the case type log defined here.
-            '''
-            main.log._log(9,msg,"OpenFlowAutoMattion","OFAutoMation")
+            """
+            main.log._log( 9, msg, "OpenFlowAutoMattion", "OFAutoMation" )
             currentTime = datetime.datetime.now()
-            newmsg = "["+str(currentTime)+"] " + "["+main.TEST+"] " + "[CASE] " +msg
-            logfile = open(main.LogFileName,"a")
-            logfile.write("\n"+ str(newmsg) +"\n")
+            newmsg = "[" + str( currentTime ) + "] " + "[" + main.TEST + "] " + "[CASE] " + msg
+            logfile = open( main.LogFileName, "a" )
+            logfile.write( "\n" + str( newmsg ) + "\n" )
             logfile.close()
             print newmsg
 
         main.log.case = case
 
-        def step(msg):
-            '''
+        def step( msg ):
+            """
                 Format of the step type log defined here.
-            '''
-            main.log._log(9,msg,"OpenFlowAutoMattion","OFAutoMation")
+            """
+            main.log._log( 9, msg, "OpenFlowAutoMattion", "OFAutoMation" )
             currentTime = datetime.datetime.now()
-            newmsg = "["+str(currentTime)+"] " + "["+main.TEST+"] " + "[STEP] " +msg
-            logfile = open(main.LogFileName,"a")
-            logfile.write("\n"+ str(newmsg) +"\n")
+            newmsg = "[" + str( currentTime ) + "] " + "[" + main.TEST + "] " + "[STEP] " + msg
+            logfile = open( main.LogFileName, "a" )
+            logfile.write( "\n" + str( newmsg ) + "\n" )
             logfile.close()
             print newmsg
 
         main.log.step = step
 
-        main.LogFileHandler = logging.FileHandler(main.LogFileName)
-        self._printHeader(main)
+        main.LogFileHandler = logging.FileHandler( main.LogFileName )
+        self._printHeader( main )
 
-        ### initializing logging module and settig log level
-        main.log.setLevel(logging.INFO)
-        main.log.setLevel(logging.DEBUG) # Temporary
-        main.LogFileHandler.setLevel(logging.INFO)
+        # initializing logging module and setting log level
+        main.log.setLevel( logging.INFO )
+        main.log.setLevel( logging.DEBUG )  # Temporary
+        main.LogFileHandler.setLevel( logging.INFO )
 
         # create console handler with a higher log level
         main.ConsoleHandler = logging.StreamHandler()
-        main.ConsoleHandler.setLevel(logging.INFO)
-        main.ConsoleHandler.setLevel(logging.DEBUG) #Temporary
+        main.ConsoleHandler.setLevel( logging.INFO )
+        main.ConsoleHandler.setLevel( logging.DEBUG )  # Temporary
         # create formatter and add it to the handlers
-        #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+        # formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' )
+
         class MyFormatter( logging.Formatter ):
             colors = { 'cyan': '\033[96m', 'purple': '\033[95m',
                        'blue': '\033[94m', 'green': '\033[92m',
                        'yellow': '\033[93m', 'red': '\033[91m',
                        'end': '\033[0m' }
 
-            FORMATS = {'DEFAULT': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'}
+            FORMATS = { 'DEFAULT': '%(asctime)s - %(name)s - %(levelname)s - %(message)s' }
             if COLORS:  # NOTE:colors will only be loaded if command is run from one line
                         #      IE:   './cli.py run testname'
                         #      This is to prevent issues with Jenkins parsing
                         # TODO: Make colors configurable
-                levels = { logging.ERROR : colors['red'] +
-                                           FORMATS['DEFAULT'] +
-                                           colors['end'],
-                           logging.WARN : colors['yellow'] +
-                                          FORMATS['DEFAULT'] +
-                                          colors['end'],
-                           logging.DEBUG : colors['purple'] +
-                                          FORMATS['DEFAULT'] +
-                                          colors['end'] }
+                levels = { logging.ERROR: colors[ 'red' ] +
+                                           FORMATS[ 'DEFAULT' ] +
+                                           colors[ 'end' ],
+                           logging.WARN: colors[ 'yellow' ] +
+                                          FORMATS[ 'DEFAULT' ] +
+                                          colors[ 'end' ],
+                           logging.DEBUG: colors[ 'purple' ] +
+                                          FORMATS[ 'DEFAULT' ] +
+                                          colors[ 'end' ] }
                 FORMATS.update( levels )
 
             def format( self, record ):
@@ -254,89 +258,87 @@
                                               self.FORMATS[ 'DEFAULT' ] )
                 return logging.Formatter.format( self, record )
         formatter = MyFormatter()
-        main.ConsoleHandler.setFormatter(formatter)
-        main.LogFileHandler.setFormatter(formatter)
+        main.ConsoleHandler.setFormatter( formatter )
+        main.LogFileHandler.setFormatter( formatter )
 
         # add the handlers to logger
-        main.log.addHandler(main.ConsoleHandler)
-        main.log.addHandler(main.LogFileHandler)
+        main.log.addHandler( main.ConsoleHandler )
+        main.log.addHandler( main.LogFileHandler )
 
-    def testSummary(self,main):
-        '''
+    def testSummary( self, main ):
+        """
             testSummary will take care about the Summary of test.
-        '''
-
+        """
         main.ENDTIME = datetime.datetime.now()
         main.EXECTIME = main.ENDTIME - main.STARTTIME
-        if (main.TOTAL_TC_PASS == 0):
+        if ( main.TOTAL_TC_PASS == 0 ):
             main.TOTAL_TC_SUCCESS = 0
         else:
-            main.TOTAL_TC_SUCCESS = str((main.TOTAL_TC_PASS*100)/main.TOTAL_TC_RUN)
-        if (main.TOTAL_TC_RUN == 0) :
+            main.TOTAL_TC_SUCCESS = str( ( main.TOTAL_TC_PASS * 100 ) / main.TOTAL_TC_RUN )
+        if ( main.TOTAL_TC_RUN == 0 ):
             main.TOTAL_TC_EXECPERCENT = 0
-        else :
-            main.TOTAL_TC_EXECPERCENT = str((main.TOTAL_TC_RUN*100)/main.TOTAL_TC_PLANNED)
-        testResult = "\n\n"+"*" * 37+"\n" + "\tTest Execution Summary\n" + "\n"+"*" * 37+" \n"
-        testResult =  testResult + "\n Test Start           : " + str(main.STARTTIME.strftime("%d %b %Y %H:%M:%S"))
-        testResult =  testResult + "\n Test End             : " + str(main.ENDTIME.strftime("%d %b %Y %H:%M:%S"))
-        testResult =  testResult + "\n Execution Time       : " + str(main.EXECTIME)
-        testResult =  testResult + "\n Total tests planned  : " + str(main.TOTAL_TC_PLANNED)
-        testResult =  testResult + "\n Total tests RUN      : " + str(main.TOTAL_TC_RUN)
-        testResult =  testResult + "\n Total Pass           : " + str(main.TOTAL_TC_PASS)
-        testResult =  testResult + "\n Total Fail           : " + str(main.TOTAL_TC_FAIL)
-        testResult =  testResult + "\n Total No Result      : " + str(main.TOTAL_TC_NORESULT)
-        testResult =  testResult + "\n Success Percentage   : " + str(main.TOTAL_TC_SUCCESS) + "%"
-        testResult =  testResult + "\n Execution Result     : " + str(main.TOTAL_TC_EXECPERCENT) + "%\n"
+        else:
+            main.TOTAL_TC_EXECPERCENT = str( ( main.TOTAL_TC_RUN * 100 ) / main.TOTAL_TC_PLANNED )
+        testResult = "\n\n" + "*" * 37 + "\n" + "\tTest Execution Summary\n" + "\n" + "*" * 37 + " \n"
+        testResult = testResult + "\n Test Start           : " + str( main.STARTTIME.strftime( "%d %b %Y %H:%M:%S" ) )
+        testResult = testResult + "\n Test End             : " + str( main.ENDTIME.strftime( "%d %b %Y %H:%M:%S" ) )
+        testResult = testResult + "\n Execution Time       : " + str( main.EXECTIME )
+        testResult = testResult + "\n Total tests planned  : " + str( main.TOTAL_TC_PLANNED )
+        testResult = testResult + "\n Total tests RUN      : " + str( main.TOTAL_TC_RUN )
+        testResult = testResult + "\n Total Pass           : " + str( main.TOTAL_TC_PASS )
+        testResult = testResult + "\n Total Fail           : " + str( main.TOTAL_TC_FAIL )
+        testResult = testResult + "\n Total No Result      : " + str( main.TOTAL_TC_NORESULT )
+        testResult = testResult + "\n Success Percentage   : " + str( main.TOTAL_TC_SUCCESS ) + "%"
+        testResult = testResult + "\n Execution Result     : " + str( main.TOTAL_TC_EXECPERCENT ) + "%\n"
         if main.failedCase:
-            testResult =  testResult + "\n Case Failed          : " + str( main.failedCase )
+            testResult = testResult + "\n Case Failed          : " + str( main.failedCase )
         if main.noResultCase:
-            testResult =  testResult + "\n Case NoResult        : " + str( main.noResultCase )
-        testResult =  testResult + "\n Case Executed        : " + str( main.executedCase )
-        testResult =  testResult + "\n Case Not Executed    : " + str( main.leftCase )
-        #main.log.report(testResult)
+            testResult = testResult + "\n Case NoResult        : " + str( main.noResultCase )
+        testResult = testResult + "\n Case Executed        : " + str( main.executedCase )
+        testResult = testResult + "\n Case Not Executed    : " + str( main.leftCase )
+        # main.log.report( testResult )
         main.testResult = testResult
-        main.log.exact(testResult)
+        main.log.exact( testResult )
 
-        ##CSV output needed for Jenkin's plot plugin
-        #NOTE: the elements were orded based on the colors assigned to the data
-        logfile = open(main.JenkinsCSV ,"w")
-        logfile.write(",".join( ['Tests Failed', 'Tests Passed', 'Tests Planned'] ) + "\n")
-        logfile.write(",".join( [str(int(main.TOTAL_TC_FAIL)), str(int(main.TOTAL_TC_PASS)), str(int(main.TOTAL_TC_PLANNED))] ) + "\n")
+        # CSV output needed for Jenkins plot plugin
+        # NOTE: the elements were ordered based on the colors assigned to the data
+        logfile = open( main.JenkinsCSV, "w" )
+        logfile.write( ",".join( [ 'Tests Failed', 'Tests Passed', 'Tests Planned' ] ) + "\n" )
+        logfile.write( ",".join( [ str( int( main.TOTAL_TC_FAIL ) ), str( int( main.TOTAL_TC_PASS ) ), str( int( main.TOTAL_TC_PLANNED ) ) ] ) + "\n" )
         logfile.close()
 
-        executedStatus = open(main.resultFile, "w")
+        executedStatus = open( main.resultFile, "w" )
         if main.TOTAL_TC_FAIL == 0 and main.TOTAL_TC_NORESULT + main.TOTAL_TC_PASS == main.TOTAL_TC_PLANNED:
-            executedStatus.write("1\n")
+            executedStatus.write( "1\n" )
         else:
-            executedStatus.write("0\n")
+            executedStatus.write( "0\n" )
         executedStatus.close()
 
-    def updateCaseResults(self,main):
-        '''
+    def updateCaseResults( self, main ):
+        """
             Update the case result based on the steps execution and asserting each step in the test-case
-        '''
-        case = str(main.CurrentTestCaseNumber)
-        currentResult = main.testCaseResult.get(case, 2)
+        """
+        case = str( main.CurrentTestCaseNumber )
+        currentResult = main.testCaseResult.get( case, 2 )
 
         if currentResult == 2:
-            main.TOTAL_TC_RUN  = main.TOTAL_TC_RUN + 1
+            main.TOTAL_TC_RUN = main.TOTAL_TC_RUN + 1
             main.TOTAL_TC_NORESULT = main.TOTAL_TC_NORESULT + 1
-            main.log.exact("\n "+"*" * 29+"\n" + "\n Result: No Assertion Called \n"+"*" * 29+"\n")
-            line = "Case "+case+": "+main.CurrentTestCase+" - No Result"
+            main.log.exact( "\n " + "*" * 29 + "\n" + "\n Result: No Assertion Called \n" + "*" * 29 + "\n" )
+            line = "Case " + case + ": " + main.CurrentTestCase + " - No Result"
         elif currentResult == 1:
-            main.TOTAL_TC_RUN  = main.TOTAL_TC_RUN  + 1
-            main.TOTAL_TC_PASS =  main.TOTAL_TC_PASS + 1
-            main.log.exact("\n"+"*" * 29+"\n Result: Pass \n"+"*" * 29+"\n")
-            line = "Case "+case+": "+main.CurrentTestCase+" - PASS"
+            main.TOTAL_TC_RUN = main.TOTAL_TC_RUN + 1
+            main.TOTAL_TC_PASS = main.TOTAL_TC_PASS + 1
+            main.log.exact( "\n" + "*" * 29 + "\n Result: Pass \n" + "*" * 29 + "\n" )
+            line = "Case " + case + ": " + main.CurrentTestCase + " - PASS"
         elif currentResult == 0:
-            main.TOTAL_TC_RUN  = main.TOTAL_TC_RUN  + 1
+            main.TOTAL_TC_RUN = main.TOTAL_TC_RUN + 1
             main.TOTAL_TC_FAIL = main.TOTAL_TC_FAIL + 1
-            main.log.exact("\n"+"*" * 29+"\n Result: Failed \n"+"*" * 29+"\n")
-            line = "Case "+case+": "+main.CurrentTestCase+" - FAIL"
+            main.log.exact( "\n" + "*" * 29 + "\n Result: Failed \n" + "*" * 29 + "\n" )
+            line = "Case " + case + ": " + main.CurrentTestCase + " - FAIL"
         else:
             main.log.error( " Unknown result of case " + case +
                             ". Result was: " + currentResult )
-            line = "Case "+case+": "+main.CurrentTestCase+" - ERROR"
+            line = "Case " + case + ": " + main.CurrentTestCase + " - ERROR"
         main.log.wiki( "<h3>" + line + "</h3>" )
         main.log.summary( line )
-
diff --git a/TestON/core/openspeak.py b/TestON/core/openspeak.py
index b98c68b..dfcfe42 100644
--- a/TestON/core/openspeak.py
+++ b/TestON/core/openspeak.py
@@ -1,5 +1,5 @@
-#/usr/bin/env python
-'''
+# /usr/bin/env python
+"""
 Created on 20-Dec-2012
 Modified 2015 by ON.Lab
 
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,797 +21,772 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
-'''
+"""
 import re
 import inspect
 
 
 class OpenSpeak:
 
-    def __init__(self):
+    def __init__( self ):
         self.default = ''
         self.flag = 0
         self.CurrentStep = 0
         self.grtrOrLssr = 0
 
-    def compiler(self,**compileParameters):
-        '''
+    def compiler( self, **compileParameters ):
+        """
          This method will parse the openspeak file and will write to a python module with the equivalent translations.
          It can accept OpenSpeak syntax in string or an OpenSpeak file as an input parameter.
          Translated form can be written into python module if attribute "WRITETOFILE" is set to 1.
-        '''
-
-        args = self.parse_args(["OPENSPEAKFILE","TEXT","WRITETOFILE","FILEHANDLE"],**compileParameters)
+        """
+        args = self.parse_args( [ "OPENSPEAKFILE", "TEXT", "WRITETOFILE", "FILEHANDLE" ], **compileParameters )
         resultString = ''
         Test = "Mininet"
-        args["WRITETOFILE"] = args["WRITETOFILE"] if args["WRITETOFILE"] != None else 1
+        args[ "WRITETOFILE" ] = args[ "WRITETOFILE" ] if args[ "WRITETOFILE" ] is not None else 1
         self.CurrentStep = 0
         self.CurrentCase = ''
 
-        ## here Open Speak file will be parsed by each line and translated.
-        if args["OPENSPEAKFILE"] !=None and args["TEXT"] ==None and args["FILEHANDLE"] == None:
-            self.openspeakfile = args["OPENSPEAKFILE"]
-            openSpeakFile = open(args["OPENSPEAKFILE"],"r").readlines()
+        # here Open Speak file will be parsed by each line and translated.
+        if args[ "OPENSPEAKFILE" ] is not None and args[ "TEXT" ] is None and args[ "FILEHANDLE" ] is None:
+            self.openspeakfile = args[ "OPENSPEAKFILE" ]
+            openSpeakFile = open( args[ "OPENSPEAKFILE" ], "r" ).readlines()
 
-        elif args["OPENSPEAKFILE"] ==None and args["TEXT"] and args["FILEHANDLE"] == None:
-            openSpeakFile =  args["TEXT"].split("\n")
-        elif args["FILEHANDLE"] and args["OPENSPEAKFILE"] ==None and args["TEXT"] ==None:
-            openSpeakFile = args["FILEHANDLE"].readlines()
+        elif args[ "OPENSPEAKFILE" ] is None and args[ "TEXT" ] and args[ "FILEHANDLE" ] is None:
+            openSpeakFile = args[ "TEXT" ].split( "\n" )
+        elif args[ "FILEHANDLE" ] and args[ "OPENSPEAKFILE" ] is None and args[ "TEXT" ] is None:
+            openSpeakFile = args[ "FILEHANDLE" ].readlines()
 
         index = 0
         outputFile = []
-        testName = re.search("\/(.*)\.ospk$",self.openspeakfile,0)
-        testName = testName.group(1)
-        testName = testName.split("/")
-        testName = testName[len(testName)-1]
-        outputFile.append("\nclass " + testName + " :" + "\n")
-        outputFile.append("\n" + " " * 4 + "def __init__(self) :")
-        outputFile.append("\n" + " " * 8 + "self.default = \'\'" + "\n")
+        testName = re.search( "\/(.*)\.ospk$", self.openspeakfile, 0 )
+        testName = testName.group( 1 )
+        testName = testName.split( "/" )
+        testName = testName[ len( testName ) - 1 ]
+        outputFile.append( "\nclass " + testName + " :" + "\n" )
+        outputFile.append( "\n" + " " * 4 + "def __init__(self) :" )
+        outputFile.append( "\n" + " " * 8 + "self.default = \'\'" + "\n" )
 
-        while index < len(openSpeakFile):
-            ifelseMatch = re.match("\s+IF|\s+ELSE|\s+ELIF",openSpeakFile[index],flags=0)
-            line = openSpeakFile[index]
-            repeatMatch = re.match("\s*REPEAT", openSpeakFile[index], flags=0)
-            if ifelseMatch :
-                result =  self.verify_and_translate(line)
-                initialSpaces = len(line) -len(line.lstrip())
+        while index < len( openSpeakFile ):
+            ifelseMatch = re.match( "\s+IF|\s+ELSE|\s+ELIF", openSpeakFile[ index ], flags=0 )
+            line = openSpeakFile[ index ]
+            repeatMatch = re.match( "\s*REPEAT", openSpeakFile[ index ], flags=0 )
+            if ifelseMatch:
+                result = self.verify_and_translate( line )
+                initialSpaces = len( line ) - len( line.lstrip() )
                 self.outLoopSpace = initialSpaces
-                nextLine = openSpeakFile[index+1]
-                nextinitialSpaces = len(nextLine) -len(nextLine.lstrip())
+                nextLine = openSpeakFile[ index + 1 ]
+                nextinitialSpaces = len( nextLine ) - len( nextLine.lstrip() )
 
-
-                while nextinitialSpaces > initialSpaces :
-                    try :
-                        elseMatch = re.match("\s*ELSE|\s*ELIF",nextLine,flags=0)
-                        if elseMatch :
-                            self.flag = self.flag -1
-                        result = result + self.verify_and_translate(nextLine)
-                        nextLine = openSpeakFile[index + 1]
-                        nextinitialSpaces = len(nextLine) -len(nextLine.lstrip())
+                while nextinitialSpaces > initialSpaces:
+                    try:
+                        elseMatch = re.match( "\s*ELSE|\s*ELIF", nextLine, flags=0 )
+                        if elseMatch:
+                            self.flag = self.flag - 1
+                        result = result + self.verify_and_translate( nextLine )
+                        nextLine = openSpeakFile[ index + 1 ]
+                        nextinitialSpaces = len( nextLine ) - len( nextLine.lstrip() )
                     except IndexError:
                         pass
                     index = index + 1
                 self.flag = 0
             elif repeatMatch:
                 self.flag = 0
-                result =  self.verify_and_translate(line)
+                result = self.verify_and_translate( line )
                 index = index + 1
-                endMatch = re.match("\s*END",openSpeakFile[index],flags=0)
-                while not endMatch :
-                    try :
+                endMatch = re.match( "\s*END", openSpeakFile[ index ], flags=0 )
+                while not endMatch:
+                    try:
 
                         self.flag = self.flag + 1
-                        result =  result + self.verify_and_translate(openSpeakFile[index])
+                        result = result + self.verify_and_translate( openSpeakFile[ index ] )
                         index = index + 1
 
-                    except IndexError :
+                    except IndexError:
                         pass
 
-
-            else :
+            else:
                 self.flag = 0
-                result = self.verify_and_translate(line)
+                result = self.verify_and_translate( line )
                 index = index + 1
-            outputFile.append(result)
+            outputFile.append( result )
 
-        if args["WRITETOFILE"] == 1 :
-            testscript = re.sub("ospk","py",self.openspeakfile,0)
-            testScript = open(testscript,"w")
-            for lines in outputFile :
-                testScript.write(lines)
+        if args[ "WRITETOFILE" ] == 1:
+            testscript = re.sub( "ospk", "py", self.openspeakfile, 0 )
+            testScript = open( testscript, "w" )
+            for lines in outputFile:
+                testScript.write( lines )
             testScript.close()
         return resultString
 
-    def verify_and_translate(self,line):
-        '''
+    def verify_and_translate( self, line ):
+        """
           It will accept the each line and calls the suitable API to conver into pyton equivalent syntax .
           It will return the translated python syntax .
-        '''
-        lineSpace = re.match("^\s+",line,flags=0)
-        initialSpaces = len(line) -len(line.lstrip())
-        line = re.sub("^\s+","",line) if lineSpace else line
-
+        """
+        lineSpace = re.match( "^\s+", line, flags=0 )
+        initialSpaces = len( line ) - len( line.lstrip() )
+        line = re.sub( "^\s+", "", line ) if lineSpace else line
 
         resultString = None
-        resultString = "\n" + " " * 4 if str(inspect.stack()[1][3]) == "compiler" else "\n"
-        indent = " " *(4 + 4 * self.flag) if self.flag > 0 else " " * 4
-        caseMatch = re.search("^CASE\s+(\d+)",line,flags=0)
-        nameMatch = re.match("^NAME\s+\"(.*)\"",line,flags=0)
-        commentMatch = re.match("^COMMENT\s+\"(.*)\"",line,flags=0)
-        stepMatch = re.match("^STEP\s+\"(.*)\"",line,flags=0)
-        connectMatch = re.match("^CONNECT\s+(\w+)\s+USING\s+(.*)",line,flags=0)
-        disconnectMatch = re.match("^DISCONNECT\s+(.*)",line,flags=0)
-        ondoMatch = re.match("^ON\s+(.*)\s+DO\s+(.*)",line,flags=0)
+        resultString = "\n" + " " * 4 if str( inspect.stack()[ 1 ][ 3 ] ) == "compiler" else "\n"
+        indent = " " * ( 4 + 4 * self.flag ) if self.flag > 0 else " " * 4
+        caseMatch = re.search( "^CASE\s+(\d+)", line, flags=0 )
+        nameMatch = re.match( "^NAME\s+\"( .* )\"", line, flags=0 )
+        commentMatch = re.match( "^COMMENT\s+\"( .* )\"", line, flags=0 )
+        stepMatch = re.match( "^STEP\s+\"( .* )\"", line, flags=0 )
+        connectMatch = re.match( "^CONNECT\s+(\w+)\s+USING\s+(.*)", line, flags=0 )
+        disconnectMatch = re.match( "^DISCONNECT\s+(.*)", line, flags=0 )
+        ondoMatch = re.match( "^ON\s+(.*)\s+DO\s+(.*)", line, flags=0 )
 
-        storeMatch = re.match("^STORE\s+(.*)\s+IN\s+(.*)",line,flags=0)
-        variableMatch = re.match("^(.*)\s+=\s+(.*)",line,flags=0)
-        assertMatch = re.match("^ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)",line,flags=0)
-        logMatch = re.match("^(ERROR|INFO|DEBUG|CRITICAL|REPORT|EXACT|WARN)\s+(.*)",line,flags=0)
-        ifloop = re.match("IF\s+(\w+)\s*(..|\w+)\s*(.*)",line,flags=0)
-        elseloopMatch = re.match("ELSE\s*$",line,flags=0)
-        elifloop = re.match("ELSE\sIF\s+(\w+)\s*(..|\w+)\s*(.*)",line,flags=0)
-        forloopMatch = re.match("\s*REPEAT\s+(/d+)\s+TIMES",line,flags=0)
-        experimentalMatch = re.match("EXPERIMENTAL\s+MODE\s+(\w+)",line,flags=0)
-        repeatMatch = re.match("\s*REPEAT\s+(\d+)\s+TIMES", line, flags=0)
+        storeMatch = re.match( "^STORE\s+(.*)\s+IN\s+(.*)", line, flags=0 )
+        variableMatch = re.match( "^(.*)\s+=\s+(.*)", line, flags=0 )
+        assertMatch = re.match( "^ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)", line, flags=0 )
+        logMatch = re.match( "^(ERROR|INFO|DEBUG|CRITICAL|REPORT|EXACT|WARN)\s+(.*)", line, flags=0 )
+        ifloop = re.match( "IF\s+(\w+)\s*(..|\w+)\s*(.*)", line, flags=0 )
+        elseloopMatch = re.match( "ELSE\s*$", line, flags=0 )
+        elifloop = re.match( "ELSE\sIF\s+(\w+)\s*(..|\w+)\s*(.*)", line, flags=0 )
+        forloopMatch = re.match( "\s*REPEAT\s+(/d+)\s+TIMES", line, flags=0 )
+        experimentalMatch = re.match( "EXPERIMENTAL\s+MODE\s+(\w+)", line, flags=0 )
+        repeatMatch = re.match( "\s*REPEAT\s+(\d+)\s+TIMES", line, flags=0 )
 
-        response_pasrse = re.match("\s*PARSE\s+(\w+)\s+AS\s+(\w+)\s+INTO\s+(\w+)", line, flags=0)
+        response_pasrse = re.match( "\s*PARSE\s+(\w+)\s+AS\s+(\w+)\s+INTO\s+(\w+)", line, flags=0 )
 
-        if caseMatch :
+        if caseMatch:
             self.CurrentStep = 0
-            self.CurrentCase = "CASE" + caseMatch.group(1)
-            resultString = resultString + self.translate_case_block(casenumber=caseMatch.group(1))
+            self.CurrentCase = "CASE" + caseMatch.group( 1 )
+            resultString = resultString + self.translate_case_block( casenumber=caseMatch.group( 1 ) )
         elif repeatMatch:
-            resultString = resultString + indent + self.translate_repeat(repeat=repeatMatch.group(1))
-        elif nameMatch :
-            resultString = resultString +  indent + self.translate_testcase_name(testname=nameMatch.group(1))
-        elif commentMatch :
-            resultString = resultString + indent + self.translate_comment(comment=commentMatch.group(1))
-        elif stepMatch :
+            resultString = resultString + indent + self.translate_repeat( repeat=repeatMatch.group( 1 ) )
+        elif nameMatch:
+            resultString = resultString + indent + self.translate_testcase_name( testname=nameMatch.group( 1 ) )
+        elif commentMatch:
+            resultString = resultString + indent + self.translate_comment( comment=commentMatch.group( 1 ) )
+        elif stepMatch:
             self.CurrentStep = self.CurrentStep + 1
-            resultString = resultString + indent + self.translate_step(step=stepMatch.group(1))
-        elif connectMatch :
-            resultString = resultString + indent + self.translate_connect(component=connectMatch.group(1),
-                                                                           arguments=connectMatch.group(2) )
-        elif disconnectMatch :
-            resultString = resultString + indent + self.translate_disconnect(component=disconnectMatch.group(1))
-        elif ondoMatch :
-            resultString = resultString + indent + self.translate_onDOAs(component=ondoMatch.group(1),action=ondoMatch.group(2))
-        elif storeMatch :
-            resultString = resultString + indent + self.translate_store(variable=storeMatch.group(2),
-                                                                         value=storeMatch.group(1))
-        elif variableMatch :
-            resultString = resultString + indent + self.translate_store(variable=variableMatch.group(1),
-                                                                         value=variableMatch.group(2))
-        elif assertMatch :
-            resultString = resultString + indent + self.translate_assertion(leftvalue=assertMatch.group(1),
-                                                                        operator=assertMatch.group(2),
-                                                                            rightvalue=assertMatch.group(3),
-                                                                            onpass=assertMatch.group(4),
-                                                                            onfail=assertMatch.group(5))
-        elif logMatch :
-            resultString = resultString + indent + self.translate_logs(loglevel=logMatch.group(1),
-                                                                        message=logMatch.group(2))
-        elif ifloop :
+            resultString = resultString + indent + self.translate_step( step=stepMatch.group( 1 ) )
+        elif connectMatch:
+            resultString = resultString + indent + self.translate_connect( component=connectMatch.group( 1 ),
+                                                                           arguments=connectMatch.group( 2 ) )
+        elif disconnectMatch:
+            resultString = resultString + indent + self.translate_disconnect( component=disconnectMatch.group( 1 ) )
+        elif ondoMatch:
+            resultString = resultString + indent + self.translate_onDOAs( component=ondoMatch.group( 1 ), action=ondoMatch.group( 2 ) )
+        elif storeMatch:
+            resultString = resultString + indent + self.translate_store( variable=storeMatch.group( 2 ),
+                                                                         value=storeMatch.group( 1 ) )
+        elif variableMatch:
+            resultString = resultString + indent + self.translate_store( variable=variableMatch.group( 1 ),
+                                                                         value=variableMatch.group( 2 ) )
+        elif assertMatch:
+            resultString = resultString + indent + self.translate_assertion( leftvalue=assertMatch.group( 1 ),
+                                                                             operator=assertMatch.group( 2 ),
+                                                                             rightvalue=assertMatch.group( 3 ),
+                                                                             onpass=assertMatch.group( 4 ),
+                                                                             onfail=assertMatch.group( 5 ) )
+        elif logMatch:
+            resultString = resultString + indent + self.translate_logs( loglevel=logMatch.group( 1 ),
+                                                                        message=logMatch.group( 2 ) )
+        elif ifloop:
 
             self.initSpace = initialSpaces
-            operand = ifloop.group(1)
-            operator = ifloop.group(2)
-            value = ifloop.group(3)
-            resultString = resultString + indent + "if " + operand + self.translate_if_else_operator(conditionoperator=operator) + value + ":"
+            operand = ifloop.group( 1 )
+            operator = ifloop.group( 2 )
+            value = ifloop.group( 3 )
+            resultString = resultString + indent + "if " + operand + self.translate_if_else_operator( conditionoperator=operator ) + value + ":"
             self.flag = self.flag + 1
-        elif experimentalMatch :
-            resultString = resultString + indent + self.translate_experimental_mode(mode=experimentalMatch.group(1))
+        elif experimentalMatch:
+            resultString = resultString + indent + self.translate_experimental_mode( mode=experimentalMatch.group( 1 ) )
 
-        elif elseloopMatch :
+        elif elseloopMatch:
             if initialSpaces == self.initSpace or initialSpaces == self.outLoopSpace:
                 resultString = resultString + indent + "else :"
                 self.flag = self.flag + 1
-            else :
-                indent = " " *(4 + 4 * (self.flag-1))
+            else:
+                indent = " " * ( 4 + 4 * ( self.flag - 1 ) )
                 resultString = resultString + indent + "else :"
                 self.flag = self.flag + 1
 
-        elif elifloop :
+        elif elifloop:
 
-            operand = elifloop.group(1)
-            operator = elifloop.group(2)
-            value = elifloop.group(3)
+            operand = elifloop.group( 1 )
+            operator = elifloop.group( 2 )
+            value = elifloop.group( 3 )
             if initialSpaces == self.initSpace or initialSpaces == self.outLoopSpace:
-                resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator(conditionoperator=operator) + value + ":"
+                resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator( conditionoperator=operator ) + value + ":"
                 self.flag = self.flag + 1
-            else :
-                indent = " " *(4 + 4 * (self.flag-1))
-                resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator(conditionoperator=operator) + value + ":"
+            else:
+                indent = " " * ( 4 + 4 * ( self.flag - 1 ) )
+                resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator( conditionoperator=operator ) + value + ":"
                 self.flag = self.flag + 1
-        elif response_pasrse :
-            output_string = response_pasrse.group(1)
-            req_format = response_pasrse.group(2)
-            store_in = response_pasrse.group(3)
-            resultString = resultString + indent + store_in +'= main.response_parser('+output_string+",\""+req_format+"\")"
+        elif response_pasrse:
+            output_string = response_pasrse.group( 1 )
+            req_format = response_pasrse.group( 2 )
+            store_in = response_pasrse.group( 3 )
+            resultString = resultString + indent + store_in + '= main.response_parser(' + output_string + ",\"" + req_format + "\")"
             self.flag = self.flag + 1
 
         return resultString
 
-    def translate_repeat(self,**repeatStatement):
-        '''
+    def translate_repeat( self, **repeatStatement ):
+        """
         this will transalte the repeat statement into a python equivalen while loop
-        '''
-
-        args = self.parse_args(["REPEAT"],**repeatStatement)
+        """
+        args = self.parse_args( [ "REPEAT" ], **repeatStatement )
         resultString = ''
 
         resultString = "i = 0"
-        resultString = resultString + "\n" + " " * 8 +"while i<" + args["REPEAT"] + " :"
+        resultString = resultString + "\n" + " " * 8 + "while i<" + args[ "REPEAT" ] + " :"
         return resultString
 
-    def translate_if_else_operator(self,**loopBlock):
-        '''
+    def translate_if_else_operator( self, **loopBlock ):
+        """
           This method will translate if-else loop block into its equivalent python code.
           Whole loop block will be passed into loopBlock List.
           It returns the transalted reuslt as a string.
-        '''
-        args = self.parse_args(["CONDITIONOPERATOR"],**loopBlock)
+        """
+        args = self.parse_args( [ "CONDITIONOPERATOR" ], **loopBlock )
         resultString = ''
         # process the loopBlock List translate all statements underlying the given loop block
-        equalsMatch = re.match("EQUALS$|==\s*$",args["CONDITIONOPERATOR"],flags=0)
-        greaterMatch = re.match("GREATER\s+THAN$|>\s*$",args["CONDITIONOPERATOR"],flags=0)
-        lesserMatch = re.match("LESSER\s+THAN$|<\s*$",args["CONDITIONOPERATOR"],flags=0)
-        greaterEqualMatch =  re.match("GREATER\s+THAN\s+OR\s+EQUALS$|>=\s*$",args["CONDITIONOPERATOR"],flags=0)
-        lesserEqualMatch = re.match("LESSER\s+THAN\s+OR\s+EQUALS$|<=\s*$",args["CONDITIONOPERATOR"],flags=0)
-        if equalsMatch :
+        equalsMatch = re.match( "EQUALS$|==\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
+        greaterMatch = re.match( "GREATER\s+THAN$|>\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
+        lesserMatch = re.match( "LESSER\s+THAN$|<\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
+        greaterEqualMatch = re.match( "GREATER\s+THAN\s+OR\s+EQUALS$|>=\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
+        lesserEqualMatch = re.match( "LESSER\s+THAN\s+OR\s+EQUALS$|<=\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
+        if equalsMatch:
             resultString = resultString + " == "
-        elif greaterMatch :
+        elif greaterMatch:
             resultString = resultString + " > "
-        elif lesserMatch :
+        elif lesserMatch:
             resultString = resultString + " < "
         elif greaterEqualMatch:
             resultString = resultString + " >= "
-        elif lesserEqualMatch :
+        elif lesserEqualMatch:
             resultString = resultString + " <= "
-        else :
+        else:
             print "\n Error: Given Operator is not listed "
 
         return resultString
 
-    def translate_experimental_mode(self,**modeType):
-        '''
+    def translate_experimental_mode( self, **modeType ):
+        """
          This API will translate statment EXPERIMENTAL MODE ON/OFF into python equivalent.
          It will return the transalted value.
-         '''
-        args = self.parse_args(["MODE"],**modeType)
+         """
+        args = self.parse_args( [ "MODE" ], **modeType )
         resultString = ''
-        ONmatch = re.match("\s*ON",args["MODE"],flags=0)
-        OFFmatch = re.match("\sOFF",args["MODE"],flags=0)
+        ONmatch = re.match( "\s*ON", args[ "MODE" ], flags=0 )
+        OFFmatch = re.match( "\sOFF", args[ "MODE" ], flags=0 )
 
-        if ONmatch :
+        if ONmatch:
             resultString = "main.EXPERIMENTAL_MODE = main.TRUE"
-        elif OFFmatch :
+        elif OFFmatch:
             resultString = "main.EXPERIMENTAL_MODE = main.FALSE"
 
         return resultString
 
-    def interpret(self,**interpetParameters):
-        '''
+    def interpret( self, **interpetParameters ):
+        """
          This method will accept the OpenSpeak syntax into a string and will return
          a python equivalent translations statement
-        '''
-
-        args = self.parse_args(["TEXT","WRITETOFILE"],**interpetParameters)
+        """
+        args = self.parse_args( [ "TEXT", "WRITETOFILE" ], **interpetParameters )
         resultString = ''
-        ## here Open Speak syntax will be translated into python equivalent.
-        resultString = self.verify_and_translate(args["TEXT"])
-        lineSpace = re.match("^\s+",resultString,flags=0)
+        # here Open Speak syntax will be translated into python equivalent.
+        resultString = self.verify_and_translate( args[ "TEXT" ] )
+        lineSpace = re.match( "^\s+", resultString, flags=0 )
 
-        resultString = re.sub("^\s+","",resultString) if lineSpace else resultString
+        resultString = re.sub( "^\s+", "", resultString ) if lineSpace else resultString
         return resultString
 
-    def translate_logs(self,**logStatement):
-        '''
+    def translate_logs( self, **logStatement ):
+        """
          This will translate the OpenSpeak log message statements into python equivalent
          to resultString and returns resultString
-        '''
-        args = self.parse_args(["LOGLEVEL","MESSAGE"],**logStatement)
+        """
+        args = self.parse_args( [ "LOGLEVEL", "MESSAGE" ], **logStatement )
         resultString = ''
         # convert the statement here
-        message = self.translate_log_message(message=args["MESSAGE"])
-        if args["LOGLEVEL"] == "INFO" :
+        message = self.translate_log_message( message=args[ "MESSAGE" ] )
+        if args[ "LOGLEVEL" ] == "INFO":
             resultString = resultString + "main.log.info(" + message + ")"
-        elif args["LOGLEVEL"] == "ERROR" :
-            resultString = resultString + "main.log.error(" + message  + ")"
-        elif args["LOGLEVEL"] == "DEBUG" :
+        elif args[ "LOGLEVEL" ] == "ERROR":
+            resultString = resultString + "main.log.error(" + message + ")"
+        elif args[ "LOGLEVEL" ] == "DEBUG":
             resultString = resultString + "main.log.debug(" + message + ")"
-        elif args["LOGLEVEL"] == "REPORT" :
+        elif args[ "LOGLEVEL" ] == "REPORT":
             resultString = resultString + "main.log.report(" + message + ")"
-        elif args["LOGLEVEL"] == "CRITICAL" :
+        elif args[ "LOGLEVEL" ] == "CRITICAL":
             resultString = resultString + "main.log.critical(" + message + ")"
-        elif args["LOGLEVEL"] == "WARN" :
-            resultString = resultString + "main.log.warn(" + args["MESSAGE"] + ")"
-        elif args["LOGLEVEL"] == "EXACT" :
-            resultString = resultString + "main.log.exact(" + args["MESSAGE"] + ")"
-
+        elif args[ "LOGLEVEL" ] == "WARN":
+            resultString = resultString + "main.log.warn(" + args[ "MESSAGE" ] + ")"
+        elif args[ "LOGLEVEL" ] == "EXACT":
+            resultString = resultString + "main.log.exact(" + args[ "MESSAGE" ] + ")"
 
         return resultString
 
-    def translate_log_message(self,**messageStatement) :
-        '''
+    def translate_log_message( self, **messageStatement ):
+        """
          This API will translate log messages if it is a string or Variable or combination
          of string and variable.
          It will return the analysed and translate message.
-        '''
-        args = self.parse_args(["MESSAGE"],**messageStatement)
+        """
+        args = self.parse_args( [ "MESSAGE" ], **messageStatement )
         resultString = ''
 
-        paramsMatch = re.match("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE",args["MESSAGE"],flags=0)
-        stringMatch = re.match("\s*\"(.*)\"\s*$",args["MESSAGE"],flags=0)
-        stringWidVariableMatch = re.match("\"(.*)\"\s+\+\s+(.*)",args["MESSAGE"],flags=0)
-        varRefMatch = re.search("\<(\w+)\>",args["MESSAGE"],flags=0)
-        if paramsMatch :
-            resultString = resultString + self.translate_parameters(parameters=args["MESSAGE"])
-        elif stringMatch :
-            resultString = resultString + args["MESSAGE"]
+        paramsMatch = re.match( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE", args[ "MESSAGE" ], flags=0 )
+        stringMatch = re.match( "\s*\"( .* )\"\s*$", args[ "MESSAGE" ], flags=0 )
+        stringWidVariableMatch = re.match( "\"( .* )\"\s+\+\s+(.*)", args[ "MESSAGE" ], flags=0 )
+        varRefMatch = re.search( "\<(\w+)\>", args[ "MESSAGE" ], flags=0 )
+        if paramsMatch:
+            resultString = resultString + self.translate_parameters( parameters=args[ "MESSAGE" ] )
+        elif stringMatch:
+            resultString = resultString + args[ "MESSAGE" ]
         elif stringWidVariableMatch:
-            quoteWord = stringWidVariableMatch.group(1)
-            variableRef = stringWidVariableMatch.group(2)
-            varMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]",variableRef,flags=0)
-            varRefMatch = re.search("\<(\w+)\>",variableRef,flags=0)
-            if varMatch :
-                resultString = resultString + "\"" + quoteWord + "\"" + " + " + self.translate_parameters(parameters=variableRef)
-            elif varRefMatch :
-                resultString = resultString + "\"" + quoteWord + "\"" +  " + " + varRefMatch.group(1)
+            quoteWord = stringWidVariableMatch.group( 1 )
+            variableRef = stringWidVariableMatch.group( 2 )
+            varMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]", variableRef, flags=0 )
+            varRefMatch = re.search( "\<(\w+)\>", variableRef, flags=0 )
+            if varMatch:
+                resultString = resultString + "\"" + quoteWord + "\"" + " + " + self.translate_parameters( parameters=variableRef )
+            elif varRefMatch:
+                resultString = resultString + "\"" + quoteWord + "\"" + " + " + varRefMatch.group( 1 )
         elif varRefMatch:
-            resultString = resultString + varRefMatch.group(1)
-        else :
-            print "\nError : Syntax error , Not defined way to give log message" + args["MESSAGE"]
+            resultString = resultString + varRefMatch.group( 1 )
+        else:
+            print "\nError : Syntax error , Not defined way to give log message" + args[ "MESSAGE" ]
 
         return resultString
 
-    def translate_assertion(self,**assertStatement):
-        '''
+    def translate_assertion( self, **assertStatement ):
+        """
          This will translate the ASSERT <value1> <COMPARISON OPERATOR> <value2> into python
          equivalent to resultString and returns resultString
-        '''
-        args = self.parse_args(["LEFTVALUE","OPERATOR","RIGHTVALUE","ONPASS","ONFAIL"],**assertStatement)
+        """
+        args = self.parse_args( [ "LEFTVALUE", "OPERATOR", "RIGHTVALUE", "ONPASS", "ONFAIL" ], **assertStatement )
         resultString = ''
         # convert the statement here
-        notOperatorMatch = re.search("NOT\s+(.*)",args["OPERATOR"],flags=0)
-        notOperatorSymbMatch = re.search("\!(.*)",args["OPERATOR"],flags=0)
+        notOperatorMatch = re.search( "NOT\s+(.*)", args[ "OPERATOR" ], flags=0 )
+        notOperatorSymbMatch = re.search( "\!(.*)", args[ "OPERATOR" ], flags=0 )
         operator = ''
-        lastresultMatch = re.match("LAST_RESULT",args["RIGHTVALUE"],flags=0)
-        lastresponseMatch = re.match("LAST_RESPONSE",args["RIGHTVALUE"],flags=0)
-        if lastresultMatch :
+        lastresultMatch = re.match( "LAST_RESULT", args[ "RIGHTVALUE" ], flags=0 )
+        lastresponseMatch = re.match( "LAST_RESPONSE", args[ "RIGHTVALUE" ], flags=0 )
+        if lastresultMatch:
             operator = "main.last_result"
-        elif lastresponseMatch :
+        elif lastresponseMatch:
             operator = "main.last_response"
-        else :
-            operator = args["RIGHTVALUE"]
+        else:
+            operator = args[ "RIGHTVALUE" ]
 
-        if args["OPERATOR"] == None or args["OPERATOR"] == "" :
+        if args[ "OPERATOR" ] is None or args[ "OPERATOR" ] == "":
             print "\n Error : Operator has not been specified !!!"
         elif notOperatorMatch or notOperatorSymbMatch:
 
-            operators = notOperatorMatch.group(1) if notOperatorMatch else notOperatorSymbMatch.group(1)
-            operators = self.translate_operator(operator=operators)
-            if self.grtrOrLssr == 0 :
+            operators = notOperatorMatch.group( 1 ) if notOperatorMatch else notOperatorSymbMatch.group( 1 )
+            operators = self.translate_operator( operator=operators )
+            if self.grtrOrLssr == 0:
                 resultString = resultString + "utilities.assert_not_" + operators + "(expect=" +\
-                               self.translate_response_result(operator=args["RIGHTVALUE"]) + ",actual=" + self.translate_response_result(operator=args["LEFTVALUE"]) +\
-                               ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\
-                               ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")"
-            else :
+                               self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) + ",actual=" + self.translate_response_result( operator=args[ "LEFTVALUE" ] ) +\
+                               ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) +\
+                               ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"
+            else:
                 resultString = resultString + "utilities.assert_not_" + operators + "(expect=" +\
-                               self.translate_response_result(operator=args["LEFTVALUE"]) + ",actual=" + self.translate_response_result(operator=args["RIGHTVALUE"]) +\
-                               ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\
-                               ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")"
+                               self.translate_response_result( operator=args[ "LEFTVALUE" ] ) + ",actual=" + self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) +\
+                               ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) +\
+                               ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"
 
-        else :
-            operators = self.translate_operator(operator=args["OPERATOR"])
-            if self.grtrOrLssr == 0 :
+        else:
+            operators = self.translate_operator( operator=args[ "OPERATOR" ] )
+            if self.grtrOrLssr == 0:
                 resultString = resultString + "utilities.assert_" + operators + "(expect=" +\
-                               self.translate_response_result(operator=args["RIGHTVALUE"]) +\
-                               ",actual=" + self.translate_response_result(operator=args["LEFTVALUE"]) +\
-                               ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\
-                               ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")"
-            else :
+                               self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) +\
+                               ",actual=" + self.translate_response_result( operator=args[ "LEFTVALUE" ] ) +\
+                               ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) +\
+                               ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"
+            else:
                 resultString = resultString + "utilities.assert_" + operators + "(expect=" +\
-                               self.translate_response_result(operator=args["LEFTVALUE"]) +\
-                               ",actual=" + self.translate_response_result(operator=args["RIGHTVALUE"]) +\
-                               ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\
-                               ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")"
-
+                               self.translate_response_result( operator=args[ "LEFTVALUE" ] ) +\
+                               ",actual=" + self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) +\
+                               ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) +\
+                               ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"
 
         return resultString
 
-    def translate_response_result(self,**operatorStatement):
-        '''
+    def translate_response_result( self, **operatorStatement ):
+        """
          It will translate the LAST_RESPONSE or LAST_RESULT statement into its equivalent.
          It returns the translate form in resulString.
-        '''
-        args = self.parse_args(["OPERATOR"],**operatorStatement)
+        """
+        args = self.parse_args( [ "OPERATOR" ], **operatorStatement )
         resultString = ''
-        lastResultMatch = re.match("LAST_RESULT",args["OPERATOR"],flags=0)
-        lastResponseMatch = re.match("LAST_RESPONSE",args["OPERATOR"],flags=0)
-        if lastResultMatch :
+        lastResultMatch = re.match( "LAST_RESULT", args[ "OPERATOR" ], flags=0 )
+        lastResponseMatch = re.match( "LAST_RESPONSE", args[ "OPERATOR" ], flags=0 )
+        if lastResultMatch:
             resultString = resultString + "main.last_result"
         elif lastResponseMatch:
             resultString = resultString + "main.last_response"
-        else :
-            resultString = resultString + args["OPERATOR"]
+        else:
+            resultString = resultString + args[ "OPERATOR" ]
         return resultString
 
-
-    def translate_assertMessage(self,**messageStatement) :
-        '''
+    def translate_assertMessage( self, **messageStatement ):
+        """
          This API will facilitate the translation of assert ONPASS or ONFAIL messages . The message can be
          a string or calling another API in OpenSpeak syntax.
          It will return the translated message
-        '''
-        args = self.parse_args(["MESSAGE"],**messageStatement)
+        """
+        args = self.parse_args( [ "MESSAGE" ], **messageStatement )
 
-        connectMatch = re.search("CONNECT\s+(\w+)\s+USING\s+(.*)",args["MESSAGE"],flags=0)
-        disconnectMatch = re.search("DISCONNECT\s+(.*)",args["MESSAGE"],flags=0)
-        ondoMatch = re.search("ON\s+(.*)\s+DO\s+(.*)",args["MESSAGE"],flags=0)
-        paramsMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]",args["MESSAGE"],flags=0)
-        stringMatch = re.search("\"(.*)\"|\'(.*)\'",args["MESSAGE"],flags=0)
-        variableMatch = re.search("\<(.*)\>",args["MESSAGE"],flags=0)
+        connectMatch = re.search( "CONNECT\s+(\w+)\s+USING\s+(.*)", args[ "MESSAGE" ], flags=0 )
+        disconnectMatch = re.search( "DISCONNECT\s+(.*)", args[ "MESSAGE" ], flags=0 )
+        ondoMatch = re.search( "ON\s+(.*)\s+DO\s+(.*)", args[ "MESSAGE" ], flags=0 )
+        paramsMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]", args[ "MESSAGE" ], flags=0 )
+        stringMatch = re.search( "\"( .* )\"|\'(.*)\'", args[ "MESSAGE" ], flags=0 )
+        variableMatch = re.search( "\<(.*)\>", args[ "MESSAGE" ], flags=0 )
 
         resultString = ''
-        if connectMatch :
-            resultString = resultString + self.translate_connect(component=connectMatch.group(1),
-                                                                 arguments=connectMatch.group(2) )
-        elif disconnectMatch :
-            resultString = resultString + self.translate_disconnect(component=disconnectMatch.group(1))
-        elif ondoMatch :
-            resultString = resultString + self.translate_onDOAs(component=ondoMatch.group(1),
-                                                                action=ondoMatch.group(2))
-        elif paramsMatch :
-            resultString = resultString + self.translate_parameters(parameters=args["MESSAGE"])
-        elif stringMatch :
+        if connectMatch:
+            resultString = resultString + self.translate_connect( component=connectMatch.group( 1 ),
+                                                                  arguments=connectMatch.group( 2 ) )
+        elif disconnectMatch:
+            resultString = resultString + self.translate_disconnect( component=disconnectMatch.group( 1 ) )
+        elif ondoMatch:
+            resultString = resultString + self.translate_onDOAs( component=ondoMatch.group( 1 ),
+                                                                 action=ondoMatch.group( 2 ) )
+        elif paramsMatch:
+            resultString = resultString + self.translate_parameters( parameters=args[ "MESSAGE" ] )
+        elif stringMatch:
             resultString = resultString + "\"" + stringMatch.group(1) + "\""
-        elif variableMatch :
-            resultString = resultString + variableMatch.group(1)
-        elif args["MESSAGE"]  == None :
+        elif variableMatch:
+            resultString = resultString + variableMatch.group( 1 )
+        elif args[ "MESSAGE" ] is None:
             print "\n Error : Please pass a message or action for assertion "
 
         return resultString
 
-    def translate_operator(self,**operatorStatement) :
-        '''
+    def translate_operator( self, **operatorStatement ):
+        """
           It will translate the operator for assertion , by ensuring against given arguments.
           It will return the translated assertion operator.
-        '''
-        args = self.parse_args(["OPERATOR"],**operatorStatement)
+        """
+        args = self.parse_args( [ "OPERATOR" ], **operatorStatement )
 
         resultString = ''
-        equalsMatch = re.match("EQUALS$|==$",args["OPERATOR"],flags=0)
-        greaterMatch = re.match("GREATER\s+THAN$|>$",args["OPERATOR"],flags=0)
-        lesserMatch = re.match("LESSER\s+THAN$|<$",args["OPERATOR"],flags=0)
-        stringMatch = re.match("MATCHES|~$",args["OPERATOR"],flags=0)
-        greaterEqualMatch =  re.match("GREATER\s+THAN\s+OR\s+EQUALS$|>=$",args["OPERATOR"],flags=0)
-        lesserEqualMatch = re.match("LESSER\s+THAN\s+OR\s+EQUALS$|<=$",args["OPERATOR"],flags=0)
-        if equalsMatch :
+        equalsMatch = re.match( "EQUALS$|==$", args[ "OPERATOR" ], flags=0 )
+        greaterMatch = re.match( "GREATER\s+THAN$|>$", args[ "OPERATOR" ], flags=0 )
+        lesserMatch = re.match( "LESSER\s+THAN$|<$", args[ "OPERATOR" ], flags=0 )
+        stringMatch = re.match( "MATCHES|~$", args[ "OPERATOR" ], flags=0 )
+        greaterEqualMatch = re.match( "GREATER\s+THAN\s+OR\s+EQUALS$|>=$", args[ "OPERATOR" ], flags=0 )
+        lesserEqualMatch = re.match( "LESSER\s+THAN\s+OR\s+EQUALS$|<=$", args[ "OPERATOR" ], flags=0 )
+        if equalsMatch:
 
             resultString = resultString + "equals"
-        elif greaterMatch :
+        elif greaterMatch:
             self.grtrOrLssr = self.grtrOrLssr + 1
             resultString = resultString + "greater"
-        elif lesserMatch :
+        elif lesserMatch:
             self.grtrOrLssr = self.grtrOrLssr + 1
             resultString = resultString + "lesser"
-        elif stringMatch :
+        elif stringMatch:
 
             resultString = resultString + "matches"
         elif greaterEqualMatch:
 
             resultString = resultString + "greater_equals"
-        elif lesserEqualMatch :
+        elif lesserEqualMatch:
 
             resultString = resultString + "lesser_equals"
-        else :
+        else:
             print "\n Error: Given Operator is not listed for assertion"
         return resultString
 
-    def translate_store(self,**storeStatement):
-        '''
+    def translate_store( self, **storeStatement ):
+        """
          This will translate the STORE <variable> IN <value> or <variable> = <value>
          into python equivalent to resultString and returns resultString
-        '''
-        args = self.parse_args(["VARIABLE","VALUE"],**storeStatement)
+        """
+        args = self.parse_args( [ "VARIABLE", "VALUE" ], **storeStatement )
         resultString = ''
         # convert the statement here
-        ondoMatch = re.match("^\s*ON\s+(.*)\s+DO\s+(.*)",args["VALUE"],flags=0)
-        paramsMatch = re.match("^\s*PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE",args["VALUE"],flags=0)
-        if paramsMatch :
-            argString = self.translate_parameters(parameters=args["VALUE"])
-            resultString = args["VARIABLE"] + " = " + argString
-        elif ondoMatch :
-            resultString = args["VARIABLE"] + " = "  + self.translate_onDOAs(component=ondoMatch.group(1),action=ondoMatch.group(2))
-        else :
-            resultString = args["VARIABLE"] + " = " + args["VALUE"]
-
+        ondoMatch = re.match( "^\s*ON\s+(.*)\s+DO\s+(.*)", args[ "VALUE" ], flags=0 )
+        paramsMatch = re.match( "^\s*PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE", args[ "VALUE" ], flags=0 )
+        if paramsMatch:
+            argString = self.translate_parameters( parameters=args[ "VALUE" ] )
+            resultString = args[ "VARIABLE" ] + " = " + argString
+        elif ondoMatch:
+            resultString = args[ "VARIABLE" ] + " = " + self.translate_onDOAs( component=ondoMatch.group( 1 ), action=ondoMatch.group( 2 ) )
+        else:
+            resultString = args[ "VARIABLE" ] + " = " + args[ "VALUE" ]
 
         return resultString
 
-    def translate_disconnect(self,**disconnectStatement):
-        '''
+    def translate_disconnect( self, **disconnectStatement ):
+        """
          This will translate the DISCONNECT <component_name> into python
          equivalent to resultString and returns resultString
-        '''
-        args = self.parse_args(["COMPONENT"],**disconnectStatement)
+        """
+        args = self.parse_args( [ "COMPONENT" ], **disconnectStatement )
         resultString = ''
         # convert the statement here
-        resultString = "main." + args["COMPONENT"] + ".disconnect()"
+        resultString = "main." + args[ "COMPONENT" ] + ".disconnect()"
         return resultString
 
-    def translate_onDOAs(self,**onDoStatement):
-        '''
+    def translate_onDOAs( self, **onDoStatement ):
+        """
          This will translate the ON <component> DO <action> USING <arg1> AS <value1>,<arg2> AS <value2>
          into python equivalent to resultString and returns resultString
-        '''
-        args = self.parse_args(["COMPONENT","ACTION","ARGUMENTS"],**onDoStatement)
+        """
+        args = self.parse_args( [ "COMPONENT", "ACTION", "ARGUMENTS" ], **onDoStatement )
         subString = ''
 
-        usingMatch = re.match("\s*(.*)\s+USING\s+(.*)",args["ACTION"],flags=0)
+        usingMatch = re.match( "\s*(.*)\s+USING\s+(.*)", args[ "ACTION" ], flags=0 )
         action = ''
-        if usingMatch :
-            action = usingMatch.group(1)
-            arguments = usingMatch.group(2)
-            subString = self.translate_usingas(arguments=arguments)
+        if usingMatch:
+            action = usingMatch.group( 1 )
+            arguments = usingMatch.group( 2 )
+            subString = self.translate_usingas( arguments=arguments )
 
-        else :
-            andCheck = re.search ("(.*)\s+AND\s+(.*)",args["ACTION"],flags=0)
+        else:
+            andCheck = re.search( "(.*)\s+AND\s+(.*)", args[ "ACTION" ], flags=0 )
 
             action = action + "()"
             if andCheck:
-                action = andCheck.group(1) + "()"
-                subString = subString + self.handle_conjuction(statement=andCheck.group(2))
-            else :
-                action = args["ACTION"]
+                action = andCheck.group( 1 ) + "()"
+                subString = subString + self.handle_conjuction( statement=andCheck.group( 2 ) )
+            else:
+                action = args[ "ACTION" ]
                 action = action + "()"
         # convert the statement here
-        resultString = "main." + args["COMPONENT"] + "." + action + subString
+        resultString = "main." + args[ "COMPONENT" ] + "." + action + subString
         return resultString
 
-
-    def handle_conjuction(self,**conjuctStatement):
-        '''
+    def handle_conjuction( self, **conjuctStatement ):
+        """
         This will handle the conjuctions
-        '''
-
-        args = self.parse_args(["STATEMENT"],**conjuctStatement)
+        """
+        args = self.parse_args( [ "STATEMENT" ], **conjuctStatement )
         subSentence = ''
 
-        storeMatch = re.match("\s*STORE\s+(.*)\s+IN\s+(.*)",args["STATEMENT"],flags=0)
-        assertMatch = re.match("\s*ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)",args["STATEMENT"],flags=0)
-        if storeMatch :
-            subSentence =  "\n" + " " * 8 + self.translate_store(variable=storeMatch.group(2),
-                                                                         value=storeMatch.group(1))
-        elif assertMatch :
-            subSentence = "\n" + " " * 8 + self.translate_assertion(leftvalue=assertMatch.group(1),
-                                                                    operator=assertMatch.group(2),
-                                                                    rightvalue=assertMatch.group(3),
-                                                                    onpass=assertMatch.group(4),
-                                                                    onfail=assertMatch.group(5))
+        storeMatch = re.match( "\s*STORE\s+(.*)\s+IN\s+(.*)", args[ "STATEMENT" ], flags=0 )
+        assertMatch = re.match( "\s*ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)", args[ "STATEMENT" ], flags=0 )
+        if storeMatch:
+            subSentence = "\n" + " " * 8 + self.translate_store( variable=storeMatch.group( 2 ),
+                                                                         value=storeMatch.group( 1 ) )
+        elif assertMatch:
+            subSentence = "\n" + " " * 8 + self.translate_assertion( leftvalue=assertMatch.group( 1 ),
+                                                                     operator=assertMatch.group( 2 ),
+                                                                     rightvalue=assertMatch.group( 3 ),
+                                                                     onpass=assertMatch.group( 4 ),
+                                                                     onfail=assertMatch.group( 5 ) )
         return subSentence
 
-    def translate_usingas(self,**argumentAS) :
-        '''
+    def translate_usingas( self, **argumentAS ):
+        """
          This will tranlate USING argument AS value Statement into equivalent argument passing.
          It will return translated form into resultString
-        '''
-        args = self.parse_args(["ARGUMENTS"],**argumentAS)
+        """
+        args = self.parse_args( [ "ARGUMENTS" ], **argumentAS )
         resultString = ''
         argsList = []
         subString = ''
         subSentence = ''
         line = ''
-        andCheck = re.search ("(.*)\s+AND\s+(.*)",args["ARGUMENTS"],flags=0)
+        andCheck = re.search( "(.*)\s+AND\s+(.*)", args[ "ARGUMENTS" ], flags=0 )
         if andCheck:
-            line = andCheck.group(1)
-            subSentence = self.handle_conjuction(statement=andCheck.group(2))
-        else :
-            line = args["ARGUMENTS"]
+            line = andCheck.group( 1 )
+            subSentence = self.handle_conjuction( statement=andCheck.group( 2 ) )
+        else:
+            line = args[ "ARGUMENTS" ]
 
+        argsMatch = re.search( "(.*),(.*)", line, flags=0 )
 
-
-        argsMatch = re.search("(.*),(.*)",line,flags=0)
-
-
-        if args["ARGUMENTS"] == None or args["ARGUMENTS"] == '' :
+        if args[ "ARGUMENTS" ] is None or args[ "ARGUMENTS" ] == '':
             subString = ''
-        elif argsMatch :
+        elif argsMatch:
 
-            argsList = line.split(",")
-            for index, arguments in enumerate(argsList):
-                argMatch = re.search("(.*)\s+AS\s+(.*)",arguments,flags=0)
+            argsList = line.split( "," )
+            for index, arguments in enumerate( argsList ):
+                argMatch = re.search( "(.*)\s+AS\s+(.*)", arguments, flags=0 )
                 if argMatch:
-                    argsKey =  argMatch.group(1)
-                    argsValue = argMatch.group(2)
-                    paramsMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT",argsValue,flags=0)
-                    if not paramsMatch :
-                        if index == len(argsList) - 1 :
-                            subString = subString +  argsKey + "=" + argsValue
-                        else :
-                            subString = subString +  argsKey + "=" + argsValue + ","
-                    else :
-                        argString = self.translate_parameters(parameters=argsValue)
-                        if index == len(argsList) - 1 :
-                            subString = subString +  argsKey + "=" + argString
-                        else :
-                            subString = subString +  argsKey + "=" + argString + ","
-                else :
-                    if index == len(argsList) - 1 :
-                        subString = subString +  arguments
-                    else :
+                    argsKey = argMatch.group( 1 )
+                    argsValue = argMatch.group( 2 )
+                    paramsMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT", argsValue, flags=0 )
+                    if not paramsMatch:
+                        if index == len( argsList ) - 1:
+                            subString = subString + argsKey + "=" + argsValue
+                        else:
+                            subString = subString + argsKey + "=" + argsValue + ","
+                    else:
+                        argString = self.translate_parameters( parameters=argsValue )
+                        if index == len( argsList ) - 1:
+                            subString = subString + argsKey + "=" + argString
+                        else:
+                            subString = subString + argsKey + "=" + argString + ","
+                else:
+                    if index == len( argsList ) - 1:
+                        subString = subString + arguments
+                    else:
                         subString = subString + arguments + ","
-        else :
-            argMatch = re.search("(.*)\s+AS\s+(.*)",args["ARGUMENTS"],flags=0)
+        else:
+            argMatch = re.search( "(.*)\s+AS\s+(.*)", args[ "ARGUMENTS" ], flags=0 )
             if argMatch:
-                argsKey =  argMatch.group(1)
-                argsValue = argMatch.group(2)
-                paramsMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT",argsValue,flags=0)
-                if not paramsMatch :
-                    subString = subString +  argsKey + "=" + argsValue
-                else :
-                    argString = self.translate_parameters(parameters=argsValue)
-                    subString = subString +  argsKey + "=" + argString
-            else :
-                paramsMatch = re.match("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT",line,flags=0)
-                if paramsMatch :
-                    subString = subString + self.translate_parameters(parameters=line)
-                else :
-                    subString = subString +  line
-        resultString = "(" + subString + ")"+ subSentence
+                argsKey = argMatch.group( 1 )
+                argsValue = argMatch.group( 2 )
+                paramsMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT", argsValue, flags=0 )
+                if not paramsMatch:
+                    subString = subString + argsKey + "=" + argsValue
+                else:
+                    argString = self.translate_parameters( parameters=argsValue )
+                    subString = subString + argsKey + "=" + argString
+            else:
+                paramsMatch = re.match( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT", line, flags=0 )
+                if paramsMatch:
+                    subString = subString + self.translate_parameters( parameters=line )
+                else:
+                    subString = subString + line
+        resultString = "(" + subString + ")" + subSentence
         return resultString
 
-
-    def translate_connect(self,**connectStatement):
-        '''
+    def translate_connect( self, **connectStatement ):
+        """
          This will translate the CONNECT <component_name> USING1 <arg1> AS <value1>, <arg2> AS <value2>
          into python equivalent to resultString and returns resultString
-        '''
-        args = self.parse_args(["COMPONENT","ARGUMENTS"],**connectStatement)
+        """
+        args = self.parse_args( [ "COMPONENT", "ARGUMENTS" ], **connectStatement )
         resultString = ''
-        subString = self.translate_usingas(arguments=args["ARGUMENTS"])
+        subString = self.translate_usingas( arguments=args[ "ARGUMENTS" ] )
         # convert the statement here
-        resultString = "main." + args["COMPONENT"] + ".connect(" + subString + ")"
+        resultString = "main." + args[ "COMPONENT" ] + ".connect(" + subString + ")"
         return resultString
 
-
-    def translate_parameters(self,**parameterStatement):
-        '''
+    def translate_parameters( self, **parameterStatement ):
+        """
          This will translate the OpenSpeak Case and Params parameters into python equivalent
          to resultString and returns resultString
-        '''
-        args = self.parse_args(["PARAMETERS"],**parameterStatement)
-        argument = args["PARAMETERS"]
+        """
+        args = self.parse_args( [ "PARAMETERS" ], **parameterStatement )
+        argument = args[ "PARAMETERS" ]
         resultString = ''
-        ### match arguments
-        paramsMatch = re.search("PARAMS((\[(.*)\])*)",argument,flags=0)
-        stepsMatch = re.search("STEP((\[(.*)\])*)",argument,flags=0)
-        casesMatch = re.search("CASE((\[(.*)\])*)",argument,flags=0)
-        topoMatch = re.search("TOPO((\[(.*)\])*)",argument,flags=0)
-        lastResultMatch = re.match("LAST_RESULT",argument,flags=0)
-        lastResponseMatch = re.match("LAST_RESPONSE",argument,flags=0)
+        # match arguments
+        paramsMatch = re.search( "PARAMS((\[(.*)\])*)", argument, flags=0 )
+        stepsMatch = re.search( "STEP((\[(.*)\])*)", argument, flags=0 )
+        casesMatch = re.search( "CASE((\[(.*)\])*)", argument, flags=0 )
+        topoMatch = re.search( "TOPO((\[(.*)\])*)", argument, flags=0 )
+        lastResultMatch = re.match( "LAST_RESULT", argument, flags=0 )
+        lastResponseMatch = re.match( "LAST_RESPONSE", argument, flags=0 )
         # convert the statement here
-        if paramsMatch :
-            params = paramsMatch.group(1)
-            resultString = resultString + "main.params" + self._argsCheck(checkvar=params)
-        elif stepsMatch :
-            resultString = resultString +"main.params[\'" + self.CurrentCase +\
-                           "\'][\'STEP" + str(self.CurrentStep) + "\']" +\
-                           self._argsCheck(checkvar=stepsMatch.group(1))
-        elif casesMatch :
+        if paramsMatch:
+            params = paramsMatch.group( 1 )
+            resultString = resultString + "main.params" + self._argsCheck( checkvar=params )
+        elif stepsMatch:
+            resultString = resultString + "main.params[\'" + self.CurrentCase +\
+                           "\'][\'STEP" + str( self.CurrentStep ) + "\']" +\
+                           self._argsCheck( checkvar=stepsMatch.group( 1 ) )
+        elif casesMatch:
             resultString = resultString + "main.params[\'" + self.CurrentCase + "\']" +\
-                           self._argsCheck(checkvar=casesMatch.group(1))
-        elif topoMatch :
+                           self._argsCheck( checkvar=casesMatch.group( 1 ) )
+        elif topoMatch:
             resultString = resultString + "main.componentDictionary" +\
-                           self._argsCheck(checkvar=topoMatch.group(1))
-        elif lastResultMatch :
+                           self._argsCheck( checkvar=topoMatch.group( 1 ) )
+        elif lastResultMatch:
             resultString = resultString + "main.last_result"
-        elif lastResponseMatch :
+        elif lastResponseMatch:
             resultString = resultString + "main.last_response"
         return resultString
 
-    def _argsCheck(self,**args):
-        ''' This API will check if given argument is varibale reference or String and will translate accordingly.
+    def _argsCheck( self, **args ):
+        """ This API will check if given argument is varibale reference or String and will translate accordingly.
             It will return the tanslate form in resultString.
-         '''
-        args = self.parse_args(["CHECKVAR"],**args)
-        params = args["CHECKVAR"]
-        argsList = params.split("]")
+         """
+        args = self.parse_args( [ "CHECKVAR" ], **args )
+        params = args[ "CHECKVAR" ]
+        argsList = params.split( "]" )
         resultString = ''
-        del argsList[len(argsList) - 1]
-        for index,paramArgs in enumerate(argsList) :
-            argsWidVariable = re.search("(\"|\')\s*(\w+)\s*(\'|\")",paramArgs,flags=0)
-            if argsWidVariable :
+        del argsList[ len( argsList ) - 1 ]
+        for index, paramArgs in enumerate( argsList ):
+            argsWidVariable = re.search( "(\"|\')\s*(\w+)\s*(\'|\")", paramArgs, flags=0 )
+            if argsWidVariable:
                 resultString = resultString + "[\'" + argsWidVariable.group(2) + "\']"
-            else :
+            else:
                 resultString = resultString + paramArgs + "]"
         return resultString
 
-    def translate_step(self,**stepStatement):
-        '''
+    def translate_step( self, **stepStatement ):
+        """
          This will translate the STEP "DO SOMETHING HERE" into python equivalent
          to resultString and returns resultString
-        '''
-        args = self.parse_args(["STEP"],**stepStatement)
+        """
+        args = self.parse_args( [ "STEP" ], **stepStatement )
         resultString = ''
         resultString = "main.step(\"" + args["STEP"] + "\")"
         # convert the statement here
         return resultString
 
-
-    def translate_comment(self,**commentStatement):
-        '''
+    def translate_comment( self, **commentStatement ):
+        """
          This will translate the COMMENT "DO SOMETHING HERE" into python equivalent
          to resultString and returns resultString
-        '''
-        args = self.parse_args(["COMMENT"],**commentStatement)
+        """
+        args = self.parse_args( [ "COMMENT" ], **commentStatement )
         resultString = ''
-        resultString = "#" + args["COMMENT"]
+        resultString = "#" + args[ "COMMENT" ]
         # convert the statement here
         return resultString
 
-    def translate_testcase_name(self,**nameStatement):
-        '''
+    def translate_testcase_name( self, **nameStatement ):
+        """
          This method will convert NAME "<Testcase_name>" into python equivalent statement
          to resultString and returns resultString
-        '''
-        args = self.parse_args(["TESTNAME"],**nameStatement)
+        """
+        args = self.parse_args( [ "TESTNAME" ], **nameStatement )
 
         resultString = ''
-        resultString = "main.case(\"" + args["TESTNAME"]  + "\")"
+        resultString = "main.case(\"" + args["TESTNAME"] + "\")"
         # convert the statement here
         return resultString
 
-
-    def translate_case_block(self,**caseBlock):
-        '''
+    def translate_case_block( self, **caseBlock ):
+        """
          This method will translate the case block in test script .
          It returns the translated equivalent python code for test script
-        '''
-        args = self.parse_args(["CASENUMBER"],**caseBlock)
+        """
+        args = self.parse_args( [ "CASENUMBER" ], **caseBlock )
         resultString = ""
-        resultString = "def CASE" + str(args["CASENUMBER"]) + "(self,main) :\n"
+        resultString = "def CASE" + str( args[ "CASENUMBER" ] ) + "(self,main) :\n"
         # process the caseBlock List translate all statements underlying the given case
         return resultString
 
-
-
-    def translate_loop_block(self,*loopBlock):
-        '''
+    def translate_loop_block( self, *loopBlock ):
+        """
          This method will translate for loop block into its equivalent python code.
          Whole loop block will be passed into loopBlock List.
          It returns the transalted reuslt as a string.
-        '''
+        """
         resultString = ''
         # process the loopBlock List translate all statements underlying the given loop block
         return resultString
 
-
-    def translate_conjuction(self,conjuctionStatement):
-        '''
+    def translate_conjuction( self, conjuctionStatement ):
+        """
          This will translate the AND conjuction statements into python equivalent
          to resultString and returns resultString
-        '''
+        """
         resultString = ''
         # convert the statement here
         return resultString
 
-
-    def parse_args(self,args, **kwargs):
-        '''
-        It will accept the (key,value) pair and will return the (key,value) pairs with keys in uppercase.
-        '''
+    def parse_args( self, args, **kwargs ):
+        """
+        It will accept the ( key,value ) pair and will return the ( key,value ) pairs with keys in uppercase.
+        """
         newArgs = {}
-        for key,value in kwargs.iteritems():
-            #currentKey =  str.upper(key)
-            if isinstance(args,list) and str.upper(key) in args:
+        for key, value in kwargs.iteritems():
+            # currentKey =  str.upper( key )
+            if isinstance( args, list ) and str.upper( key ) in args:
                 for each in args:
-                    if each==str.upper(key):
-                        newArgs [str(each)] = value
-                    elif each != str.upper(key) and (newArgs.has_key(str(each)) == False ):
-                        newArgs[str(each)] = None
-
-
+                    if each == str.upper( key ):
+                        newArgs[ str( each ) ] = value
+                    elif each != str.upper( key ) and not ( ( str( each ) in newArgs ) ):
+                        newArgs[ str( each ) ] = None
 
         return newArgs
diff --git a/TestON/core/teston.py b/TestON/core/teston.py
index 89315dc..d6ebc89 100644
--- a/TestON/core/teston.py
+++ b/TestON/core/teston.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
-'''
+"""
 Created on 22-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -24,8 +24,7 @@
 
 teston is the main module.
 
-'''
-
+"""
 import sys
 import getpass
 import os
@@ -55,21 +54,24 @@
 from core.utilities import Utilities
 from core.Thread import Thread
 
+
 class SkipCase( Exception ):
     pass
 
+
 class TestON:
-    '''
+
+    """
     TestON will initiate the specified test.
     The main tasks are:
     * Initiate the required Component handles for the test.
     * Create Log file  Handles.
-    '''
+    """
     def __init__( self, options ):
-        '''
+        """
            Initialise the component handles specified in the topology file of
            the specified test.
-        '''
+        """
         # Initialization of the variables.
         __builtin__.main = self
         __builtin__.path = path
@@ -110,19 +112,19 @@
         verifyOptions( options )
         load_logger()
         self.componentDictionary = {}
-        self.componentDictionary = self.topology['COMPONENT']
+        self.componentDictionary = self.topology[ 'COMPONENT' ]
         self.driversList = []
-        if isinstance( self.componentDictionary, str):
+        if isinstance( self.componentDictionary, str ):
             self.componentDictionary = dict( self.componentDictionary )
 
         for component in self.componentDictionary:
-            self.driversList.append( self.componentDictionary[component]['type'] )
+            self.driversList.append( self.componentDictionary[ component ][ 'type' ] )
 
         self.driversList = list( set( self.driversList ) )  # Removing duplicates.
         # Checking the test_target option set for the component or not
         if isinstance( self.componentDictionary, dict ):
             for component in self.componentDictionary.keys():
-                if 'test_target' in self.componentDictionary[component].keys():
+                if 'test_target' in self.componentDictionary[ component ].keys():
                     self.test_target = component
 
         # Checking for the openspeak file and test script
@@ -136,20 +138,20 @@
         components_connect_order = {}
         if isinstance( self.componentDictionary, dict ):
             for component in self.componentDictionary.keys():
-                if 'connect_order' not in self.componentDictionary[component].keys():
-                    self.componentDictionary[component]['connect_order'] = str( self.get_random() )
-                components_connect_order[component] = eval( self.componentDictionary[component]['connect_order'] )
+                if 'connect_order' not in self.componentDictionary[ component ].keys():
+                    self.componentDictionary[ component ][ 'connect_order' ] = str( self.get_random() )
+                components_connect_order[ component ] = eval( self.componentDictionary[ component ][ 'connect_order' ] )
             # Ordering components based on the connect order.
             ordered_component_list = sorted( components_connect_order,
-                                             key=lambda key: components_connect_order[key] )
+                                             key=lambda key: components_connect_order[ key ] )
             print ordered_component_list
             for component in ordered_component_list:
                 self.componentInit( component )
 
     def configparser( self ):
-        '''
-        It will parse the config file (teston.cfg) and return as dictionary
-        '''
+        """
+        It will parse the config file ( teston.cfg ) and return as dictionary
+        """
         matchFileName = re.match( r'(.*)\.cfg', self.configFile, re.M | re.I )
         if matchFileName:
             xml = open( self.configFile ).read()
@@ -162,57 +164,57 @@
             print "There is no such file to parse " + self.configFile
 
     def componentInit( self, component ):
-        '''
+        """
         This method will initialize specified component
-        '''
+        """
         global driver_options
         self.initiated = False
         self.log.info( "Creating component Handle: " + component )
         driver_options = {}
-        if 'COMPONENTS' in self.componentDictionary[component].keys():
-            driver_options = dict( self.componentDictionary[component]['COMPONENTS'] )
-        driver_options['name'] = component
-        driverName = self.componentDictionary[component]['type']
-        driver_options['type'] = driverName
+        if 'COMPONENTS' in self.componentDictionary[ component ].keys():
+            driver_options = dict( self.componentDictionary[ component ][ 'COMPONENTS' ] )
+        driver_options[ 'name' ] = component
+        driverName = self.componentDictionary[ component ][ 'type' ]
+        driver_options[ 'type' ] = driverName
 
         classPath = self.getDriverPath( driverName.lower() )
         driverModule = importlib.import_module( classPath )
         driverClass = getattr( driverModule, driverName )
         driverObject = driverClass()
 
-        if "OCN" in self.componentDictionary[component]['host'] and\
+        if "OCN" in self.componentDictionary[ component ][ 'host' ] and\
            main.onoscell:
-            self.componentDictionary[component]['host'] = main.mnIP
+            self.componentDictionary[ component ][ 'host' ] = main.mnIP
 
-        user_name = self.componentDictionary[component].get( 'user',
-                                                             getpass.getuser() )
-        ip_address = self.componentDictionary[component].get( 'host',
-                                                              'localhost' )
-        pwd = self.componentDictionary[component].get( 'password',
-                                                       'changeme' )
-        port = self.componentDictionary[component].get( 'port' )
+        user_name = self.componentDictionary[ component ].get( 'user',
+                                                               getpass.getuser() )
+        ip_address = self.componentDictionary[ component ].get( 'host',
+                                                                'localhost' )
+        pwd = self.componentDictionary[ component ].get( 'password',
+                                                         'changeme' )
+        port = self.componentDictionary[ component ].get( 'port' )
         connect_result = driverObject.connect( user_name=user_name,
                                                ip_address=ip_address,
                                                pwd=pwd,
                                                port=port,
-                                               options=driver_options)
+                                               options=driver_options )
 
         if not connect_result:
             self.log.error( "Exiting from the test execution because connecting to the " +
                             component + " component failed." )
             self.exit()
 
-        vars( self )[component] = driverObject
+        vars( self )[ component ] = driverObject
         self.initiated = True
         return driverObject
 
     def run( self ):
-        '''
+        """
            The Execution of the test script's cases listed in the Test params
            file will be done here then update each test case result.
            This method will return main.TRUE if it executed all the test cases
            successfully, else will retun main.FALSE
-        '''
+        """
         self.testCaseResult = {}
         self.TOTAL_TC = 0
         self.TOTAL_TC_RUN = 0
@@ -270,12 +272,12 @@
         self.CASERESULT = self.NORESULT
         stopped = False
         try:
-            self.code[self.testCaseNumber]
+            self.code[ self.testCaseNumber ]
         except KeyError:
             self.log.error( "There is no Test-Case " + self.testCaseNumber )
             return self.FALSE
         self.stepCount = 0
-        while self.stepCount < len( self.code[self.testCaseNumber].keys() ):
+        while self.stepCount < len( self.code[ self.testCaseNumber ].keys() ):
             result = self.runStep( self.code, self.testCaseNumber )
             if result == self.FALSE:
                 break
@@ -299,7 +301,7 @@
                 self.CASERESULT = self.TRUE
             else:
                 self.CASERESULT = self.NORESULT
-            self.testCaseResult[str( self.CurrentTestCaseNumber )] = self.CASERESULT
+            self.testCaseResult[ str( self.CurrentTestCaseNumber ) ] = self.CASERESULT
             self.organizeResult( self.CurrentTestCaseNumber, self.CASERESULT )
             self.logger.updateCaseResults( self )
             self.log.wiki( "<p>" + self.caseExplanation + "</p>" )
@@ -350,7 +352,7 @@
                 # NOTE: This is needed to catch results of main.step()'s
                 #       called inside functions or loops
                 self.stepResults = ( [], [], [], [] )
-                exec code[testCaseNumber][step] in module.__dict__
+                exec code[ testCaseNumber ][ step ] in module.__dict__
                 self.stepCount = self.stepCount + 1
                 self.parseStepResults( testCaseNumber )
             except SkipCase:  # Raised in self.skipCase()
@@ -361,9 +363,9 @@
                 self.stepCache += "\t\t" + self.onFailMsg + "\n"
                 self.stepCount = self.stepCount + 1
                 return self.FALSE
-            except StandardError as e:
+            except Exception as e:
                 try:
-                    stepNo = self.stepResults[0][ self.stepNumber - 1 ]
+                    stepNo = self.stepResults[ 0 ][ self.stepNumber - 1 ]
                 except IndexError:
                     stepNo = "<IndexError>"
                     main.log.warn( "Error trying to get step number. " +
@@ -371,7 +373,7 @@
                                    str( self.stepNumber ) + " and step " +
                                    str( self.stepNumber + 1 ) )
                 try:
-                    stepName = self.stepResults[1][ self.stepNumber - 1 ]
+                    stepName = self.stepResults[ 1 ][ self.stepNumber - 1 ]
                 except IndexError:
                     stepName = "<IndexError>"
                 self.log.error( "\nException in the following section of" +
@@ -401,7 +403,7 @@
         if cli.stop:
             cli.stop = False
             self.TOTAL_TC_NORESULT = self.TOTAL_TC_NORESULT + 1
-            self.testCaseResult[str( self.CurrentTestCaseNumber )] = "Stopped"
+            self.testCaseResult[ str( self.CurrentTestCaseNumber ) ] = "Stopped"
             self.logger.updateCaseResults( self )
             result = self.cleanup()
             return self.FALSE
@@ -412,12 +414,12 @@
         """
         try:
             # Iterate through each of the steps and print them
-            for index in range( len( self.stepResults[0] ) ):
+            for index in range( len( self.stepResults[ 0 ] ) ):
                 # stepResults = ( stepNo, stepName, stepResult, onFail )
-                stepNo = self.stepResults[0][ index ]
-                stepName = self.stepResults[1][ index ]
-                stepResult = self.stepResults[2][ index ]
-                onFail = self.stepResults[3][ index ]
+                stepNo = self.stepResults[ 0 ][ index ]
+                stepName = self.stepResults[ 1 ][ index ]
+                stepResult = self.stepResults[ 2 ][ index ]
+                onFail = self.stepResults[ 3 ][ index ]
                 self.stepCache += "\t" + str( testCaseNumber ) + "."
                 self.stepCache += str( stepNo ) + " "
                 self.stepCache += stepName + " - "
@@ -460,10 +462,10 @@
         caseHeader = "\n" + "*" * 40 + "\nStart of Test Case" +\
                      str( self.CurrentTestCaseNumber ) + " : "
         for driver in self.componentDictionary.keys():
-            vars( self )[driver + 'log'].info( caseHeader )
+            vars( self )[ driver + 'log' ].info( caseHeader )
 
     def addCaseFooter( self ):
-        stepNo = self.stepResults[0][-2]
+        stepNo = self.stepResults[ 0 ][ -2 ]
         if stepNo > 0:
             previousStep = " " + str( self.CurrentTestCaseNumber ) + "." +\
                            str( stepNo ) + ": " + str( self.stepName )
@@ -474,10 +476,10 @@
                      str( self.CurrentTestCaseNumber ) + "\n" + "*" * 40 + "\n"
 
         for driver in self.driversList:
-            vars( self )[driver].write( stepHeader + "\n" + caseFooter )
+            vars( self )[ driver ].write( stepHeader + "\n" + caseFooter )
 
     def cleanup( self ):
-        '''
+        """
         Print a summary of the current test's results then attempt to release
         all the component handles and the close opened file handles.
 
@@ -486,7 +488,7 @@
 
         This will return TRUE if all the component handles and log handles
         closed properly, else return FALSE.
-        '''
+        """
         result = self.TRUE
         lock = self.cleanupLock
         if lock.acquire( False ):
@@ -497,12 +499,12 @@
                         self.logger.testSummary( self )
                     components = self.componentDictionary
                     for component in sorted( components,
-                                             key=lambda item: components[item]['connect_order'],
+                                             key=lambda item: components[ item ][ 'connect_order' ],
                                              reverse=True ):
                         try:
-                            tempObject = vars( self )[component]
+                            tempObject = vars( self )[ component ]
                             print "Disconnecting from " + str( tempObject.name ) +\
-                                  ": " + str( tempObject.__class__)
+                                  ": " + str( tempObject.__class__ )
                             tempObject.disconnect()
                         except KeyboardInterrupt:
                             pass
@@ -510,14 +512,14 @@
                             # Component not created yet
                             self.log.warn( "Could not find the component " +
                                            str( component ) )
-                        except StandardError:
+                        except Exception:
                             self.log.exception( "Exception while disconnecting from " +
                                                  str( component ) )
                             result = self.FALSE
                     # Closing all the driver's session files
                     for driver in self.componentDictionary.keys():
                         try:
-                            vars( self )[driver].close_log_handles()
+                            vars( self )[ driver ].close_log_handles()
                         except KeyboardInterrupt:
                             pass
                         except KeyError:
@@ -525,7 +527,7 @@
                             self.log.warn( "Could not find the component " +
                                            str( driver ) + " while trying to" +
                                            " close log file" )
-                        except StandardError:
+                        except Exception:
                             self.log.exception( "Exception while closing log files for " +
                                                  str( driver ) )
                             result = self.FALSE
@@ -543,41 +545,41 @@
         return result
 
     def pause( self ):
-        '''
+        """
         This function will pause the test's execution, and will continue after
         user provide 'resume' command.
-        '''
+        """
         __builtin__.testthread.pause()
 
     def onfail( self, *components ):
-        '''
+        """
         When test step failed, calling all the components onfail.
-        '''
+        """
         if not components:
             try:
                 for component in self.componentDictionary.keys():
-                    tempObject = vars( self )[component]
+                    tempObject = vars( self )[ component ]
                     result = tempObject.onfail()
-            except StandardError as e:
+            except Exception as e:
                 print str( e )
                 result = self.FALSE
         else:
             try:
                 for component in components:
-                    tempObject = vars( self )[component]
+                    tempObject = vars( self )[ component ]
                     result = tempObject.onfail()
-            except StandardError as e:
+            except Exception as e:
                 print str( e )
                 result = self.FALSE
 
     def getDriverPath( self, driverName ):
-        '''
+        """
            Based on the component 'type' specified in the params , this method
            will find the absolute path, by recursively searching the name of
            the component.
 
            NOTE: This function requires the linux 'find' command.
-        '''
+        """
         import commands
 
         cmd = "find " + drivers_path + " -name " + driverName + ".py"
@@ -602,66 +604,66 @@
         return result
 
     def step( self, stepDesc ):
-        '''
+        """
            The step information of the test-case will append to the logs.
-        '''
+        """
         previousStep = " " + str( self.CurrentTestCaseNumber ) + "." +\
                        str( self.stepNumber ) + ": " + str( self.stepName )
         self.stepName = stepDesc
         self.stepNumber += 1
-        self.stepResults[0].append( self.stepNumber )
-        self.stepResults[1].append( stepDesc )
-        self.stepResults[2].append( self.NORESULT )
-        self.stepResults[3].append( "No on fail message given" )
+        self.stepResults[ 0 ].append( self.stepNumber )
+        self.stepResults[ 1 ].append( stepDesc )
+        self.stepResults[ 2 ].append( self.NORESULT )
+        self.stepResults[ 3 ].append( "No on fail message given" )
 
         stepName = " " + str( self.CurrentTestCaseNumber ) + "." +\
                    str( self.stepNumber ) + ": " + str( stepDesc )
-        self.log.step(stepName)
+        self.log.step( stepName )
         stepHeader = ""
         line = "\n" + "-" * 45 + "\n"
         if self.stepNumber > 1:
             stepHeader = line + "End of Step " + previousStep + line
         stepHeader += line + "Start of Step" + stepName + line
         for driver in self.componentDictionary.keys():
-            vars( self )[driver + 'log'].info( stepHeader )
+            vars( self )[ driver + 'log' ].info( stepHeader )
 
     def case( self, testCaseName ):
-        '''
+        """
            Test's each test-case information will append to the logs.
-        '''
+        """
         self.CurrentTestCase = testCaseName
         testCaseName = " " + str( testCaseName )
         self.log.case( testCaseName )
         caseHeader = testCaseName + "\n" + "*" * 40 + "\n"
         for driver in self.componentDictionary.keys():
-            vars( self )[driver + 'log'].info( caseHeader )
+            vars( self )[ driver + 'log' ].info( caseHeader )
 
     def testDesc( self, description ):
-        '''
+        """
            Test description will append to the logs.
-        '''
+        """
         description = "Test Description : " + str( description )
         self.log.info( description )
 
     def _getTest( self ):
-        '''
+        """
         This method will parse the test script to find required test
         information.
-        '''
+        """
         testFileHandler = open( main.testFile, 'r' )
         testFileList = testFileHandler.readlines()
         testFileHandler.close()
         counter = 0
         for index in range( len( testFileList ) ):
             lineMatch = re.match( '\s+def CASE(\d+)(.*):',
-                                  testFileList[index],
+                                  testFileList[ index ],
                                   0 )
             if lineMatch:
                 counter = counter + 1
                 self.TC_PLANNED = len( self.testcases_list )
 
     def response_parser( self, response, return_format ):
-        ''' It will load the default response parser '''
+        " It will load the default response parser "
         response_dict = {}
         response_dict = self.response_to_dict( response, return_format )
         return_format_string = self.dict_to_return_format( response,
@@ -678,14 +680,14 @@
             self.log.info( "Response is in 'JSON' format, converting to '" +
                            return_format + "' format" )
             # Formatting the json string
-            response = re.sub( r"{\s*'?(\w)", r'{"\1', response )
+            response = re.sub( r"{\s*'?(\w)", r'{ "\1', response )
             response = re.sub( r",\s*'?(\w)", r',"\1', response )
             response = re.sub( r"(\w)'?\s*:", r'\1":', response )
             response = re.sub( r":\s*'(\w)'\s*([,}])", r':"\1"\2', response )
             try:
                 import json
                 response_dict = json.loads( response )
-            except StandardError:
+            except Exception:
                 self.log.exception( "Json Parser is unable to parse the string" )
             return response_dict
         elif ini_match:
@@ -704,21 +706,21 @@
                 response_dict = xmldict.xml_to_dict( "<response> " +
                                                      str( response ) +
                                                      " </response>" )
-            except StandardError:
+            except Exception:
                 self.log.exception()
             return response_dict
 
     def dict_to_return_format( self, response, return_format, response_dict ):
         if return_format == 'table':
-            ''' Will return in table format'''
+            " Will return in table format"
             to_do = "Call the table output formatter"
             global response_table
             response_table = '\n'
             response_table = response_table + '\t'.join( response_dict ) + "\n"
 
             def get_table( value_to_convert ):
-                ''' This will parse the dictionary recusrsively and print as
-                    table format'''
+                """ This will parse the dictionary recusrsively and print as
+                    table format"""
                 table_data = ""
                 if isinstance( value_to_convert, dict ):
                     table_data = table_data + '\t'.join( value_to_convert ) +\
@@ -734,7 +736,7 @@
             return response_table
 
         elif return_format == 'config':
-            ''' Will return in config format'''
+            " Will return in config format"
             to_do = 'Call dict to config coverter'
             response_string = str( response_dict )
             print response_string
@@ -745,12 +747,12 @@
             response_config = re.sub( ":", " =", response_config )
             return "[response]\n\t " + response_config
         elif return_format == 'xml':
-            ''' Will return in xml format'''
+            " Will return in xml format"
             response_xml = xmldict.dict_to_xml( response_dict )
             response_xml = re.sub( ">\s*<", ">\n<", response_xml )
             return "\n" + response_xml
         elif return_format == 'json':
-            ''' Will return in json format'''
+            " Will return in json format"
             to_do = 'Call dict to xml coverter'
             import json
             response_json = json.dumps( response_dict )
@@ -815,10 +817,10 @@
 
 
 def verifyOptions( options ):
-    '''
+    """
     This will verify the command line options and set to default values,
     if any option not given in command line.
-    '''
+    """
     verifyTest( options )
     verifyExample( options )
     verifyTestScript( options )
@@ -828,6 +830,7 @@
     verifyTestCases( options )
     verifyOnosCell( options )
 
+
 def verifyTest( options ):
     try:
         if options.testname:
@@ -842,12 +845,14 @@
         print "Test or Example not specified please specify the --test <test name > or --example <example name>"
         main.exit()
 
+
 def verifyExample( options ):
     if options.example:
         main.testDir = path + '/examples/'
         main.tests_path = path + "/examples/"
         main.classPath = "examples." + main.TEST + "." + main.TEST
 
+
 def verifyLogdir( options ):
     # Verifying Log directory option
     if options.logdir:
@@ -855,20 +860,22 @@
     else:
         main.logdir = main.FALSE
 
+
 def verifyMail( options ):
     # Mail-To: field
     if options.mail:  # Test run specific
         main.mail = options.mail
-    elif main.params.get('mail'):  # Test suite specific
+    elif main.params.get( 'mail' ):  # Test suite specific
         main.mail = main.params.get( 'mail' )
     else:  # TestON specific
-        main.mail = main.config['config'].get( 'mail_to' )
+        main.mail = main.config[ 'config' ].get( 'mail_to' )
     # Mail-From: field
-    main.sender = main.config['config'].get( 'mail_from' )
+    main.sender = main.config[ 'config' ].get( 'mail_from' )
     # Mail smtp server
-    main.smtp = main.config['config'].get( 'mail_server' )
+    main.smtp = main.config[ 'config' ].get( 'mail_server' )
     # Mail-From account password
-    main.senderPwd = main.config['config'].get( 'mail_pass' )
+    main.senderPwd = main.config[ 'config' ].get( 'mail_pass' )
+
 
 def evalTestCase( tempList ):
     tList = []
@@ -876,9 +883,10 @@
         if isinstance( tcase, list ):
             tList.extend( evalTestCase( tcase ) )
         else:
-            tList.extend( [tcase] )
+            tList.extend( [ tcase ] )
     return tList
 
+
 def verifyTestCases( options ):
     # Getting Test cases list
     if options.testcases:
@@ -888,13 +896,14 @@
         main.testcases_list = eval( testcases_list + "," )
     else:
         if 'testcases' in main.params.keys():
-            temp = eval( main.params['testcases'] + "," )
+            temp = eval( main.params[ 'testcases' ] + "," )
             main.testcases_list = evalTestCase( list( temp ) )
         else:
             print "Testcases not specifed in params, please provide in " +\
                   "params file or 'testcases' commandline argument"
             sys.exit()
 
+
 def verifyOnosCell( options ):
     # Verifying onoscell option
     if options.onoscell:
@@ -902,40 +911,41 @@
         main.ONOSip = []
         main.mnIP = ""
         cellCMD = ". ~/onos/tools/dev/bash_profile; cell " + main.onoscell
-        output = subprocess.check_output( ["bash", '-c', cellCMD] )
+        output = subprocess.check_output( [ "bash", '-c', cellCMD ] )
         splitOutput = output.splitlines()
         main.apps = ""
         for i in range( len( splitOutput ) ):
-            if re.match( "OCN", splitOutput[i] ):
-                mnNode = splitOutput[i].split( "=" )
-                main.mnIP = mnNode[1]
+            if re.match( "OCN", splitOutput[ i ] ):
+                mnNode = splitOutput[ i ].split( "=" )
+                main.mnIP = mnNode[ 1 ]
             # cell already sorts OC variables in bash, so no need to
             # sort in TestON
-            elif re.match( "OC[1-9]", splitOutput[i] ):
-                onosNodes = splitOutput[i].split( "=" )
-                main.ONOSip.append( onosNodes[1] )
-            elif re.match( "ONOS_APPS", splitOutput[i] ):
-                main.apps = ( splitOutput[i].split( "=" ) )[1]
+            elif re.match( "OC[1-9]", splitOutput[ i ] ):
+                onosNodes = splitOutput[ i ].split( "=" )
+                main.ONOSip.append( onosNodes[ 1 ] )
+            elif re.match( "ONOS_APPS", splitOutput[ i ] ):
+                main.apps = ( splitOutput[ i ].split( "=" ) )[ 1 ]
     else:
         main.onoscell = main.FALSE
 
+
 def verifyTestScript( options ):
-    '''
+    """
     Verifyies test script.
-    '''
+    """
     main.openspeak = openspeak.OpenSpeak()
     directory = main.testDir + "/" + main.TEST
     if os.path.exists( directory ):
         pass
     else:
         directory = ""
-        for root, dirs, files in os.walk( main.testDir, topdown=True):
+        for root, dirs, files in os.walk( main.testDir, topdown=True ):
             if not directory:
                 for name in dirs:
                     if name == main.TEST:
                         directory = ( os.path.join( root, name ) )
                         index = directory.find( "/tests/" ) + 1
-                        main.classPath = directory[index:].replace( '/', '.' ) + "." + main.TEST
+                        main.classPath = directory[ index: ].replace( '/', '.' ) + "." + main.TEST
                         break
     openspeakfile = directory + "/" + main.TEST + ".ospk"
     main.testFile = directory + "/" + main.TEST + ".py"
@@ -955,7 +965,7 @@
         testModule = __import__( main.classPath,
                                  globals(),
                                  locals(),
-                                 [main.TEST],
+                                 [ main.TEST ],
                                  -1 )
     except ImportError:
         print "There was an import error, it might mean that there is " +\
@@ -968,21 +978,22 @@
     main.params = main.parser.parseParams( main.classPath )
     main.topology = main.parser.parseTopology( main.classPath )
 
+
 def verifyParams( options ):
     try:
-        main.params = main.params['PARAMS']
+        main.params = main.params[ 'PARAMS' ]
     except KeyError:
         print "Error with the params file: Either the file not specified " +\
               "or the format is not correct"
         main.exit()
     try:
-        main.topology = main.topology['TOPOLOGY']
+        main.topology = main.topology[ 'TOPOLOGY' ]
     except KeyError:
         print "Error with the Topology file: Either the file not specified " +\
               "or the format is not correct"
         main.exit()
     # Overwrite existing params variables if they are specified from command line
-    if len(options.params) > 0:
+    if len( options.params ) > 0:
         # Some params variables are specified from command line
         for param in options.params:
             if not re.search( ".=.", param ):
@@ -997,7 +1008,7 @@
             # Get the innermost dictionary
             try:
                 while len( keyList ) > 1:
-                    key = keyList.pop(0)
+                    key = keyList.pop( 0 )
                     assert isinstance( paramDict[ key ], dict )
                     paramDict = paramDict[ key ]
             except KeyError:
@@ -1007,38 +1018,39 @@
                 print( "Error when parsing params: \"" + key + "\" is already the innermost level in main.params" )
                 main.exit()
             # Change the value
-            if not paramDict.has_key( keyList[0] ):
+            if keyList[ 0 ] not in paramDict:
                 print( "Error when parsing params: key \"" + keyList[0] + "\" not found in main.params" )
                 main.exit()
-            elif isinstance( paramDict[ keyList[0] ], dict ):
+            elif isinstance( paramDict[ keyList[ 0 ] ], dict ):
                 print( "Error when parsing params: more levels under key \"" + keyList[0] + "\" in main.params" )
                 main.exit()
             else:
-                paramDict[ keyList[0] ] = value
+                paramDict[ keyList[ 0 ] ] = value
+
 
 def load_parser():
-    '''
+    """
     It facilitates the loading customised parser for topology and params file.
     It loads parser mentioned in tab named parser of teston.cfg file.
     It also loads default xmlparser if no parser have specified in teston.cfg
     file.
 
-    '''
+    """
     confighash = main.configDict
-    if 'file' in confighash['config']['parser'] and\
-       'class' in confighash['config']['parser']:
-        path = confighash['config']['parser']['file']
+    if 'file' in confighash[ 'config' ][ 'parser' ] and\
+       'class' in confighash[ 'config' ][ 'parser' ]:
+        path = confighash[ 'config' ][ 'parser' ][ 'file' ]
         if path is not None or\
-           confighash['config']['parser']['class'] is not None:
+           confighash[ 'config' ][ 'parser' ][ 'class' ] is not None:
             try:
                 module = re.sub( r".py\s*$", "", path )
-                moduleList = module.split("/")
-                newModule = ".".join( moduleList[-2:] )
-                parsingClass = confighash['config']['parser']['class']
+                moduleList = module.split( "/" )
+                newModule = ".".join( moduleList[ -2: ] )
+                parsingClass = confighash[ 'config' ][ 'parser' ][ 'class' ]
                 parsingModule = __import__( newModule,
                                             globals(),
                                             locals(),
-                                            [parsingClass],
+                                            [ parsingClass ],
                                             -1 )
                 parsingClass = getattr( parsingModule, parsingClass )
                 main.parser = parsingClass()
@@ -1053,25 +1065,26 @@
                 print "Could not find the file " + path +\
                       " using default parser."
                 load_defaultParser()
-        elif confighash['config']['parser']['file'] is None or\
-             confighash['config']['parser']['class'] is None:
+        elif confighash[ 'config' ][ 'parser' ][ 'file' ] is None or\
+             confighash[ 'config' ][ 'parser' ][ 'class' ] is None:
             load_defaultParser()
     else:
         load_defaultParser()
 
+
 def load_defaultParser():
-    '''
+    """
     It will load the default parser which is xml parser to parse the params and
     topology file.
-    '''
-    moduleList = main.parserPath.split("/")
-    newModule = ".".join( moduleList[-2:] )
+    """
+    moduleList = main.parserPath.split( "/" )
+    newModule = ".".join( moduleList[ -2: ] )
     try:
         parsingClass = main.parsingClass
         parsingModule = __import__( newModule,
                                     globals(),
                                     locals(),
-                                    [parsingClass],
+                                    [ parsingClass ],
                                     -1 )
         parsingClass = getattr( parsingModule, parsingClass )
         main.parser = parsingClass()
@@ -1082,30 +1095,31 @@
         else:
             main.exit()
     except ImportError:
-        print sys.exc_info()[1]
+        print sys.exc_info()[ 1 ]
+
 
 def load_logger():
-    '''
+    """
     It facilitates the loading customised parser for topology and params file.
     It loads parser mentioned in tab named parser of teston.cfg file.
     It also loads default xmlparser if no parser have specified in teston.cfg
     file.
-    '''
+    """
     confighash = main.configDict
-    if 'file' in confighash['config']['logger'] and\
-       'class' in confighash['config']['logger']:
-        path = confighash['config']['logger']['file']
+    if 'file' in confighash[ 'config' ][ 'logger' ] and\
+       'class' in confighash[ 'config' ][ 'logger' ]:
+        path = confighash[ 'config' ][ 'logger' ][ 'file' ]
         if path is not None or\
-           confighash['config']['logger']['class'] is not None:
+           confighash[ 'config' ][ 'logger' ][ 'class' ] is not None:
             try:
                 module = re.sub( r".py\s*$", "", path )
                 moduleList = module.split( "/" )
-                newModule = ".".join( moduleList[-2:] )
-                loggerClass = confighash['config']['logger']['class']
+                newModule = ".".join( moduleList[ -2: ] )
+                loggerClass = confighash[ 'config' ][ 'logger' ][ 'class' ]
                 loggerModule = __import__( newModule,
                                            globals(),
                                            locals(),
-                                           [loggerClass],
+                                           [ loggerClass ],
                                            -1 )
                 loggerClass = getattr( loggerModule, loggerClass )
                 main.logger = loggerClass()
@@ -1113,32 +1127,34 @@
                 print "Could not find the file " + path +\
                       " using default logger."
                 load_defaultlogger()
-        elif confighash['config']['parser']['file'] is None or\
-             confighash['config']['parser']['class'] is None:
+        elif confighash[ 'config' ][ 'parser' ][ 'file' ] is None or\
+             confighash[ 'config' ][ 'parser' ][ 'class' ] is None:
             load_defaultlogger()
     else:
         load_defaultlogger()
 
+
 def load_defaultlogger():
-    '''
+    """
     It will load the default parser which is xml parser to parse the params and
     topology file.
-    '''
-    moduleList = main.loggerPath.split("/")
-    newModule = ".".join( moduleList[-2:] )
+    """
+    moduleList = main.loggerPath.split( "/" )
+    newModule = ".".join( moduleList[ -2: ] )
     try:
         loggerClass = main.loggerClass
         loggerModule = __import__( newModule,
                                    globals(),
                                    locals(),
-                                   [loggerClass],
+                                   [ loggerClass ],
                                    -1 )
         loggerClass = getattr( loggerModule, loggerClass )
         main.logger = loggerClass()
 
     except ImportError:
-        print sys.exc_info()[1]
+        print sys.exc_info()[ 1 ]
         main.exit()
 
+
 def _echo( self ):
     print "THIS IS ECHO"
diff --git a/TestON/core/testparser.py b/TestON/core/testparser.py
index 904ebc0..08e4198 100644
--- a/TestON/core/testparser.py
+++ b/TestON/core/testparser.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-'''
+"""
 Created on 26-Dec-2012
 Modified 2015 by ON.Lab
 
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,16 +21,19 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
-'''
+"""
 import re
 import sys
+
+
 class TestParser:
-    def __init__(self,testFile):
-        try :
-            testFileHandler = open(testFile, 'r')
+
+    def __init__( self, testFile ):
+        try:
+            testFileHandler = open( testFile, 'r' )
         except IOError:
-            print "No such file "+testFile
-            sys.exit(0)
+            print "No such file " + testFile
+            sys.exit( 0 )
 
         testFileList = testFileHandler.readlines()
         self.testscript = testFileList
@@ -39,89 +42,89 @@
         self.statementsList = []
         index = 0
         self.statementsList = []
-        #initialSpaces = len(line) -len(line.lstrip())
-        while index < len(testFileList):
-            testFileList[index] = re.sub("^\s{8}|^\s{4}", "", testFileList[index])
+        # initialSpaces = len( line ) -len( line.lstrip() )
+        while index < len( testFileList ):
+            testFileList[ index ] = re.sub( "^\s{8}|^\s{4}", "", testFileList[ index ] )
             # Skip multiline comments
-            if re.match('^(\'\'\')|^(\"\"\")',testFileList[index],0) :
+            if re.match( '^(\'\'\' )|^( \"\"\" )', testFileList[ index ], 0 ):
                 index = index + 1
-                try :
-                    while not re.match('^\s*(\'\'\')|^\s*(\"\"\")',testFileList[index],0) :
+                try:
+                    while not re.match( '^\s*(\'\'\' )|^\s*( \"\"\" )', testFileList[ index ], 0 ):
                         index = index + 1
                 except IndexError:
                     print ''
 
             # skip empty lines and single line comments
-            elif not re.match('#|^\s*$',testFileList[index],0):
-                self.statementsList.append(testFileList[index])
+            elif not re.match( '#|^\s*$', testFileList[ index ], 0 ):
+                self.statementsList.append( testFileList[ index ] )
             index = index + 1
 
-    def case_code(self):
+    def case_code( self ):
         index = 0
         statementsList = self.statementsList
-        while index < len(statementsList):
-            m= re.match('def\s+CASE(\d+)',statementsList[index],0)
+        while index < len( statementsList ):
+            m = re.match( 'def\s+CASE(\d+)', statementsList[ index ], 0 )
             self.caseBlock = []
             if m:
                 index = index + 1
-                try :
-                    while not re.match('\s*def\s+CASE(\d+)',statementsList[index],0) :
-                        self.caseBlock.append(statementsList[index])
-                        if index < len(statementsList)-1:
+                try:
+                    while not re.match( '\s*def\s+CASE(\d+)', statementsList[ index ], 0 ):
+                        self.caseBlock.append( statementsList[ index ] )
+                        if index < len( statementsList ) - 1:
                             index = index + 1
-                        else :
+                        else:
                             break
                     index = index - 1
                 except IndexError:
                     print ''
-                self.caseCode [str(m.group(1))] = self.caseBlock
+                self.caseCode[ str( m.group( 1 ) ) ] = self.caseBlock
             index = index + 1
         return self.caseCode
 
-    def step_code(self,caseStatements):
+    def step_code( self, caseStatements ):
         index = 0
         step = 0
         stepCode = {}
         step_flag = False
-        while index < len(caseStatements):
-            m= re.match('main\.step',caseStatements[index],0)
+        while index < len( caseStatements ):
+            m = re.match( 'main\.step', caseStatements[ index ], 0 )
             stepBlock = ''
             if m:
                 step_flag = True
-                if step == 0 :
+                if step == 0:
                     i = 0
                     block = ''
-                    while i < index :
-                        block += caseStatements[i]
+                    while i < index:
+                        block += caseStatements[ i ]
                         i = i + 1
-                    stepCode[step] = block
+                    stepCode[ step ] = block
                     step = step + 1
-                stepBlock = stepBlock + caseStatements[index]
+                stepBlock = stepBlock + caseStatements[ index ]
                 index = index + 1
-                try :
-                    while not re.match('main\.step',caseStatements[index],0) :
-                        stepBlock = stepBlock + caseStatements[index]
-                        if index < len(caseStatements)-1:
+                try:
+                    while not re.match( 'main\.step', caseStatements[ index ], 0 ):
+                        stepBlock = stepBlock + caseStatements[ index ]
+                        if index < len( caseStatements ) - 1:
                             index = index + 1
-                        else :
+                        else:
                             break
                     index = index - 1
                 except IndexError:
                     print ''
-                stepCode[step] = stepBlock
+                stepCode[ step ] = stepBlock
                 step = step + 1
             index = index + 1
         # If there is no step defined !!
-        if not step_flag :
-            stepCode[step] = "".join(caseStatements)
+        if not step_flag:
+            stepCode[ step ] = "".join( caseStatements )
         return stepCode
 
-    def getStepCode(self):
+    def getStepCode( self ):
         case_step_code = {}
         case_block = self.case_code()
-        for case in case_block :
-            case_step_code[case] = {}
-            step_block = self.step_code(case_block[case])
-            for step in step_block :
-                case_step_code[case][step] = step_block[step]
+        for case in case_block:
+            case_step_code[ case ] = {}
+            step_block = self.step_code( case_block[ case ] )
+            for step in step_block:
+                case_step_code[ case ][ step ] = step_block[ step ]
         return case_step_code
diff --git a/TestON/core/utilities.py b/TestON/core/utilities.py
index 2f7e5bb..fee2899 100644
--- a/TestON/core/utilities.py
+++ b/TestON/core/utilities.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
-'''
+"""
 Created on 23-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -26,7 +26,7 @@
    * parse_args for key-value pair handling
    * Parsing the params or topology file.
 
-'''
+"""
 import re
 from configobj import ConfigObj
 from core import ast as ast
@@ -38,56 +38,57 @@
 import time
 import random
 
+
 class Utilities:
-    '''
+
+    """
        Utilities will take care about the basic functions like :
        * Extended assertion,
        * parse_args for key-value pair handling
        * Parsing the params or topology file.
-    '''
+    """
+    def __init__( self ):
+        self.wrapped = sys.modules[ __name__ ]
 
-    def __init__(self):
-        self.wrapped = sys.modules[__name__]
-
-    def __getattr__(self, name):
-        '''
+    def __getattr__( self, name ):
+        """
         This will invoke, if the attribute wasn't found the usual ways.
         Here it will look for assert_attribute and will execute when AttributeError occurs.
         It will return the result of the assert_attribute.
-        '''
+        """
         try:
-            return getattr(self.wrapped, name)
+            return getattr( self.wrapped, name )
         except AttributeError:
-            def assertHandling(**kwargs):
-                nameVar = re.match("^assert",name,flags=0)
-                matchVar = re.match("assert(_not_|_)(equals|matches|greater|lesser)",name,flags=0)
+            def assertHandling( **kwargs ):
+                nameVar = re.match( "^assert", name, flags=0 )
+                matchVar = re.match( "assert(_not_|_)(equals|matches|greater|lesser)", name, flags=0 )
                 notVar = 0
                 operators = ""
 
-                try :
-                    if matchVar.group(1) == "_not_" and matchVar.group(2) :
+                try:
+                    if matchVar.group( 1 ) == "_not_" and matchVar.group( 2 ):
                         notVar = 1
-                        operators = matchVar.group(2)
-                    elif matchVar.group(1) == "_" and matchVar.group(2):
-                        operators = matchVar.group(2)
+                        operators = matchVar.group( 2 )
+                    elif matchVar.group( 1 ) == "_" and matchVar.group( 2 ):
+                        operators = matchVar.group( 2 )
                 except AttributeError:
-                    if matchVar==None and nameVar:
-                        operators ='equals'
-                result = self._assert(NOT=notVar,operator=operators,**kwargs)
+                    if matchVar is None and nameVar:
+                        operators = 'equals'
+                result = self._assert( NOT=notVar, operator=operators, **kwargs )
                 if result == main.TRUE:
-                    main.log.info("Assertion Passed")
+                    main.log.info( "Assertion Passed" )
                     main.STEPRESULT = main.TRUE
                 elif result == main.FALSE:
-                    main.log.warn("Assertion Failed")
+                    main.log.warn( "Assertion Failed" )
                     main.STEPRESULT = main.FALSE
                 else:
-                    main.log.error("There is an Error in Assertion")
+                    main.log.error( "There is an Error in Assertion" )
                     main.STEPRESULT = main.ERROR
                 return result
             return assertHandling
 
-    def _assert (self,**assertParam):
-        '''
+    def _assert( self, **assertParam ):
+        """
         It will take the arguments :
         expect:'Expected output'
         actual:'Actual output'
@@ -98,30 +99,29 @@
 
         It will return the assertion result.
 
-        '''
-
-        arguments = self.parse_args(["EXPECT","ACTUAL","ONPASS","ONFAIL","NOT","OPERATOR"],**assertParam)
+        """
+        arguments = self.parse_args( [ "EXPECT", "ACTUAL", "ONPASS", "ONFAIL", "NOT", "OPERATOR" ], **assertParam )
 
         result = 0
         valuetype = ''
-        operation = "not "+ str(arguments["OPERATOR"]) if arguments['NOT'] and arguments['NOT'] == 1 else arguments["OPERATOR"]
-        operators = {'equals':{'STR':'==','NUM':'=='}, 'matches' : '=~', 'greater':'>' ,'lesser':'<'}
+        operation = "not " + str( arguments[ "OPERATOR" ] ) if arguments[ 'NOT' ] and arguments[ 'NOT' ] == 1 else arguments[ "OPERATOR" ]
+        operators = { 'equals': { 'STR': '==', 'NUM': '==' }, 'matches': '=~', 'greater': '>', 'lesser': '<' }
 
-        expectMatch = re.match('^\s*[+-]?0(e0)?\s*$', str(arguments["EXPECT"]), re.I+re.M)
-        if not ((not expectMatch) and (arguments["EXPECT"]==0)):
+        expectMatch = re.match( '^\s*[+-]?0(e0)?\s*$', str( arguments[ "EXPECT" ] ), re.I + re.M )
+        if not ( ( not expectMatch ) and ( arguments[ "EXPECT" ] == 0 ) ):
             valuetype = 'NUM'
-        else :
-            if arguments["OPERATOR"] == 'greater' or arguments["OPERATOR"] == 'lesser':
-                main.log.error("Numeric comparison on strings is not possibele")
+        else:
+            if arguments[ "OPERATOR" ] == 'greater' or arguments[ "OPERATOR" ] == 'lesser':
+                main.log.error( "Numeric comparison on strings is not possibele" )
                 return main.ERROR
 
         valuetype = 'STR'
-        arguments["ACTUAL"] = str(arguments["ACTUAL"])
-        if arguments["OPERATOR"] != 'matches':
-            arguments["EXPECT"] = str(arguments["EXPECT"])
+        arguments[ "ACTUAL" ] = str( arguments[ "ACTUAL" ] )
+        if arguments[ "OPERATOR" ] != 'matches':
+            arguments[ "EXPECT" ] = str( arguments[ "EXPECT" ] )
 
-        try :
-            opcode = operators[str(arguments["OPERATOR"])][valuetype] if arguments["OPERATOR"] == 'equals' else operators[str(arguments["OPERATOR"])]
+        try:
+            opcode = operators[ str( arguments[ "OPERATOR" ] ) ][ valuetype ] if arguments[ "OPERATOR" ] == 'equals' else operators[ str( arguments[ "OPERATOR" ] ) ]
 
         except KeyError as e:
             print "Key Error in assertion"
@@ -130,111 +130,111 @@
 
         if opcode == '=~':
             try:
-                assert re.search(str(arguments["EXPECT"]),str(arguments["ACTUAL"]))
+                assert re.search( str( arguments[ "EXPECT" ] ), str( arguments[ "ACTUAL" ] ) )
                 result = main.TRUE
             except AssertionError:
-                try :
-                    assert re.match(str(arguments["EXPECT"]),str(arguments["ACTUAL"]))
+                try:
+                    assert re.match( str( arguments[ "EXPECT" ] ), str( arguments[ "ACTUAL" ] ) )
                     result = main.TRUE
                 except AssertionError:
-                    main.log.error("Assertion Failed")
+                    main.log.error( "Assertion Failed" )
                     result = main.FALSE
-        else :
+        else:
             try:
-                if str(opcode)=="==":
-                    main.log.info("Verifying the Expected is equal to the actual or not using assert_equal")
-                    if (arguments["EXPECT"] == arguments["ACTUAL"]):
+                if str( opcode ) == "==":
+                    main.log.info( "Verifying the Expected is equal to the actual or not using assert_equal" )
+                    if ( arguments[ "EXPECT" ] == arguments[ "ACTUAL" ] ):
                         result = main.TRUE
-                    else :
+                    else:
                         result = main.FALSE
-                elif str(opcode) == ">":
-                    main.log.info("Verifying the Expected is Greater than the actual or not using assert_greater")
-                    if (ast.literal_eval(arguments["EXPECT"]) > ast.literal_eval(arguments["ACTUAL"])) :
+                elif str( opcode ) == ">":
+                    main.log.info( "Verifying the Expected is Greater than the actual or not using assert_greater" )
+                    if ( ast.literal_eval( arguments[ "EXPECT" ] ) > ast.literal_eval( arguments[ "ACTUAL" ] ) ):
                         result = main.TRUE
-                    else :
+                    else:
                         result = main.FALSE
-                elif str(opcode) == "<":
-                    main.log.info("Verifying the Expected is Lesser than the actual or not using assert_lesser")
-                    if (ast.literal_eval(arguments["EXPECT"]) < ast.literal_eval(arguments["ACTUAL"])):
+                elif str( opcode ) == "<":
+                    main.log.info( "Verifying the Expected is Lesser than the actual or not using assert_lesser" )
+                    if ( ast.literal_eval( arguments[ "EXPECT" ] ) < ast.literal_eval( arguments[ "ACTUAL" ] ) ):
                         result = main.TRUE
-                    else :
+                    else:
                         result = main.FALSE
             except AssertionError:
-                main.log.error("Assertion Failed")
+                main.log.error( "Assertion Failed" )
                 result = main.FALSE
         result = result if result else 0
-        result = not result if arguments["NOT"] and arguments["NOT"] == 1 else result
+        result = not result if arguments[ "NOT" ] and arguments[ "NOT" ] == 1 else result
         resultString = ""
-        if result :
-            resultString = str(resultString) + "PASS"
-            main.log.info(arguments["ONPASS"])
-        else :
-            resultString = str(resultString) + "FAIL"
-            if not isinstance(arguments["ONFAIL"],str):
-                eval(str(arguments["ONFAIL"]))
-            else :
-                main.log.error(arguments["ONFAIL"])
-                main.log.report(arguments["ONFAIL"])
+        if result:
+            resultString = str( resultString ) + "PASS"
+            main.log.info( arguments[ "ONPASS" ] )
+        else:
+            resultString = str( resultString ) + "FAIL"
+            if not isinstance( arguments[ "ONFAIL" ], str ):
+                eval( str( arguments[ "ONFAIL" ] ) )
+            else:
+                main.log.error( arguments[ "ONFAIL" ] )
+                main.log.report( arguments[ "ONFAIL" ] )
                 main.onFailMsg = arguments[ 'ONFAIL' ]
 
-        msg = arguments["ON" + str(resultString)]
+        msg = arguments[ "ON" + str( resultString ) ]
 
-        if not isinstance(msg,str):
+        if not isinstance( msg, str ):
             try:
-                eval(str(msg))
+                eval( str( msg ) )
             except SyntaxError as e:
                 print "function definition is not right"
                 print e
 
         main.last_result = result
-        if main.stepResults[2]:
-            main.stepResults[2][-1] = result
+        if main.stepResults[ 2 ]:
+            main.stepResults[ 2 ][ -1 ] = result
             try:
-                main.stepResults[3][-1] = arguments[ 'ONFAIL' ]
+                main.stepResults[ 3 ][ -1 ] = arguments[ 'ONFAIL' ]
             except AttributeError:
                 pass
         else:
             main.log.warn( "Assertion called before a test step" )
         return result
 
-    def parse_args(self,args, **kwargs):
-        '''
-        It will accept the (key,value) pair and will return the (key,value) pairs with keys in uppercase.
-        '''
+    def parse_args( self, args, **kwargs ):
+        """
+        It will accept the ( key,value ) pair and will return the ( key,value ) pairs with keys in uppercase.
+        """
         newArgs = {}
-        for key,value in kwargs.iteritems():
-            if isinstance(args,list) and str.upper(key) in args:
+        for key, value in kwargs.iteritems():
+            if isinstance( args, list ) and str.upper( key ) in args:
                 for each in args:
-                    if each==str.upper(key):
-                        newArgs [str(each)] = value
-                    elif each != str.upper(key) and (newArgs.has_key(str(each)) == False ):
-                        newArgs[str(each)] = None
+                    if each == str.upper( key ):
+                        newArgs[ str( each ) ] = value
+                    elif each != str.upper( key ) and not ( ( str( each ) in newArgs ) ):
+                        newArgs[ str( each ) ] = None
 
         return newArgs
 
-    def send_mail(self):
+    def send_mail( self ):
         # Create a text/plain message
         msg = email.mime.Multipart.MIMEMultipart()
-        try :
+        try:
             if main.test_target:
                 sub = "Result summary of \"" + main.TEST + "\" run on component \"" +\
                       main.test_target + "\" Version \"" +\
-                      vars( main )[main.test_target].get_version() + "\": " +\
+                      vars( main )[ main.test_target ].get_version() + "\": " +\
                       str( main.TOTAL_TC_SUCCESS ) + "% Passed"
-            else :
+            else:
                 sub = "Result summary of \"" + main.TEST + "\": " +\
                       str( main.TOTAL_TC_SUCCESS ) + "% Passed"
         except ( KeyError, AttributeError ):
             sub = "Result summary of \"" + main.TEST + "\": " +\
                   str( main.TOTAL_TC_SUCCESS ) + "% Passed"
 
-        msg['Subject'] = sub
-        msg['From'] = main.sender
-        msg['To'] = main.mail
+        msg[ 'Subject' ] = sub
+        msg[ 'From' ] = main.sender
+        msg[ 'To' ] = main.mail
 
         # The main body is just another attachment
         body = email.mime.Text.MIMEText( main.logHeader + "\n" +
-                                         main.testResult)
+                                         main.testResult )
         msg.attach( body )
 
         # Attachments
@@ -252,7 +252,7 @@
             smtp = smtplib.SMTP( main.smtp )
             smtp.starttls()
             smtp.login( main.sender, main.senderPwd )
-            smtp.sendmail( msg['From'], [msg['To']], msg.as_string() )
+            smtp.sendmail( msg[ 'From' ], [ msg[ 'To' ] ], msg.as_string() )
             smtp.quit()
         except Exception:
             main.log.exception( "Error sending email" )
@@ -265,32 +265,32 @@
             # Create a text/plain message
             msg = email.mime.Multipart.MIMEMultipart()
 
-            msg['Subject'] = subject
-            msg['From'] = main.sender
-            msg['To'] = main.mail
+            msg[ 'Subject' ] = subject
+            msg[ 'From' ] = main.sender
+            msg[ 'To' ] = main.mail
 
             smtp = smtplib.SMTP( main.smtp )
             smtp.starttls()
             smtp.login( main.sender, main.senderPwd )
-            smtp.sendmail( msg['From'], [msg['To']], msg.as_string() )
+            smtp.sendmail( msg[ 'From' ], [ msg[ 'To' ] ], msg.as_string() )
             smtp.quit()
         except Exception:
             main.log.exception( "" )
             return main.FALSE
         return main.TRUE
 
-    def parse(self,fileName):
-        '''
+    def parse( self, fileName ):
+        """
         This will parse the params or topo or cfg file and return content in the file as Dictionary
-        '''
+        """
         self.fileName = fileName
-        matchFileName = re.match(r'(.*)\.(cfg|params|topo)',self.fileName,re.M|re.I)
+        matchFileName = re.match( r'(.*)\.(cfg|params|topo)', self.fileName, re.M | re.I )
         if matchFileName:
-            try :
-                parsedInfo = ConfigObj(self.fileName)
+            try:
+                parsedInfo = ConfigObj( self.fileName )
                 return parsedInfo
-            except StandardError:
-                print "There is no such file to parse "+fileName
+            except Exception:
+                print "There is no such file to parse " + fileName
         else:
             return 0
 
@@ -303,7 +303,7 @@
 
         Arguments:
         f        - a callable object
-        retValue - Return value(s) of f to retry on. This can be a list or an
+        retValue - Return value( s ) of f to retry on. This can be a list or an
                    object.
         args     - A tuple containing the arguments of f.
         kwargs   - A dictionary containing the keyword arguments of f.
@@ -314,7 +314,7 @@
         random   - Boolean indicating if the wait time is random between 0
                    and sleep or exactly sleep seconds. Defaults to False.
         """
-        # TODO: be able to pass in a conditional statement(s). For example:
+        # TODO: be able to pass in a conditional statement( s ). For example:
         #      retCondition = "< 7"
         #      Then we do something like 'if eval( "ret " + retCondition ):break'
         try:
@@ -327,7 +327,7 @@
             for i in range( 0, attempts ):
                 ret = f( *args, **kwargs )
                 if ret not in retValue:
-                # NOTE that False in [ 0 ] == True
+                    # NOTE that False in [ 0 ] == True
                     break
                 if randomTime:
                     sleeptime = random.randint( 0, sleep )
@@ -350,4 +350,4 @@
 if __name__ != "__main__":
     import sys
 
-    sys.modules[__name__] = Utilities()
+    sys.modules[ __name__ ] = Utilities()
diff --git a/TestON/core/xmldict.py b/TestON/core/xmldict.py
index 808b365..a85c9ad 100644
--- a/TestON/core/xmldict.py
+++ b/TestON/core/xmldict.py
@@ -1,17 +1,17 @@
-'''
+"""
 Created on 03-Dec-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
 or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
 
-@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
+author:: Anil Kumar ( anilkumar.s@paxterrasolutions.com )
 
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,8 +21,7 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
-'''
-
+"""
 """
     xmldict
     ~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -31,141 +30,153 @@
 """
 import datetime
 
-def xml_to_dict(root_or_str, strict=True):
+
+def xml_to_dict( root_or_str, strict=True ):
     """
     Converts `root_or_str` which can be parsed xml or a xml string to dict.
 
     """
     root = root_or_str
-    if isinstance(root, str):
+    if isinstance( root, str ):
         import xml.etree.cElementTree as ElementTree
-        root = ElementTree.XML(root_or_str)
-    try :
-        return {root.tag: _from_xml(root, strict)}
-    except StandardError:
+        root = ElementTree.XML( root_or_str )
+    try:
+        return { root.tag: _from_xml( root, strict ) }
+    except Exception:
         return None
 
-def dict_to_xml(dict_xml):
+
+def dict_to_xml( dict_xml ):
     """
     Converts `dict_xml` which is a python dict to corresponding xml.
     """
-    return _to_xml(dict_xml)
+    return _to_xml( dict_xml )
 
-def _to_xml(el):
+
+def _to_xml( el ):
     """
     Converts `el` to its xml representation.
     """
     val = None
-    if isinstance(el, dict):
-        val = _dict_to_xml(el)
-    elif isinstance(el, bool):
-        val = str(el).lower()
+    if isinstance( el, dict ):
+        val = _dict_to_xml( el )
+    elif isinstance( el, bool ):
+        val = str( el ).lower()
     else:
         val = el
-    if val is None: val = 'null'
+    if val is None:
+        val = 'null'
     return val
 
-def _extract_attrs(els):
+
+def _extract_attrs( els ):
     """
     Extracts attributes from dictionary `els`. Attributes are keys which start
     with '@'
     """
-    if not isinstance(els, dict):
+    if not isinstance( els, dict ):
         return ''
-    return ''.join(' %s="%s"' % (key[1:], value) for key, value in els.iteritems()
-                   if key.startswith('@'))
+    return ''.join( ' %s="%s"' % ( key[ 1: ], value ) for key, value in els.iteritems()
+                    if key.startswith( '@' ) )
 
-def _dict_to_xml(els):
+
+def _dict_to_xml( els ):
     """
     Converts `els` which is a python dict to corresponding xml.
     """
-    def process_content(tag, content):
-        attrs = _extract_attrs(content)
-        text = isinstance(content, dict) and content.get('#text', '') or ''
-        return '<%s%s>%s%s</%s>' % (tag, attrs, _to_xml(content), text, tag)
+    def process_content( tag, content ):
+        attrs = _extract_attrs( content )
+        text = isinstance( content, dict ) and content.get( '#text', '' ) or ''
+        return '<%s%s>%s%s</%s>' % ( tag, attrs, _to_xml( content ), text, tag )
 
     tags = []
     for tag, content in els.iteritems():
         # Text and attributes
-        if tag.startswith('@') or tag == '#text':
+        if tag.startswith( '@' ) or tag == '#text':
             continue
-        elif isinstance(content, list):
+        elif isinstance( content, list ):
             for el in content:
-                tags.append(process_content(tag, el))
-        elif isinstance(content, dict):
-            tags.append(process_content(tag, content))
+                tags.append( process_content( tag, el ) )
+        elif isinstance( content, dict ):
+            tags.append( process_content( tag, content ) )
         else:
-            tags.append('<%s>%s</%s>' % (tag, _to_xml(content), tag))
-    return ''.join(tags)
+            tags.append( '<%s>%s</%s>' % ( tag, _to_xml( content ), tag ) )
+    return ''.join( tags )
 
-def _is_xml_el_dict(el):
+
+def _is_xml_el_dict( el ):
     """
     Returns true if `el` is supposed to be a dict.
     This function makes sense only in the context of making dicts out of xml.
     """
-    if len(el) == 1  or el[0].tag != el[1].tag:
+    if len( el ) == 1 or el[ 0 ].tag != el[ 1 ].tag:
         return True
     return False
 
-def _is_xml_el_list(el):
+
+def _is_xml_el_list( el ):
     """
     Returns true if `el` is supposed to be a list.
     This function makes sense only in the context of making lists out of xml.
     """
-    if len(el) > 1 and el[0].tag == el[1].tag:
+    if len( el ) > 1 and el[ 0 ].tag == el[ 1 ].tag:
         return True
     return False
 
-def _str_to_datetime(date_str):
+
+def _str_to_datetime( date_str ):
     try:
-        val = datetime.datetime.strptime(date_str,  "%Y-%m-%dT%H:%M:%SZ")
+        val = datetime.datetime.strptime( date_str, "%Y-%m-%dT%H:%M:%SZ" )
     except ValueError:
         val = date_str
     return val
 
-def _str_to_boolean(bool_str):
-    if bool_str.lower() != 'false' and bool(bool_str):
+
+def _str_to_boolean( bool_str ):
+    if bool_str.lower() != 'false' and bool( bool_str ):
         return True
     return False
 
-def _from_xml(el, strict):
+
+def _from_xml( el, strict ):
     """
     Extracts value of xml element element `el`.
     """
     val = None
     # Parent node.
     if el:
-        if _is_xml_el_dict(el):
-            val = _dict_from_xml(el, strict)
-        elif _is_xml_el_list(el):
-            val = _list_from_xml(el, strict)
+        if _is_xml_el_dict( el ):
+            val = _dict_from_xml( el, strict )
+        elif _is_xml_el_list( el ):
+            val = _list_from_xml( el, strict )
     # Simple node.
     else:
         attribs = el.items()
         # An element with attributes.
         if attribs and strict:
-            val = dict(('@%s' % k, v) for k, v in dict(attribs).iteritems())
+            val = dict( ( '@%s' % k, v ) for k, v in dict( attribs ).iteritems() )
             if el.text:
-                converted = _val_and_maybe_convert(el)
-                val['#text'] = el.text
+                converted = _val_and_maybe_convert( el )
+                val[ '#text' ] = el.text
                 if converted != el.text:
-                    val['#value'] = converted
+                    val[ '#value' ] = converted
         elif el.text:
             # An element with no subelements but text.
-            val = _val_and_maybe_convert(el)
+            val = _val_and_maybe_convert( el )
         elif attribs:
-            val = dict(attribs)
+            val = dict( attribs )
     return val
 
-def _val_and_maybe_convert(el):
+
+def _val_and_maybe_convert( el ):
     """
     Converts `el.text` if `el` has attribute `type` with valid value.
     """
     text = el.text.strip()
-    data_type = el.get('type')
-    convertor = _val_and_maybe_convert.convertors.get(data_type)
+    data_type = el.get( 'type' )
+    convertor = _val_and_maybe_convert.convertors.get( data_type )
     if convertor:
-        return convertor(text)
+        return convertor( text )
     else:
         return text
 _val_and_maybe_convert.convertors = {
@@ -174,23 +185,24 @@
     'integer': int
 }
 
-def _list_from_xml(els, strict):
+
+def _list_from_xml( els, strict ):
     """
     Converts xml elements list `el_list` to a python list.
     """
-
     temp = {}
     for el in els:
-        tag = el.attrib["name"]
-        temp[tag] = (_from_xml(el, strict))
+        tag = el.attrib[ "name" ]
+        temp[ tag ] = ( _from_xml( el, strict ) )
     return temp
 
-def _dict_from_xml(els, strict):
+
+def _dict_from_xml( els, strict ):
     """
     Converts xml doc with root `root` to a python dict.
     """
     # An element with subelements.
     res = {}
     for el in els:
-        res[el.tag] = _from_xml(el, strict)
+        res[ el.tag ] = _from_xml( el, strict )
     return res
diff --git a/TestON/core/xmlparser.py b/TestON/core/xmlparser.py
index a41ed92..181f646 100644
--- a/TestON/core/xmlparser.py
+++ b/TestON/core/xmlparser.py
@@ -1,18 +1,18 @@
-#/usr/bin/env python
-'''
+# /usr/bin/env python
+"""
 Created on 07-Jan-2013
-Copyright 2013 Open Networking Foundation (ONF)
+Copyright 2013 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
 or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
 
-@author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
+author:: Raghav Kashyap( raghavkashyap@paxterrasolutions.com )
 
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -23,50 +23,49 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
-'''
-
+"""
 import xmldict
 import re
 
-class xmlparser :
 
-    def __init__(self) :
+class xmlparser:
+
+    def __init__( self ):
         self.default = ''
 
-    def parse(self,fileName) :
-        '''
+    def parse( self, fileName ):
+        """
          This will parse the params or topo or cfg file and return content in the file as Dictionary
-        '''
+        """
         self.fileName = fileName
-        matchFileName = re.match(r'(.*)\.(params|topo|cfg)', self.fileName, re.M | re.I)
+        matchFileName = re.match( r'(.*)\.(params|topo|cfg)', self.fileName, re.M | re.I )
         if matchFileName:
-            xml = open(fileName).read()
-            try :
-                parsedInfo = xmldict.xml_to_dict(xml)
+            xml = open( fileName ).read()
+            try:
+                parsedInfo = xmldict.xml_to_dict( xml )
                 return parsedInfo
-            except StandardError as e:
+            except Exception as e:
                 print "Error parsing file " + fileName + ": " + e.message
-        else :
+        else:
             print "File name is not correct"
 
-    def parseParams(self,paramsPath):
-        '''
+    def parseParams( self, paramsPath ):
+        """
          It will take the params file path and will return the params dictionary
-        '''
-        paramsPath = re.sub("\.","/",paramsPath)
-        paramsPath = re.sub("tests|examples","",paramsPath)
-        params = self.parse(main.tests_path+paramsPath+".params")
-        paramsAsString = str(params)
-        return eval(paramsAsString)
+        """
+        paramsPath = re.sub( "\.", "/", paramsPath )
+        paramsPath = re.sub( "tests|examples", "", paramsPath )
+        params = self.parse( main.tests_path + paramsPath + ".params" )
+        paramsAsString = str( params )
+        return eval( paramsAsString )
 
-    def parseTopology(self,topologyPath):
-        '''
+    def parseTopology( self, topologyPath ):
+        """
           It will take topology file path and will return topology dictionary
-        '''
-        topologyPath = re.sub("\.","/",topologyPath)
-        topologyPath = re.sub("tests|examples","",topologyPath)
-        #topology = self.parse(main.tests_path+"/"+topologyPath+".topo")
-        topology = self.parse(main.tests_path+topologyPath+".topo")
-        topoAsString = str(topology)
-        return eval(topoAsString)
-
+        """
+        topologyPath = re.sub( "\.", "/", topologyPath )
+        topologyPath = re.sub( "tests|examples", "", topologyPath )
+        # topology = self.parse( main.tests_path+"/"+topologyPath+".topo" )
+        topology = self.parse( main.tests_path + topologyPath + ".topo" )
+        topoAsString = str( topology )
+        return eval( topoAsString )
diff --git a/TestON/drivers/common/api/controller/onosrestdriver.py b/TestON/drivers/common/api/controller/onosrestdriver.py
old mode 100755
new mode 100644
index 312f1f1..b5d2062
--- a/TestON/drivers/common/api/controller/onosrestdriver.py
+++ b/TestON/drivers/common/api/controller/onosrestdriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 07-08-2015
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -48,7 +48,7 @@
         except Exception as e:
             main.log.exception( e )
         try:
-            if os.getenv( str( self.ip_address ) ) != None:
+            if os.getenv( str( self.ip_address ) ) is not None:
                 self.ip_address = os.getenv( str( self.ip_address ) )
             else:
                 main.log.info( self.name + ": ip set to " + self.ip_address )
@@ -74,12 +74,12 @@
             if isinstance( jsonObject, str ):
                 jsonObject = json.loads( jsonObject )
             return json.dumps( jsonObject, sort_keys=True,
-                               indent=4, separators=(',', ': '))
+                               indent=4, separators=( ',', ': ' ) )
         except ( TypeError, ValueError ):
             main.log.exception( "Error parsing jsonObject" )
             return None
 
-    def send( self, url, ip = "DEFAULT", port = "DEFAULT", base="/onos/v1", method="GET",
+    def send( self, url, ip="DEFAULT", port="DEFAULT", base="/onos/v1", method="GET",
               query=None, data=None, debug=False ):
         """
         Arguments:
@@ -94,25 +94,25 @@
                          the request
             dict data: Dictionary to be sent in the body of the request
         """
-        # TODO: Authentication - simple http (user,pass) tuple
+        # TODO: Authentication - simple http ( user,pass ) tuple
         # TODO: should we maybe just pass kwargs straight to response?
         # TODO: Do we need to allow for other protocols besides http?
         # ANSWER: Not yet, but potentially https with certificates
         if ip == "DEFAULT":
-                main.log.warn( "No ip given, reverting to ip from topo file" )
-                ip = self.ip_address
+            main.log.warn( "No ip given, reverting to ip from topo file" )
+            ip = self.ip_address
         if port == "DEFAULT":
-                main.log.warn( "No port given, reverting to port " +
-                               "from topo file" )
-                port = self.port
+            main.log.warn( "No port given, reverting to port " +
+                           "from topo file" )
+            port = self.port
 
         try:
             path = "http://" + str( ip ) + ":" + str( port ) + base + url
             if self.user_name and self.pwd:
-                main.log.info("user/passwd is: " + self.user_name + "/" + self.pwd)
-                auth = (self.user_name, self.pwd)
+                main.log.info( "user/passwd is: " + self.user_name + "/" + self.pwd )
+                auth = ( self.user_name, self.pwd )
             else:
-                auth=None
+                auth = None
             main.log.info( "Sending request " + path + " using " +
                            method.upper() + " method." )
             response = requests.request( method.upper(),
@@ -148,7 +148,7 @@
                 main.log.warn( "No port given, reverting to port " +
                                "from topo file" )
                 port = self.port
-            response = self.send( url="/intents", ip = ip, port = port )
+            response = self.send( url="/intents", ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     output = response[ 1 ]
@@ -195,7 +195,7 @@
                 port = self.port
             # NOTE: REST url requires the intent id to be in decimal form
             query = "/" + str( appId ) + "/" + str( intentId )
-            response = self.send( url="/intents" + query, ip = ip, port = port )
+            response = self.send( url="/intents" + query, ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     output = response[ 1 ]
@@ -229,7 +229,7 @@
                 main.log.warn( "No port given, reverting to port " +
                                "from topo file" )
                 port = self.port
-            response = self.send( url="/applications", ip = ip, port = port )
+            response = self.send( url="/applications", ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     output = response[ 1 ]
@@ -273,7 +273,7 @@
             query = "/" + str( appName ) + "/active"
             response = self.send( method="POST",
                                   url="/applications" + query,
-                                  ip = ip, port = port)
+                                  ip=ip, port=port )
             if response:
                 output = response[ 1 ]
                 app = json.loads( output )
@@ -329,7 +329,7 @@
             query = "/" + str( appName ) + "/active"
             self.send( method="DELETE",
                        url="/applications" + query,
-                       ip = ip, port = port )
+                       ip=ip, port=port )
             response = self.getApp( appName, ip, port )
             if response:
                 output = response[ 1 ]
@@ -383,7 +383,7 @@
                 port = self.port
             query = "/" + str( appName )
             response = self.send( url="/applications" + query,
-                                  ip = ip, port = port )
+                                  ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     return response
@@ -414,17 +414,17 @@
             error on requests; Returns None for exceptions
         """
         try:
-            intentJson = {"two": str( hostIdTwo ),
-                          "selector": {"criteria": []}, "priority": 7,
-                          "treatment": {"deferred": [], "instructions": []},
-                          "appId": appId, "one": str( hostIdOne ),
-                          "type": "HostToHostIntent",
-                          "constraints": [{"type": "LinkTypeConstraint",
-                                           "types": ["OPTICAL"],
-                                           "inclusive": 'false' }]}
+            intentJson = { "two": str( hostIdTwo ),
+                           "selector": { "criteria": [] }, "priority": 7,
+                           "treatment": { "deferred": [], "instructions": [] },
+                           "appId": appId, "one": str( hostIdOne ),
+                           "type": "HostToHostIntent",
+                           "constraints": [ { "type": "LinkTypeConstraint",
+                                              "types": [ "OPTICAL" ],
+                                              "inclusive": 'false' } ] }
             if vlanId:
-                intentJson[ 'selector' ][ 'criteria' ].append( { "type":"VLAN_VID",
-                                                                 "vlanId":vlanId } )
+                intentJson[ 'selector' ][ 'criteria' ].append( { "type": "VLAN_VID",
+                                                                 "vlanId": vlanId } )
             output = None
             if ip == "DEFAULT":
                 main.log.warn( "No ip given, reverting to ip from topo file" )
@@ -434,7 +434,7 @@
                                "from topo file" )
                 port = self.port
             response = self.send( method="POST",
-                                  url="/intents", ip = ip, port = port,
+                                  url="/intents", ip=ip, port=port,
                                   data=json.dumps( intentJson ) )
             if response:
                 if "201" in str( response[ 0 ] ):
@@ -485,9 +485,9 @@
             * ethType: specify ethType
             * ethSrc: specify ethSrc ( i.e. src mac addr )
             * ethDst: specify ethDst ( i.e. dst mac addr )
-            * bandwidth: specify bandwidth capacity of link (TODO)
+            * bandwidth: specify bandwidth capacity of link ( TODO )
             * lambdaAlloc: if True, intent will allocate lambda
-              for the specified intent (TODO)
+              for the specified intent ( TODO )
             * ipProto: specify ip protocol
             * ipSrc: specify ip source address with mask eg. ip#/24
             * ipDst: specify ip destination address eg. ip#/24
@@ -520,63 +520,63 @@
                     main.log.debug( self.name + ": Egress port not specified" )
                     return main.FALSE
 
-            intentJson ={ "ingressPoint": { "device": ingressDevice,
-                                           "port": ingressPort },
-                          "selector": { "criteria": [] },
-                          "priority": 55,
-                          "treatment": { "deferred": [],
-                                         "instructions": [] },
-                          "egressPoint": { "device": egressDevice,
-                                           "port": egressPort },
-                          "appId": appId,
-                          "type": "PointToPointIntent",
-                          "constraints": [ { "type": "LinkTypeConstraint",
-                                             "types": [ "OPTICAL" ],
-                                             "inclusive": "false" } ] }
+            intentJson = { "ingressPoint": { "device": ingressDevice,
+                                             "port": ingressPort },
+                           "selector": { "criteria": [] },
+                           "priority": 55,
+                           "treatment": { "deferred": [],
+                                          "instructions": [] },
+                           "egressPoint": { "device": egressDevice,
+                                            "port": egressPort },
+                           "appId": appId,
+                           "type": "PointToPointIntent",
+                           "constraints": [ { "type": "LinkTypeConstraint",
+                                              "types": [ "OPTICAL" ],
+                                              "inclusive": "false" } ] }
 
             # if protected:
-            #     intentJson['constraints'].append( { "type": "Protection", "types": ["Protection"], "inclusive": "true" } )
+            #     intentJson[ 'constraints' ].append( { "type": "Protection", "types": [ "Protection" ], "inclusive": "true" } )
 
             if ethType == "IPV4":
                 intentJson[ 'selector' ][ 'criteria' ].append( {
-                                                         "type":"ETH_TYPE",
-                                                         "ethType":2048 } )
+                                                         "type": "ETH_TYPE",
+                                                         "ethType": 2048 } )
             elif ethType:
                 intentJson[ 'selector' ][ 'criteria' ].append( {
-                                                         "type":"ETH_TYPE",
-                                                         "ethType":ethType } )
+                                                         "type": "ETH_TYPE",
+                                                         "ethType": ethType } )
 
             if ethSrc:
                 intentJson[ 'selector' ][ 'criteria' ].append(
-                                                       { "type":"ETH_SRC",
-                                                         "mac":ethSrc } )
+                                                       { "type": "ETH_SRC",
+                                                         "mac": ethSrc } )
             if ethDst:
                 intentJson[ 'selector' ][ 'criteria' ].append(
-                                                       { "type":"ETH_DST",
-                                                         "mac":ethDst } )
+                                                       { "type": "ETH_DST",
+                                                         "mac": ethDst } )
             if ipSrc:
                 intentJson[ 'selector' ][ 'criteria' ].append(
-                                                       { "type":"IPV4_SRC",
-                                                         "ip":ipSrc } )
+                                                       { "type": "IPV4_SRC",
+                                                         "ip": ipSrc } )
             if ipDst:
                 intentJson[ 'selector' ][ 'criteria' ].append(
-                                                       { "type":"IPV4_DST",
-                                                         "ip":ipDst } )
+                                                       { "type": "IPV4_DST",
+                                                         "ip": ipDst } )
             if tcpSrc:
                 intentJson[ 'selector' ][ 'criteria' ].append(
-                                                       { "type":"TCP_SRC",
+                                                       { "type": "TCP_SRC",
                                                          "tcpPort": tcpSrc } )
             if tcpDst:
                 intentJson[ 'selector' ][ 'criteria' ].append(
-                                                       { "type":"TCP_DST",
+                                                       { "type": "TCP_DST",
                                                          "tcpPort": tcpDst } )
             if ipProto:
                 intentJson[ 'selector' ][ 'criteria' ].append(
-                                                       { "type":"IP_PROTO",
+                                                       { "type": "IP_PROTO",
                                                          "protocol": ipProto } )
             if vlanId:
                 intentJson[ 'selector' ][ 'criteria' ].append(
-                                                       { "type":"VLAN_VID",
+                                                       { "type": "VLAN_VID",
                                                          "vlanId": vlanId } )
 
             # TODO: Bandwidth and Lambda will be implemented if needed
@@ -590,7 +590,7 @@
                                "from topo file" )
                 port = self.port
             response = self.send( method="POST",
-                                  url="/intents", ip = ip, port = port,
+                                  url="/intents", ip=ip, port=port,
                                   data=json.dumps( intentJson ) )
 
             main.log.debug( intentJson )
@@ -613,26 +613,26 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def addSinglepointToMultipointIntent(self,
-                       ingressDevice,
-                       egressDeviceList,
-                       portEgressList,
-                       appId='org.onosproject.cli',
-                       portIngress="",
-                       ethType="",
-                       ethSrc="",
-                       ethDst="",
-                       bandwidth="",
-                       lambdaAlloc=False,
-                       ipProto="",
-                       ipSrc="",
-                       ipDst="",
-                       tcpSrc="",
-                       tcpDst="",
-                       partial=False,
-                       ip="DEFAULT",
-                       port="DEFAULT",
-                       vlanId="" ):
+    def addSinglepointToMultipointIntent( self,
+                                          ingressDevice,
+                                          egressDeviceList,
+                                          portEgressList,
+                                          appId='org.onosproject.cli',
+                                          portIngress="",
+                                          ethType="",
+                                          ethSrc="",
+                                          ethDst="",
+                                          bandwidth="",
+                                          lambdaAlloc=False,
+                                          ipProto="",
+                                          ipSrc="",
+                                          ipDst="",
+                                          tcpSrc="",
+                                          tcpDst="",
+                                          partial=False,
+                                          ip="DEFAULT",
+                                          port="DEFAULT",
+                                          vlanId="" ):
         """
         Description:
             Adds a point-to-multi point intent ( uni-directional ) by
@@ -647,9 +647,9 @@
             * ethType: specify ethType
             * ethSrc: specify ethSrc ( i.e. src mac addr )
             * ethDst: specify ethDst ( i.e. dst mac addr )
-            * bandwidth: specify bandwidth capacity of link (TODO)
+            * bandwidth: specify bandwidth capacity of link ( TODO )
             * lambdaAlloc: if True, intent will allocate lambda
-              for the specified intent (TODO)
+              for the specified intent ( TODO )
             * ipProto: specify ip protocol
             * ipSrc: specify ip source address with mask eg. ip#/24
             * ipDst: specify ip destination address eg. ip#/24
@@ -694,7 +694,7 @@
                            "appId": appId,
                            "type": "SinglePointToMultiPointIntent",
                            "constraints": [ { "type": "LinkTypeConstraint",
-                                              "types": ["OPTICAL"],
+                                              "types": [ "OPTICAL" ],
                                               "inclusive": "false" } ] }
 
             index = 0
@@ -752,16 +752,16 @@
                                "from topo file" )
                 port = self.port
             response = self.send( method="POST",
-                                 url="/intents", ip=ip, port=port,
-                                 data=json.dumps( intentJson ) )
+                                  url="/intents", ip=ip, port=port,
+                                  data=json.dumps( intentJson ) )
 
-            main.log.debug(intentJson)
+            main.log.debug( intentJson )
 
             if response:
                 if "201" in str( response[ 0 ] ):
                     main.log.info( self.name + ": Successfully POST point" +
                                    " intent between ingress: " + ingressDevice +
-                                   " and egress: " + str(egressDeviceList) + " devices" )
+                                   " and egress: " + str( egressDeviceList ) + " devices" )
                     return main.TRUE
                 else:
                     main.log.error( "Error with REST request, response was: " + str( response ) )
@@ -795,7 +795,7 @@
             # NOTE: REST url requires the intent id to be in decimal form
             query = "/" + str( appId ) + "/" + str( int( intentId, 16 ) )
             response = self.send( method="DELETE",
-                                  url="/intents" + query, ip = ip, port = port )
+                                  url="/intents" + query, ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     return main.TRUE
@@ -834,7 +834,7 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def removeAllIntents( self, intentIdList ='ALL',appId='org.onosproject.cli',
+    def removeAllIntents( self, intentIdList='ALL', appId='org.onosproject.cli',
                           ip="DEFAULT", port="DEFAULT", delay=5 ):
         """
         Description:
@@ -864,7 +864,7 @@
                 import time
                 time.sleep( delay )
                 intentRemain = len( json.loads( self.intents() ) )
-                if all( result==main.TRUE for result in results ) and \
+                if all( result == main.TRUE for result in results ) and \
                    intentRemain == 0:
                     main.log.info( self.name + ": All intents are removed " )
                     return main.TRUE
@@ -900,7 +900,7 @@
                 main.log.warn( "No port given, reverting to port " +
                                "from topo file" )
                 port = self.port
-            response = self.send( url="/hosts", ip = ip, port = port )
+            response = self.send( url="/hosts", ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     output = response[ 1 ]
@@ -945,12 +945,12 @@
                                "from topo file" )
                 port = self.port
             query = "/" + mac + "/" + vlan
-            response = self.send( url="/hosts" + query, ip = ip, port = port )
+            response = self.send( url="/hosts" + query, ip=ip, port=port )
             if response:
-            # NOTE: What if the person wants other values? would it be better
-            # to have a function that gets a key and return a value instead?
-            # This function requires mac and vlan and returns an ID which
-            # makes this current function useless
+                # NOTE: What if the person wants other values? would it be better
+                # to have a function that gets a key and return a value instead?
+                # This function requires mac and vlan and returns an ID which
+                # makes this current function useless
                 if 200 <= response[ 0 ] <= 299:
                     output = response[ 1 ]
                     hostId = json.loads( output ).get( 'id' )
@@ -983,7 +983,7 @@
                 main.log.warn( "No port given, reverting to port " +
                                "from topo file" )
                 port = self.port
-            response = self.send( url="/topology", ip = ip, port = port )
+            response = self.send( url="/topology", ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     output = response[ 1 ]
@@ -1019,7 +1019,7 @@
                 main.log.warn( "No port given, reverting to port " +
                                "from topo file" )
                 port = self.port
-            response = self.send( url="/devices", ip = ip, port = port )
+            response = self.send( url="/devices", ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     output = response[ 1 ]
@@ -1043,11 +1043,11 @@
         """
         Description:
             Get intent state.
-            Accepts a single intent ID (string type) or a list of intent IDs.
-            Returns the state(string type) of the id if a single intent ID is
+            Accepts a single intent ID ( string type ) or a list of intent IDs.
+            Returns the state( string type ) of the id if a single intent ID is
             accepted.
         Required:
-            intentId: intent ID (string type)
+            intentId: intent ID ( string type )
             intentsJson: parsed json object from the onos:intents api
         Returns:
             Returns a dictionary with intent IDs as the key and its
@@ -1095,7 +1095,7 @@
             main.cleanAndExit()
 
     def checkIntentState( self, intentsId="ALL", expectedState='INSTALLED',
-                          ip="DEFAULT", port="DEFAULT"):
+                          ip="DEFAULT", port="DEFAULT" ):
         """
         Description:
             Check intents state based on expected state which defaults to
@@ -1103,7 +1103,7 @@
         Required:
             intentsId - List of intents ID to be checked
         Optional:
-            expectedState - Check the expected state(s) of each intents
+            expectedState - Check the expected state( s ) of each intents
                             state in the list.
                             *NOTE: You can pass in a list of expected state,
                             Eg: expectedState = [ 'INSTALLED' , 'INSTALLING' ]
@@ -1227,7 +1227,7 @@
             if flowId:
                 url += "/" + str( int( flowId ) )
             print url
-            response = self.send( url=url, ip = ip, port = port )
+            response = self.send( url=url, ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     output = response[ 1 ]
@@ -1262,9 +1262,9 @@
             The ip and port option are for the requests input's ip and port
             of the ONOS node
         """
-
         try:
-            if debug: main.log.debug( "Adding flow: " + self.pprint( flowJson ) )
+            if debug:
+                main.log.debug( "Adding flow: " + self.pprint( flowJson ) )
             output = None
             if ip == "DEFAULT":
                 main.log.warn( "No ip given, reverting to ip from topo file" )
@@ -1275,7 +1275,7 @@
                 port = self.port
             url = "/flows/" + deviceId
             response = self.send( method="POST",
-                                  url=url, ip = ip, port = port,
+                                  url=url, ip=ip, port=port,
                                   data=json.dumps( flowJson ) )
             if response:
                 if "201" in str( response[ 0 ] ):
@@ -1330,9 +1330,9 @@
             * ethDst: specify ethDst ( i.e. dst mac addr )
             * ipProto: specify ip protocol
             * ipSrc: specify ip source address with mask eg. ip#/24
-                as a tuple (type, ip#)
+                as a tuple ( type, ip# )
             * ipDst: specify ip destination address eg. ip#/24
-                as a tuple (type, ip#)
+                as a tuple ( type, ip# )
             * tcpSrc: specify tcp source port
             * tcpDst: specify tcp destination port
         Returns:
@@ -1344,75 +1344,75 @@
             of the ONOS node
         """
         try:
-            flowJson = {   "priority":priority,
-                           "isPermanent":"true",
-                           "timeout":0,
-                           "deviceId":deviceId,
-                           "treatment":{"instructions":[]},
-                           "selector": {"criteria":[]}}
+            flowJson = { "priority": priority,
+                           "isPermanent": "true",
+                           "timeout": 0,
+                           "deviceId": deviceId,
+                           "treatment": { "instructions": [] },
+                           "selector": { "criteria": [] } }
             if appId:
                 flowJson[ "appId" ] = appId
 
             if groupId:
                 flowJson[ 'treatment' ][ 'instructions' ].append( {
-                                                        "type":"GROUP",
-                                                        "groupId":groupId } )
+                                                        "type": "GROUP",
+                                                        "groupId": groupId } )
 
             if egressPort:
                 flowJson[ 'treatment' ][ 'instructions' ].append( {
-                                                        "type":"OUTPUT",
-                                                        "port":egressPort } )
+                                                        "type": "OUTPUT",
+                                                        "port": egressPort } )
             if ingressPort:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"IN_PORT",
-                                                        "port":ingressPort } )
+                                                        "type": "IN_PORT",
+                                                        "port": ingressPort } )
             if ethType:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"ETH_TYPE",
-                                                        "ethType":ethType } )
+                                                        "type": "ETH_TYPE",
+                                                        "ethType": ethType } )
             if ethSrc:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"ETH_SRC",
-                                                        "mac":ethSrc } )
+                                                        "type": "ETH_SRC",
+                                                        "mac": ethSrc } )
             if ethDst:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"ETH_DST",
-                                                        "mac":ethDst } )
+                                                        "type": "ETH_DST",
+                                                        "mac": ethDst } )
             if vlan:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"VLAN_VID",
-                                                        "vlanId":vlan } )
+                                                        "type": "VLAN_VID",
+                                                        "vlanId": vlan } )
             if mpls:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"MPLS_LABEL",
-                                                        "label":mpls } )
+                                                        "type": "MPLS_LABEL",
+                                                        "label": mpls } )
             if ipSrc:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":ipSrc[0],
-                                                        "ip":ipSrc[1] } )
+                                                        "type": ipSrc[ 0 ],
+                                                        "ip": ipSrc[ 1 ] } )
             if ipDst:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":ipDst[0],
-                                                        "ip":ipDst[1] } )
+                                                        "type": ipDst[ 0 ],
+                                                        "ip": ipDst[ 1 ] } )
             if tcpSrc:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"TCP_SRC",
+                                                        "type": "TCP_SRC",
                                                         "tcpPort": tcpSrc } )
             if tcpDst:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"TCP_DST",
+                                                        "type": "TCP_DST",
                                                         "tcpPort": tcpDst } )
             if udpSrc:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"UDP_SRC",
+                                                        "type": "UDP_SRC",
                                                         "udpPort": udpSrc } )
             if udpDst:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"UDP_DST",
+                                                        "type": "UDP_DST",
                                                         "udpPort": udpDst } )
             if ipProto:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"IP_PROTO",
+                                                        "type": "IP_PROTO",
                                                         "protocol": ipProto } )
 
             return self.sendFlow( deviceId=deviceId, flowJson=flowJson, debug=debug )
@@ -1448,7 +1448,7 @@
             # NOTE: REST url requires the intent id to be in decimal form
             query = "/" + str( deviceId ) + "/" + str( int( flowId ) )
             response = self.send( method="DELETE",
-                                  url="/flows" + query, ip = ip, port = port )
+                                  url="/flows" + query, ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     return main.TRUE
@@ -1463,7 +1463,7 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def checkFlowsState( self , ip="DEFAULT", port="DEFAULT" ):
+    def checkFlowsState( self, ip="DEFAULT", port="DEFAULT" ):
         """
         Description:
             Check if all the current flows are in ADDED state
@@ -1516,7 +1516,7 @@
                     url += "/" + subjectKey
                     if configKey:
                         url += "/" + configKey
-            response = self.send( url=url, ip = ip, port = port )
+            response = self.send( url=url, ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     output = response[ 1 ]
@@ -1566,7 +1566,7 @@
                     if configKey:
                         url += "/" + configKey
             response = self.send( method="POST",
-                                  url=url, ip = ip, port = port,
+                                  url=url, ip=ip, port=port,
                                   data=json.dumps( cfgJson ) )
             if response:
                 if 200 <= response[ 0 ] <= 299:
@@ -1611,7 +1611,7 @@
                     if configKey:
                         url += "/" + configKey
             response = self.send( method="DELETE",
-                                  url=url, ip = ip, port = port )
+                                  url=url, ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     main.log.info( self.name + ": Successfully delete cfg" )
@@ -1628,30 +1628,30 @@
             main.cleanAndExit()
 
     def createFlowBatch( self,
-                      numSw = 1,
-                      swIndex = 1,
-                      batchSize = 1,
-                      batchIndex = 1,
-                      deviceIdpreFix = "of:",
-                      appId=0,
-                      deviceID="",
-                      ingressPort="",
-                      egressPort="",
-                      ethType="",
-                      ethSrc="",
-                      ethDst="",
-                      vlan="",
-                      ipProto="",
-                      ipSrc=(),
-                      ipDst=(),
-                      tcpSrc="",
-                      tcpDst="",
-                      udpDst="",
-                      udpSrc="",
-                      mpls="",
-                      ip="DEFAULT",
-                      port="DEFAULT",
-                      debug=False ):
+                         numSw=1,
+                         swIndex=1,
+                         batchSize=1,
+                         batchIndex=1,
+                         deviceIdpreFix="of:",
+                         appId=0,
+                         deviceID="",
+                         ingressPort="",
+                         egressPort="",
+                         ethType="",
+                         ethSrc="",
+                         ethDst="",
+                         vlan="",
+                         ipProto="",
+                         ipSrc=(),
+                         ipDst=(),
+                         tcpSrc="",
+                         tcpDst="",
+                         udpDst="",
+                         udpSrc="",
+                         mpls="",
+                         ip="DEFAULT",
+                         port="DEFAULT",
+                         debug=False ):
         """
         Description:
             Creates batches of MAC-rule flows for POST.
@@ -1668,9 +1668,9 @@
             * ethDst: specify ethDst ( i.e. dst mac addr )
             * ipProto: specify ip protocol
             * ipSrc: specify ip source address with mask eg. ip#/24
-                as a tuple (type, ip#)
+                as a tuple ( type, ip# )
             * ipDst: specify ip destination address eg. ip#/24
-                as a tuple (type, ip#)
+                as a tuple ( type, ip# )
             * tcpSrc: specify tcp source port
             * tcpDst: specify tcp destination port
         Returns:
@@ -1681,111 +1681,110 @@
             The ip and port option are for the requests input's ip and port
             of the ONOS node
         """
-        #from pprint import pprint
+        # from pprint import pprint
 
         flowJsonList = []
-        flowJsonBatch = {"flows":flowJsonList}
+        flowJsonBatch = { "flows": flowJsonList }
         dev = swIndex
 
-        for fl in range(1, batchSize + 1):
-            flowJson = { "priority":100,
-                           "deviceId":"",
-                           "isPermanent":"true",
-                           "timeout":0,
-                           "treatment":{"instructions":[]},
-                           "selector": {"criteria":[]}}
+        for fl in range( 1, batchSize + 1 ):
+            flowJson = { "priority": 100,
+                           "deviceId": "",
+                           "isPermanent": "true",
+                           "timeout": 0,
+                           "treatment": { "instructions": [] },
+                           "selector": { "criteria": [] } }
 
-            #main.log.info("fl: " + str(fl))
+            # main.log.info( "fl: " + str( fl ) )
             if dev <= numSw:
-                deviceId = deviceIdpreFix + "{0:0{1}x}".format(dev,16)
-                #print deviceId
-                flowJson['deviceId'] = deviceId
+                deviceId = deviceIdpreFix + "{0:0{1}x}".format( dev, 16 )
+                # print deviceId
+                flowJson[ 'deviceId' ] = deviceId
                 dev += 1
             else:
                 dev = 1
-                deviceId = deviceIdpreFix + "{0:0{1}x}".format(dev,16)
-                #print deviceId
-                flowJson['deviceId'] = deviceId
+                deviceId = deviceIdpreFix + "{0:0{1}x}".format( dev, 16 )
+                # print deviceId
+                flowJson[ 'deviceId' ] = deviceId
                 dev += 1
 
                 # ethSrc starts with "0"; ethDst starts with "1"
                 # 2 Hex digit of device number; 5 digits of batch index number; 5 digits of batch size
-            ethS = "%02X" %int( "0" + "{0:0{1}b}".format(dev,7), 2 ) + \
-                   "{0:0{1}x}".format(batchIndex,5) + "{0:0{1}x}".format(fl,5)
-            ethSrc = ':'.join(ethS[i:i+2] for i in range(0,len(ethS),2))
-            ethD = "%02X" %int( "1" + "{0:0{1}b}".format(dev,7), 2 ) + \
-                   "{0:0{1}x}".format(batchIndex,5) + "{0:0{1}x}".format(fl,5)
-            ethDst = ':'.join(ethD[i:i+2] for i in range(0,len(ethD),2))
+            ethS = "%02X" % int( "0" + "{0:0{1}b}".format( dev, 7 ), 2 ) + \
+                   "{0:0{1}x}".format( batchIndex, 5 ) + "{0:0{1}x}".format( fl, 5 )
+            ethSrc = ':'.join( ethS[ i:i + 2 ] for i in range( 0, len( ethS ), 2 ) )
+            ethD = "%02X" % int( "1" + "{0:0{1}b}".format( dev, 7 ), 2 ) + \
+                   "{0:0{1}x}".format( batchIndex, 5 ) + "{0:0{1}x}".format( fl, 5 )
+            ethDst = ':'.join( ethD[ i:i + 2 ] for i in range( 0, len( ethD ), 2 ) )
 
             if appId:
                 flowJson[ "appId" ] = appId
 
             if egressPort:
                 flowJson[ 'treatment' ][ 'instructions' ].append( {
-                                                        "type":"OUTPUT",
-                                                        "port":egressPort } )
+                                                        "type": "OUTPUT",
+                                                        "port": egressPort } )
             if ingressPort:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"IN_PORT",
-                                                        "port":ingressPort } )
+                                                        "type": "IN_PORT",
+                                                        "port": ingressPort } )
             if ethType:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"ETH_TYPE",
-                                                        "ethType":ethType } )
+                                                        "type": "ETH_TYPE",
+                                                        "ethType": ethType } )
             if ethSrc:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"ETH_SRC",
-                                                        "mac":ethSrc } )
+                                                        "type": "ETH_SRC",
+                                                        "mac": ethSrc } )
             if ethDst:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"ETH_DST",
-                                                        "mac":ethDst } )
+                                                        "type": "ETH_DST",
+                                                        "mac": ethDst } )
             if vlan:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"VLAN_VID",
-                                                        "vlanId":vlan } )
+                                                        "type": "VLAN_VID",
+                                                        "vlanId": vlan } )
             if mpls:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"MPLS_LABEL",
-                                                        "label":mpls } )
+                                                        "type": "MPLS_LABEL",
+                                                        "label": mpls } )
             if ipSrc:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":ipSrc[0],
-                                                        "ip":ipSrc[1] } )
+                                                        "type": ipSrc[ 0 ],
+                                                        "ip": ipSrc[ 1 ] } )
             if ipDst:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":ipDst[0],
-                                                        "ip":ipDst[1] } )
+                                                        "type": ipDst[ 0 ],
+                                                        "ip": ipDst[ 1 ] } )
             if tcpSrc:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"TCP_SRC",
+                                                        "type": "TCP_SRC",
                                                         "tcpPort": tcpSrc } )
             if tcpDst:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"TCP_DST",
+                                                        "type": "TCP_DST",
                                                         "tcpPort": tcpDst } )
             if udpSrc:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"UDP_SRC",
+                                                        "type": "UDP_SRC",
                                                         "udpPort": udpSrc } )
             if udpDst:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"UDP_DST",
+                                                        "type": "UDP_DST",
                                                         "udpPort": udpDst } )
             if ipProto:
                 flowJson[ 'selector' ][ 'criteria' ].append( {
-                                                        "type":"IP_PROTO",
+                                                        "type": "IP_PROTO",
                                                         "protocol": ipProto } )
-            #pprint(flowJson)
-            flowJsonList.append(flowJson)
+            # pprint( flowJson )
+            flowJsonList.append( flowJson )
 
-        main.log.info("Number of flows in batch: " + str( len(flowJsonList) ) )
-        flowJsonBatch['flows'] = flowJsonList
-        #pprint(flowJsonBatch)
+        main.log.info( "Number of flows in batch: " + str( len( flowJsonList ) ) )
+        flowJsonBatch[ 'flows' ] = flowJsonList
+        # pprint( flowJsonBatch )
 
         return flowJsonBatch
 
-
     def sendFlowBatch( self, batch={}, ip="DEFAULT", port="DEFAULT", debug=False ):
         """
         Description:
@@ -1803,7 +1802,8 @@
         import time
 
         try:
-            if debug: main.log.debug( "Adding flow: " + self.pprint( batch ) )
+            if debug:
+                main.log.debug( "Adding flow: " + self.pprint( batch ) )
             output = None
             if ip == "DEFAULT":
                 main.log.warn( "No ip given, reverting to ip from topo file" )
@@ -1814,10 +1814,10 @@
                 port = self.port
             url = "/flows/"
             response = self.send( method="POST",
-                                  url=url, ip = ip, port = port,
+                                  url=url, ip=ip, port=port,
                                   data=json.dumps( batch ) )
-            #main.log.info("Post response is: ", str(response[0]))
-            if response[0] == 200:
+            # main.log.info( "Post response is: ", str( response[ 0 ] ) )
+            if response[ 0 ] == 200:
                 main.log.info( self.name + ": Successfully POST flow batch" )
                 return main.TRUE, response
             else:
@@ -1834,7 +1834,7 @@
             main.cleanAndExit()
 
     def removeFlowBatch( self, batch={},
-                       ip="DEFAULT", port="DEFAULT" ):
+                         ip="DEFAULT", port="DEFAULT" ):
         """
         Description:
             Remove a batch of flows
@@ -1856,8 +1856,8 @@
             # NOTE: REST url requires the intent id to be in decimal form
 
             response = self.send( method="DELETE",
-                                  url="/flows/", ip = ip, port = port,
-                                  data = json.dumps(batch) )
+                                  url="/flows/", ip=ip, port=port,
+                                  data=json.dumps( batch ) )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     return main.TRUE
@@ -1882,7 +1882,7 @@
         import json
         try:
             # either onos:topology or 'topology' will work in CLI
-            topology = json.loads(topologyOutput)
+            topology = json.loads( topologyOutput )
             main.log.debug( topology )
             return topology
         except pexpect.EOF:
@@ -1914,7 +1914,7 @@
         """
         try:
             topology = self.getTopology( self.topology() )
-            #summary = self.summary()
+            # summary = self.summary()
             if topology == {}:
                 return main.ERROR
             output = ""
@@ -1978,7 +1978,7 @@
                           "appCookie": appCookie,
                           "groupId": groupId,
                           "buckets": bucketList
-                        }
+                          }
             return self.sendGroup( deviceId=deviceId, groupJson=groupJson, ip="DEFAULT", port="DEFAULT", debug=False )
 
         except ( AttributeError, TypeError ):
@@ -2004,7 +2004,8 @@
             of the ONOS node
         """
         try:
-            if debug: main.log.debug( "Adding group: " + self.pprint( groupJson ) )
+            if debug:
+                main.log.debug( "Adding group: " + self.pprint( groupJson ) )
             output = None
             if ip == "DEFAULT":
                 main.log.warn( "No ip given, reverting to ip from topo file" )
@@ -2015,7 +2016,7 @@
                 port = self.port
             url = "/groups/" + deviceId
             response = self.send( method="POST",
-                                  url=url, ip = ip, port = port,
+                                  url=url, ip=ip, port=port,
                                   data=json.dumps( groupJson ) )
             if response:
                 if "201" in str( response[ 0 ] ):
@@ -2064,8 +2065,8 @@
             if deviceId:
                 url += "/" + deviceId
                 if appCookie:
-                   url += "/" + appCookie
-            response = self.send( url=url, ip = ip, port = port )
+                    url += "/" + appCookie
+            response = self.send( url=url, ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     output = response[ 1 ]
@@ -2112,7 +2113,7 @@
                 port = self.port
             query = "/" + str( deviceId ) + "/" + str( appCookie )
             response = self.send( method="DELETE",
-                                  url="/groups" + query, ip = ip, port = port )
+                                  url="/groups" + query, ip=ip, port=port )
             if response:
                 if 200 <= response[ 0 ] <= 299:
                     return main.TRUE
@@ -2126,4 +2127,3 @@
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
-
diff --git a/TestON/drivers/common/api/controllerdriver.py b/TestON/drivers/common/api/controllerdriver.py
index 956374c..0c3305c 100644
--- a/TestON/drivers/common/api/controllerdriver.py
+++ b/TestON/drivers/common/api/controllerdriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 29-Nov-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -32,4 +32,3 @@
 
     def __init__( self ):
         super( Controller, self ).__init__()
-
diff --git a/TestON/drivers/common/api/dockerapidriver.py b/TestON/drivers/common/api/dockerapidriver.py
index 3fac610..3b9b77a 100644
--- a/TestON/drivers/common/api/dockerapidriver.py
+++ b/TestON/drivers/common/api/dockerapidriver.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -9,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,7 +19,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 import json
 import os
 import re
@@ -28,6 +27,7 @@
 from docker import errors
 from drivers.common.apidriver import API
 
+
 class DockerApiDriver( API ):
 
     def __init__( self ):
@@ -55,7 +55,7 @@
                 self.home = "/var/tmp"
 
             self.handle = super( DockerApiDriver, self ).connect()
-            self.dockerClient = Client(base_url='unix://var/run/docker.sock')
+            self.dockerClient = Client( base_url='unix://var/run/docker.sock' )
             return self.handle
         except Exception as e:
             main.log.exception( e )
@@ -72,29 +72,29 @@
                 if imageDict[ 'RepoTags' ] is not None:
                     if len( imageDict[ 'RepoTags' ] ) > 1:
                         duplicateTagDetected = 1
-                    imageListToSend.append( imageDict['RepoTags'][0].encode('UTF8').split(':')[1] )
+                    imageListToSend.append( imageDict[ 'RepoTags' ][ 0 ].encode( 'UTF8' ).split( ':' )[ 1 ] )
             return imageListToSend, duplicateTagDetected
         except Exception as e:
             main.log.exception( e )
 
-    def dockerPull( self, onosRepo ="onosproject/onos", onosTag="latest" ):
+    def dockerPull( self, onosRepo="onosproject/onos", onosTag="latest" ):
         """
         Pulls Docker image from repository
         """
         try:
             main.log.info( self.name +
-                           ": Pulling Docker image " + onosRepo + ":"+ onosTag )
-            for line in self.dockerClient.pull( repository = onosRepo, \
-                    tag = onosTag, stream = True ):
-                    print "#",
-            main.log.info(json.dumps(json.loads(line), indent =4))
+                           ": Pulling Docker image " + onosRepo + ":" + onosTag )
+            for line in self.dockerClient.pull( repository=onosRepo,
+                                                tag=onosTag, stream=True ):
+                print "#",
+            main.log.info( json.dumps( json.loads( line ), indent=4 ) )
 
-            #response = json.dumps( json.load( pullResult ), indent=4 )
+            # response = json.dumps( json.load( pullResult ), indent=4 )
             if re.search( "for onosproject/onos:" + onosTag, line ):
                 main.log.info( "onos docker image pulled is: " + line )
                 return main.TRUE
             else:
-                main.log.error( "Failed to download image from: " + onosRepo +":"+ onosTag )
+                main.log.error( "Failed to download image from: " + onosRepo + ":" + onosTag )
                 main.log.error( "Error respone: " )
                 main.log.error( line )
                 return main.FALSE
@@ -109,17 +109,17 @@
         try:
             main.log.info( self.name +
                            ": Creating Docker container for node: " + onosNode )
-            response = self.dockerClient.create_container( image=onosImage, \
-                    tty=True, name=onosNode, detach=True )
-            #print response
-            #print response.get("Id")
-            #print response.get("Warnings")
-            if( str( response.get("Warnings") ) == 'None' ):
-                main.log.info( "Created container for node: " + onosNode + "; container id is: " + response.get("Id") )
-                return ( main.TRUE, response.get("Id") )
+            response = self.dockerClient.create_container( image=onosImage,
+                                                           tty=True, name=onosNode, detach=True )
+            # print response
+            # print response.get( "Id" )
+            # print response.get( "Warnings" )
+            if( str( response.get( "Warnings" ) ) == 'None' ):
+                main.log.info( "Created container for node: " + onosNode + "; container id is: " + response.get( "Id" ) )
+                return ( main.TRUE, response.get( "Id" ) )
             else:
                 main.log.info( "Noticed warnings during create" )
-                return ( main.FALSE, null)
+                return ( main.FALSE, null )
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
@@ -131,7 +131,7 @@
         try:
             main.log.info( self.name +
                            ": Starting Docker conatiner Id " + ctID )
-            response = self.dockerClient.start( container = ctID )
+            response = self.dockerClient.start( container=ctID )
             if response is None:
                 main.log.info( "Started container for Id: " + ctID )
                 return main.TRUE
@@ -157,11 +157,11 @@
                 main.log.info( "Noticed warnings during stop" )
                 return main.FALSE
         except errors.NotFound:
-            main.log.info( ctName + " not found! Continue on tests...")
+            main.log.info( ctName + " not found! Continue on tests..." )
             return main.TRUE
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
-            #main.cleanAndExit()
+            # main.cleanAndExit()
 
     def dockerRestartCT( self, ctName ):
         """
@@ -181,27 +181,27 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def dockerCheckCTName( self, ctName):
+    def dockerCheckCTName( self, ctName ):
         """
             Check Docker conatiner status
         """
         try:
             main.log.info( self.name +
                            ": Checking Docker Status for CT with 'Names'  " + ctName )
-            namelist = [response["Names"] for response in self.dockerClient.containers(all=True) if not []]
-            main.log.info("Name list is: " + str(namelist) )
-            if( [ctName] in namelist):
+            namelist = [ response[ "Names" ] for response in self.dockerClient.containers( all=True ) if not [] ]
+            main.log.info( "Name list is: " + str( namelist ) )
+            if( [ ctName ] in namelist ):
                 main.log.info( "Container " + ctName + " exists" )
                 return main.TRUE
             else:
                 main.log.info( "Container " + ctName + " does not exist" )
                 return main.FALSE
         except errors.NotFound:
-            main.log.warn( ctName + "not found! Continue with the tests...")
+            main.log.warn( ctName + "not found! Continue with the tests..." )
             return main.FALSE
         except Exception:
             main.log.exception( self.name + ": Uncaught exception! Continue tests..." )
-            #main.cleanAndExit()
+            # main.cleanAndExit()
 
     def dockerRemoveCT( self, ctName ):
         """
@@ -215,15 +215,15 @@
                 main.log.info( "Removed container for node: " + ctName )
                 return main.TRUE
             else:
-                main.log.info( "Noticed warnings during Remove " + ctName)
+                main.log.info( "Noticed warnings during Remove " + ctName )
                 return main.FALSE
-            main.log.exception(self.name + ": not found, continuing...")
+            main.log.exception( self.name + ": not found, continuing..." )
         except errors.NotFound:
-            main.log.warn( ctName + "not found! Continue with the tests...")
+            main.log.warn( ctName + "not found! Continue with the tests..." )
             return main.TRUE
         except Exception:
             main.log.exception( self.name + ": Uncaught exception! Continuing..." )
-            #main.cleanAndExit()
+            # main.cleanAndExit()
 
     def dockerRemoveImage( self, imageRepoTag=None ):
         """
@@ -234,13 +234,13 @@
             main.log.info( "No docker image found" )
             return rmResult
         else:
-            imageList = [ image["Id"] for image in self.dockerClient.images()
-                                        if image["RepoTags"] is None
-                                           or imageRepoTag in image["RepoTags"] ]
+            imageList = [ image[ "Id" ] for image in self.dockerClient.images()
+                                        if image[ "RepoTags" ] is None
+                                           or imageRepoTag in image[ "RepoTags" ] ]
             for id in imageList:
                 try:
                     main.log.info( self.name + ": Removing Docker image " + id )
-                    response = self.dockerClient.remove_image(id, force = True)
+                    response = self.dockerClient.remove_image( id, force=True )
                     if response is None:
                         main.log.info( "Removed Docker image: " + id )
                         rmResult = rmResult and main.TRUE
@@ -248,12 +248,12 @@
                         main.log.info( "Noticed warnings during Remove " + id )
                         rmResult = rmResult and main.FALSE
                 except errors.NotFound:
-                    main.log.warn( image + "not found! Continue with the tests...")
+                    main.log.warn( image + "not found! Continue with the tests..." )
                     rmResult = rmResult and main.TRUE
                 except Exception:
                     main.log.exception( self.name + ": Uncaught exception! Continuing..." )
                     rmResult = rmResult and main.FALSE
-                    #main.cleanAndExit()
+                    # main.cleanAndExit()
         return rmResult
 
     def fetchLatestClusterFile( self, branch="master" ):
@@ -263,7 +263,7 @@
         try:
             command = "wget -N https://raw.githubusercontent.com/opennetworkinglab/\
                     onos/" + branch + "/tools/package/bin/onos-form-cluster"
-            subprocess.call( command ) # output checks are missing for now
+            subprocess.call( command )  # output checks are missing for now
             command = "chmod u+x " + "onos-form-cluster"
             subprocess.call( command )
             return main.TRUE
@@ -276,7 +276,7 @@
             From ONOS cluster for IP addresses in onosIPs list
         """
         try:
-            onosIPs = " ".join(onosIPs)
+            onosIPs = " ".join( onosIPs )
             command = "{}/onos-form-cluster -u {} -p {} {}".format( cmdPath,
                                                                     user,
                                                                     passwd,
@@ -285,7 +285,7 @@
             if result == 0:
                 return main.TRUE
             else:
-                main.log.info("Something is not right in forming cluster>")
+                main.log.info( "Something is not right in forming cluster>" )
                 return main.FALSE
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
@@ -297,11 +297,10 @@
         """
         try:
             output = self.dockerClient.inspect_container( ctName )
-            nodeIP = output['NetworkSettings']['IPAddress']
-            main.log.info( " Docker IP " + str(nodeIP) )
-            return str(nodeIP)
+            nodeIP = output[ 'NetworkSettings' ][ 'IPAddress' ]
+            main.log.info( " Docker IP " + str( nodeIP ) )
+            return str( nodeIP )
 
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
-
diff --git a/TestON/drivers/common/api/fvtapidriver.py b/TestON/drivers/common/api/fvtapidriver.py
index 4f20c89..c44d32d 100644
--- a/TestON/drivers/common/api/fvtapidriver.py
+++ b/TestON/drivers/common/api/fvtapidriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 26-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -25,8 +25,7 @@
 
 
 fvtapidriver is the basic driver which will handle the fvtapidriver functions
-"""
-"""
+""""""
 There are two changes required in flowvisor-test framework :
 
 1. In ~/flowvisortests/tests/templatetest.py line : 15 comment 'basic_logger = None'
@@ -188,4 +187,3 @@
         #    self.logfile_handler.close()
 
         return main.TRUE
-
diff --git a/TestON/drivers/common/apidriver.py b/TestON/drivers/common/apidriver.py
index ec416ee..890e89f 100644
--- a/TestON/drivers/common/apidriver.py
+++ b/TestON/drivers/common/apidriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 22-Nov-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -44,4 +44,3 @@
         super( API, self ).connect()
 
         return main.TRUE
-
diff --git a/TestON/drivers/common/cli/dpclidriver.py b/TestON/drivers/common/cli/dpclidriver.py
index 2386c45..5091d1a 100644
--- a/TestON/drivers/common/cli/dpclidriver.py
+++ b/TestON/drivers/common/cli/dpclidriver.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -38,9 +38,9 @@
 
         self.name = self.options[ 'name' ]
         self.handle = super( DPCliDriver, self ).connect( user_name=self.user_name,
-                        ip_address=self.ip_address,
-                        port=self.port,
-                        pwd=self.pwd )
+                                                          ip_address=self.ip_address,
+                                                          port=self.port,
+                                                          pwd=self.pwd )
 
         if self.handle:
             return self.handle
@@ -148,7 +148,7 @@
         self.handle.sendline( "sudo fping -S " + str( netsrc ) + "." +
                               str( netstrt ) + ".1.1 -f /tmp/ip_table" +
                               str( netdst ) + ".txt" )
-        while 1:
+        while True:
             i = self.handle.expect( [
                                     "reachable",
                                     "unreachable",
@@ -210,4 +210,3 @@
             main.log.exception( "Connection failed to the host" )
             response = main.FALSE
         return response
-
diff --git a/TestON/drivers/common/cli/emulator/flowvisordriver.py b/TestON/drivers/common/cli/emulator/flowvisordriver.py
index e1877ae..0e53125 100644
--- a/TestON/drivers/common/cli/emulator/flowvisordriver.py
+++ b/TestON/drivers/common/cli/emulator/flowvisordriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 26-Mar-2013
-Copyright 2013 Open Networking Foundation (ONF)
+Copyright 2013 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -42,7 +42,7 @@
         self.wrapped = sys.modules[ __name__ ]
 
     def connect( self, **connectargs ):
-        #,user_name, ip_address, pwd,options ):
+        # user_name, ip_address, pwd,options ):
         # Here the main is the TestON instance after creating all the log
         # handles.
         for key in connectargs:
@@ -63,7 +63,7 @@
         if self.handle:
             self.execute( cmd='\r', prompt=self.prompt, timeout=10 )
             self.options[ 'path' ] = '/home/openflow/flowvisor/scripts/'
-            #self.handle.logfile = sys.stdout
+            # self.handle.logfile = sys.stdout
             self.execute(
                 cmd='cd ' +
                 self.options[ 'path' ],
@@ -90,9 +90,9 @@
                 self.fvprocess_id,
                 onfail="Failed to start FlowVisor" )
             main.log.info( response )
-            #import time
+            # import time
             # time.sleep( 10 )
-            #response = self.execute( cmd='./start_visualizer.sh & \r',prompt=self.prompt,timeout=10 )
+            # response = self.execute( cmd='./start_visualizer.sh & \r',prompt=self.prompt,timeout=10 )
 
             return main.TRUE
         else:
@@ -192,7 +192,7 @@
 
     def listDevices( self ):
         # self.execute( cmd="clear",prompt=self.prompt,timeout=10 )
-        #self.execute( cmd="./fvctl.sh listDevices ",prompt="passwd:",timeout=10 )
+        # self.execute( cmd="./fvctl.sh listDevices ",prompt="passwd:",timeout=10 )
         # self.execute( cmd="\n",prompt=self.prompt,timeout=10 )
         devices_list = ''
         last_response = re.findall(
diff --git a/TestON/drivers/common/cli/emulator/lincoedriver.py b/TestON/drivers/common/cli/emulator/lincoedriver.py
index d5e114a..f41b6d2 100644
--- a/TestON/drivers/common/cli/emulator/lincoedriver.py
+++ b/TestON/drivers/common/cli/emulator/lincoedriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright 2014 Open Networking Foundation (ONF)
+Copyright 2014 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -35,7 +35,6 @@
 
 OCT 20 2014
 """
-
 import pexpect
 import sys
 from drivers.common.cli.emulatordriver import Emulator
@@ -56,7 +55,6 @@
         """
         Create ssh handle for Linc-OE cli
         """
-
         for key in connectargs:
             vars( self )[ key ] = connectargs[ key ]
 
@@ -221,7 +219,7 @@
         """
             Since executing opticalTest.py will give you mininet
             prompt, you would at some point require to get onto
-            console of LincOE ((linc@onosTestBench)1>) to execute
+            console of LincOE ( ( linc@onosTestBench )1> ) to execute
             commands like bring a optical port up or down on a ROADM
             You can attach to console of Linc-OE session by a cmd:
             sudo ~/linc-oe/rel/linc/bin/linc attach
diff --git a/TestON/drivers/common/cli/emulator/lincoemininetdriver.py b/TestON/drivers/common/cli/emulator/lincoemininetdriver.py
index bfa466f..2a85d63 100644
--- a/TestON/drivers/common/cli/emulator/lincoemininetdriver.py
+++ b/TestON/drivers/common/cli/emulator/lincoemininetdriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -23,7 +23,6 @@
 
 LincOEMininetDriver is an extension of the mininetclidriver to handle linc oe
 """
-
 import pexpect
 import re
 import sys
@@ -32,7 +31,8 @@
 
 
 class LincOEMininetDriver( MininetCliDriver ):
-    def runOpticalMnScript( self, onosDirectory = 'onos', ctrllerIP = None, topology = 'opticalTest' ):
+
+    def runOpticalMnScript( self, onosDirectory='onos', ctrllerIP=None, topology='opticalTest' ):
         import time
         import types
         """
@@ -41,22 +41,22 @@
                 It runs python script "opticalTest.py" to create the
                 packet layer( mn ) and optical topology
             Optional:
-                name - Name of onos directory. (ONOS | onos)
+                name - Name of onos directory. ( ONOS | onos )
                 topology - Name of optical topology to activate, defaults to opticalTest.py
             Required:
-                ctrllerIP = Controller(s) IP address
+                ctrllerIP = Controller( s ) IP address
             TODO: If no ctrllerIP is provided, a default
                 $OC1 can be accepted
         """
         try:
-            if ctrllerIP == None:
+            if ctrllerIP is None:
                 main.log.error( "You need to specify the IP" )
                 return main.FALSE
             else:
                 controller = ''
                 if isinstance( ctrllerIP, types.ListType ):
                     for i in xrange( len( ctrllerIP ) ):
-                        controller += ctrllerIP[i] + ' '
+                        controller += ctrllerIP[ i ] + ' '
                     main.log.info( "Mininet topology is being loaded with " +
                                    "controllers: " + controller )
                 elif isinstance( ctrllerIP, types.StringType ):
@@ -70,12 +70,12 @@
                 cmd = "sudo -E python {0} {1}".format( topoFile, controller )
                 main.log.info( self.name + ": cmd = " + cmd )
                 self.handle.sendline( cmd )
-                lincStart = self.handle.expect( [ "mininet>", pexpect.TIMEOUT ],timeout=120 )
+                lincStart = self.handle.expect( [ "mininet>", pexpect.TIMEOUT ], timeout=120 )
                 if lincStart == 1:
                     self.handle.sendline( "\x03" )
                     self.handle.sendline( "sudo mn -c" )
                     self.handle.sendline( cmd )
-                    lincStart = self.handle.expect( [ "mininet>", pexpect.TIMEOUT ],timeout=120 )
+                    lincStart = self.handle.expect( [ "mininet>", pexpect.TIMEOUT ], timeout=120 )
                 if lincStart == 1:
                     main.log.error( "OpticalTest.py failed to start." )
                     return main.FALSE
@@ -85,7 +85,7 @@
             main.log.error( self.name + ":     " + self.handle.before )
             return main.FALSE
         except Exception:
-            main.log.exception(self.name + ": Uncaught exception!")
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
             return main.FALSE
 
@@ -120,7 +120,7 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
         except Exception:
-            main.log.exception(self.name + ": Uncaught exception!")
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
         main.log.info( self.name + ": Ping Response: " + response )
         if re.search( ',\s0\%\spacket\sloss', response ):
diff --git a/TestON/drivers/common/cli/emulator/mininetclidriver.py b/TestON/drivers/common/cli/emulator/mininetclidriver.py
index 531e5ca..d5adc69 100644
--- a/TestON/drivers/common/cli/emulator/mininetclidriver.py
+++ b/TestON/drivers/common/cli/emulator/mininetclidriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 26-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -44,6 +44,7 @@
 
 
 class MininetCliDriver( Emulator ):
+
     """
        MininetCliDriver is the basic driver which will handle
        the Mininet functions"""
@@ -124,12 +125,12 @@
     def startNet( self, topoFile='', args='', mnCmd='', timeout=120 ):
         """
         Description:
-            Starts Mininet accepts a topology(.py) file and/or an optional
+            Starts Mininet accepts a topology( .py ) file and/or an optional
             argument, to start the mininet, as a parameter.
             Can also send regular mininet command to load up desired topology.
             Eg. Pass in a string 'mn --topo=tree,3,3' to mnCmd
         Options:
-            topoFile = file path for topology file (.py)
+            topoFile = file path for topology file ( .py )
             args = extra option added when starting the topology from the file
             mnCmd = Mininet command use to start topology
         Returns:
@@ -183,7 +184,7 @@
                         main.log.info(
                             "Starting Mininet from topo file " +
                             topoFile )
-                        cmdString +=  "-E python " + topoFile + " "
+                        cmdString += "-E python " + topoFile + " "
                         if args is None:
                             args = ''
                             # TODO: allow use of args from .topo file?
@@ -432,7 +433,6 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-
     def pingallHosts( self, hostList, wait=1 ):
         """
             Ping all specified IPv4 hosts
@@ -460,7 +460,7 @@
                 pingList = hostList[ :listIndex ] + \
                     hostList[ ( listIndex + 1 ): ]
 
-                pingResponse += str(str(host) + " -> ")
+                pingResponse += str( str( host ) + " -> " )
 
                 for temp in pingList:
                     # Current host pings all other hosts specified
@@ -469,14 +469,14 @@
                     self.handle.expect( "mininet>", timeout=wait + 1 )
                     response = self.handle.before
                     if re.search( ',\s0\%\spacket\sloss', response ):
-                        pingResponse += str(" h" + str( temp[1:] ))
+                        pingResponse += str( " h" + str( temp[ 1: ] ) )
                     else:
                         pingResponse += " X"
                         # One of the host to host pair is unreachable
                         isReachable = main.FALSE
                         failedPings += 1
                 pingResponse += "\n"
-            main.log.info( pingResponse + "Failed pings: " + str(failedPings) )
+            main.log.info( pingResponse + "Failed pings: " + str( failedPings ) )
             return isReachable
         except pexpect.TIMEOUT:
             main.log.exception( self.name + ": TIMEOUT exception" )
@@ -511,23 +511,23 @@
                 pingList = hostList[ :listIndex ] + \
                     hostList[ ( listIndex + 1 ): ]
 
-                pingResponse += str(str(host) + " -> ")
+                pingResponse += str( str( host ) + " -> " )
 
                 for temp in pingList:
                     # Current host pings all other hosts specified
-                    pingCmd = str( host ) + cmd + str( self.getIPAddress(temp,proto='IPv6') )
+                    pingCmd = str( host ) + cmd + str( self.getIPAddress( temp, proto='IPv6' ) )
                     self.handle.sendline( pingCmd )
                     self.handle.expect( "mininet>", timeout=wait + 1 )
                     response = self.handle.before
                     if re.search( ',\s0\%\spacket\sloss', response ):
-                        pingResponse += str(" h" + str( temp[1:] ))
+                        pingResponse += str( " h" + str( temp[ 1: ] ) )
                     else:
                         pingResponse += " X"
                         # One of the host to host pair is unreachable
                         isReachable = main.FALSE
                         failedPings += 1
                 pingResponse += "\n"
-            main.log.info( pingResponse + "Failed pings: " + str(failedPings) )
+            main.log.info( pingResponse + "Failed pings: " + str( failedPings ) )
             return isReachable
 
         except pexpect.TIMEOUT:
@@ -547,7 +547,7 @@
         Currently the only supported Params: SRC, TARGET, and WAIT
         """
         args = utilities.parse_args( [ "SRC", "TARGET", 'WAIT' ], **pingParams )
-        wait = args['WAIT']
+        wait = args[ 'WAIT' ]
         wait = int( wait if wait else 1 )
         command = args[ "SRC" ] + " ping " + \
             args[ "TARGET" ] + " -c 1 -i 1 -W " + str( wait ) + " "
@@ -588,11 +588,11 @@
         """
            IPv6 Ping between a pair of mininet hosts
            Currently the only supported Params are: SRC, TARGET, and WAIT
-           FLOWLABEL and -I (src interface) will be added later after running some tests.
+           FLOWLABEL and -I ( src interface ) will be added later after running some tests.
            Example: main.Mininet1.ping6pair( src="h1", target="1000::2" )
         """
         args = utilities.parse_args( [ "SRC", "TARGET", 'WAIT' ], **pingParams )
-        wait = args['WAIT']
+        wait = args[ 'WAIT' ]
         wait = int( wait if wait else 1 )
         command = args[ "SRC" ] + " ping6 " + \
             args[ "TARGET" ] + " -c 1 -i 1 -W " + str( wait ) + " "
@@ -836,8 +836,8 @@
                 return main.TRUE
 
             except pexpect.TIMEOUT:
-                main.log.error(self.name + ": TIMEOUT exception found")
-                main.log.error(self.name + ":     " + self.handle.before)
+                main.log.error( self.name + ": TIMEOUT exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
                 main.cleanAndExit()
             except pexpect.EOF:
                 main.log.error( self.name + ": EOF exception found" )
@@ -875,7 +875,7 @@
                 self.handle.expect( "mininet>" )
 
                 # Determine ip and mac address of the host-oldSw interface
-                cmd = "px ipaddr = " + str(IP)
+                cmd = "px ipaddr = " + str( IP )
                 print "cmd3= ", cmd
                 self.handle.sendline( cmd )
                 self.handle.expect( "mininet>" )
@@ -923,13 +923,13 @@
                 self.handle.expect( "mininet>" )
 
                 cmd = host + " ifconfig"
-                print "cmd9 =",cmd
-                response = self.execute( cmd = cmd, prompt="mininet>" ,timeout=10 )
+                print "cmd9 =", cmd
+                response = self.execute( cmd=cmd, prompt="mininet>", timeout=10 )
                 print response
                 pattern = "h\d-eth([\w])"
                 ipAddressSearch = re.search( pattern, response )
-                print ipAddressSearch.group(1)
-                intf= host + "-eth" + str(ipAddressSearch.group(1))
+                print ipAddressSearch.group( 1 )
+                intf = host + "-eth" + str( ipAddressSearch.group( 1 ) )
                 cmd = host + " ip -6 addr add %s dev %s" % ( IP, intf )
                 print "cmd10 = ", cmd
                 self.handle.sendline( cmd )
@@ -950,8 +950,8 @@
 
                 return main.TRUE
             except pexpect.TIMEOUT:
-                main.log.error(self.name + ": TIMEOUT exception found")
-                main.log.error(self.name + ":     " + self.handle.before)
+                main.log.error( self.name + ": TIMEOUT exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
                 main.cleanAndExit()
             except pexpect.EOF:
                 main.log.error( self.name + ": EOF exception found" )
@@ -980,8 +980,8 @@
                     newIP )
                 return main.TRUE
             except pexpect.TIMEOUT:
-                main.log.error(self.name + ": TIMEOUT exception found")
-                main.log.error(self.name + ":     " + self.handle.before)
+                main.log.error( self.name + ": TIMEOUT exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
                 main.cleanAndExit()
             except pexpect.EOF:
                 main.log.error( self.name + ": EOF exception found" )
@@ -1009,8 +1009,8 @@
                     newGW )
                 return main.TRUE
             except pexpect.TIMEOUT:
-                main.log.error(self.name + ": TIMEOUT exception found")
-                main.log.error(self.name + ":     " + self.handle.before)
+                main.log.error( self.name + ": TIMEOUT exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
                 main.cleanAndExit()
             except pexpect.EOF:
                 main.log.error( self.name + ": EOF exception found" )
@@ -1038,8 +1038,8 @@
                     macaddr )
                 return main.TRUE
             except pexpect.TIMEOUT:
-                main.log.error(self.name + ": TIMEOUT exception found")
-                main.log.error(self.name + ":     " + self.handle.before)
+                main.log.error( self.name + ": TIMEOUT exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
                 main.cleanAndExit()
             except pexpect.EOF:
                 main.log.error( self.name + ": EOF exception found" )
@@ -1062,8 +1062,8 @@
                 main.log.info( host + " arp -an = " + response )
                 return main.TRUE
             except pexpect.TIMEOUT:
-                main.log.error(self.name + ": TIMEOUT exception found")
-                main.log.error(self.name + ":     " + self.handle.before)
+                main.log.error( self.name + ": TIMEOUT exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
                 main.cleanAndExit()
             except pexpect.EOF:
                 main.log.error( self.name + ": EOF exception found" )
@@ -1136,7 +1136,7 @@
         else:
             main.log.error( "Connection failed to the host" )
 
-    def getIPAddress( self, host , proto='IPV4'):
+    def getIPAddress( self, host, proto='IPV4' ):
         """
            Verifies the host's ip configured or not."""
         if self.handle:
@@ -1212,8 +1212,8 @@
                 response = self.handle.before
                 return response
             except pexpect.TIMEOUT:
-                main.log.error(self.name + ": TIMEOUT exception found")
-                main.log.error(self.name + ":     " + self.handle.before)
+                main.log.error( self.name + ": TIMEOUT exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
                 main.cleanAndExit()
             except pexpect.EOF:
                 main.log.error( self.name + ": EOF exception found" )
@@ -1305,33 +1305,33 @@
             main.cleanAndExit()
         return response
 
-    def iperftcpAll(self, hosts, timeout=6):
-        '''
+    def iperftcpAll( self, hosts, timeout=6 ):
+        """
         Runs the iperftcp function with a given set of hosts and specified timeout.
 
         @parm:
             timeout: The defualt timeout is 6 sec to allow enough time for a successful test to complete,
              and short enough to stop an unsuccessful test from quiting and cleaning up mininet.
-        '''
+        """
         try:
             for host1 in hosts:
                 for host2 in hosts:
                     if host1 != host2:
-                        if self.iperftcp(host1, host2, timeout) == main.FALSE:
-                            main.log.error(self.name + ": iperftcp test failed for " + host1 + " and " + host2)
+                        if self.iperftcp( host1, host2, timeout ) == main.FALSE:
+                            main.log.error( self.name + ": iperftcp test failed for " + host1 + " and " + host2 )
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def iperftcp(self, host1="h1", host2="h2", timeout=6):
-        '''
+    def iperftcp( self, host1="h1", host2="h2", timeout=6 ):
+        """
         Creates an iperf TCP test between two hosts. Returns main.TRUE if test results
         are valid.
 
         @parm:
             timeout: The defualt timeout is 6 sec to allow enough time for a successful test to complete,
              and short enough to stop an unsuccessful test from quiting and cleaning up mininet.
-        '''
+        """
         main.log.info( self.name + ": Simple iperf TCP test between two hosts" )
         try:
             # Setup the mininet command
@@ -1342,26 +1342,26 @@
 
             # checks if there are results in the mininet response
             if "Results:" in response:
-                main.log.report(self.name + ": iperf test completed")
+                main.log.report( self.name + ": iperf test completed" )
                 # parse the mn results
-                response = response.split("\r\n")
-                response = response[len(response)-2]
-                response = response.split(": ")
-                response = response[len(response)-1]
-                response = response.replace("[", "")
-                response = response.replace("]", "")
-                response = response.replace("\'", "")
+                response = response.split( "\r\n" )
+                response = response[ len( response ) - 2 ]
+                response = response.split( ": " )
+                response = response[ len( response ) - 1 ]
+                response = response.replace( "[", "" )
+                response = response.replace( "]", "" )
+                response = response.replace( "\'", "" )
 
                 # this is the bandwith two and from the two hosts
-                bandwidth = response.split(", ")
+                bandwidth = response.split( ", " )
 
                 # there should be two elements in the bandwidth list
-                # ['host1 to host2', 'host2 to host1"]
-                if len(bandwidth) == 2:
-                    main.log.report(self.name + ": iperf test successful")
+                # [ 'host1 to host2', 'host2 to host1" ]
+                if len( bandwidth ) == 2:
+                    main.log.report( self.name + ": iperf test successful" )
                     return main.TRUE
                 else:
-                    main.log.error(self.name + ": invalid iperf results")
+                    main.log.error( self.name + ": invalid iperf results" )
                     return main.FALSE
             else:
                 main.log.error( self.name + ": iperf test failed" )
@@ -1383,22 +1383,22 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def iperftcpipv6(self, host1="h1", host2="h2", timeout=50):
+    def iperftcpipv6( self, host1="h1", host2="h2", timeout=50 ):
         main.log.info( self.name + ": Simple iperf TCP test between two hosts" )
         try:
             IP1 = self.getIPAddress( host1, proto='IPV6' )
-            cmd1 = host1 +' iperf -V -sD -B '+ str(IP1)
+            cmd1 = host1 + ' iperf -V -sD -B ' + str( IP1 )
             self.handle.sendline( cmd1 )
-            outcome1 = self.handle.expect( "mininet>")
-            cmd2 = host2 +' iperf -V -c '+ str(IP1) +' -t 5'
+            outcome1 = self.handle.expect( "mininet>" )
+            cmd2 = host2 + ' iperf -V -c ' + str( IP1 ) + ' -t 5'
             self.handle.sendline( cmd2 )
-            outcome2 = self.handle.expect( "mininet>")
+            outcome2 = self.handle.expect( "mininet>" )
             response1 = self.handle.before
             response2 = self.handle.after
-            print response1,response2
-            pattern = "connected with "+ str(IP1)
+            print response1, response2
+            pattern = "connected with " + str( IP1 )
             if pattern in response1:
-                main.log.report(self.name + ": iperf test completed")
+                main.log.report( self.name + ": iperf test completed" )
                 return main.TRUE
             else:
                 main.log.error( self.name + ": iperf test failed" )
@@ -1418,77 +1418,76 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def iperfudpAll(self, hosts, bandwidth="10M"):
-        '''
+    def iperfudpAll( self, hosts, bandwidth="10M" ):
+        """
         Runs the iperfudp function with a given set of hosts and specified
         bandwidth
 
         @param:
-            bandwidth: the targeted bandwidth, in megabits ('M')
-        '''
+            bandwidth: the targeted bandwidth, in megabits ( 'M' )
+        """
         try:
             for host1 in hosts:
                 for host2 in hosts:
                     if host1 != host2:
-                        if self.iperfudp(host1, host2, bandwidth) == main.FALSE:
-                            main.log.error(self.name + ": iperfudp test failed for " + host1 + " and " + host2)
+                        if self.iperfudp( host1, host2, bandwidth ) == main.FALSE:
+                            main.log.error( self.name + ": iperfudp test failed for " + host1 + " and " + host2 )
         except TypeError:
-            main.log.exception(self.name + ": Object not as expected")
+            main.log.exception( self.name + ": Object not as expected" )
             return main.FALSE
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def iperfudp( self, bandwidth="10M", host1="h1", host2="h2"):
-
-        '''
+    def iperfudp( self, bandwidth="10M", host1="h1", host2="h2" ):
+        """
         Creates an iperf UDP test with a specific bandwidth.
         Returns true if results are valid.
 
         @param:
-            bandwidth: the targeted bandwidth, in megabits ('M'), to run the test
-        '''
-        main.log.info(self.name + ": Simple iperf UDP test between two hosts")
+            bandwidth: the targeted bandwidth, in megabits ( 'M' ), to run the test
+        """
+        main.log.info( self.name + ": Simple iperf UDP test between two hosts" )
         try:
             # setup the mininet command
             cmd = 'iperfudp ' + bandwidth + " " + host1 + " " + host2
-            self.handle.sendline(cmd)
-            self.handle.expect("mininet>")
+            self.handle.sendline( cmd )
+            self.handle.expect( "mininet>" )
             response = self.handle.before
 
             # check if there are in results in the mininet response
             if "Results:" in response:
-                main.log.report(self.name + ": iperfudp test completed")
+                main.log.report( self.name + ": iperfudp test completed" )
                 # parse the results
-                response = response.split("\r\n")
-                response = response[len(response)-2]
-                response = response.split(": ")
-                response = response[len(response)-1]
-                response = response.replace("[", "")
-                response = response.replace("]", "")
-                response = response.replace("\'", "")
+                response = response.split( "\r\n" )
+                response = response[ len( response ) - 2 ]
+                response = response.split( ": " )
+                response = response[ len( response ) - 1 ]
+                response = response.replace( "[", "" )
+                response = response.replace( "]", "" )
+                response = response.replace( "\'", "" )
 
-                mnBandwidth = response.split(", ")
+                mnBandwidth = response.split( ", " )
 
                 # check to see if there are at least three entries
-                # ['bandwidth', 'host1 to host2', 'host2 to host1']
-                if len(mnBandwidth) == 3:
+                # [ 'bandwidth', 'host1 to host2', 'host2 to host1' ]
+                if len( mnBandwidth ) == 3:
                     # if one entry is blank then something is wrong
                     for item in mnBandwidth:
                         if item == "":
-                            main.log.error(self.name + ": Could not parse iperf output")
-                            main.log.error(self.name + ": invalid iperfudp results")
+                            main.log.error( self.name + ": Could not parse iperf output" )
+                            main.log.error( self.name + ": invalid iperfudp results" )
                             return main.FALSE
                     # otherwise results are vaild
-                    main.log.report(self.name + ": iperfudp test successful")
+                    main.log.report( self.name + ": iperfudp test successful" )
                     return main.TRUE
                 else:
-                    main.log.error(self.name + ": invalid iperfudp results")
+                    main.log.error( self.name + ": invalid iperfudp results" )
                     return main.FALSE
 
         except pexpect.TIMEOUT:
-            main.log.error(self.name + ": TIMEOUT exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": TIMEOUT exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -1577,8 +1576,8 @@
             self.handle.sendline( command )
             self.handle.expect( "mininet>" )
         except pexpect.TIMEOUT:
-            main.log.error(self.name + ": TIMEOUT exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": TIMEOUT exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -1598,7 +1597,7 @@
         main.log.info( command )
 
         try:
-            response = self.execute( cmd = command, prompt = "mininet>" )
+            response = self.execute( cmd=command, prompt="mininet>" )
             if re.search( "Unknown command", response ):
                 main.log.warn( response )
                 return main.FALSE
@@ -1740,7 +1739,7 @@
         Return:
             Returns main.TRUE if mininet correctly assigned switches to
             controllers, otherwise it will return main.FALSE or an appropriate
-            exception(s)
+            exception( s )
         """
         assignResult = main.TRUE
         # Initial ovs command
@@ -1947,9 +1946,9 @@
     def getSwitchRandom( self, timeout=60, nonCut=True ):
         """
         Randomly get a switch from Mininet topology.
-        If nonCut is True, it gets a list of non-cut switches (the deletion
+        If nonCut is True, it gets a list of non-cut switches ( the deletion
         of a non-cut switch will not increase the number of connected
-        components of a graph) and randomly returns one of them, otherwise
+        components of a graph ) and randomly returns one of them, otherwise
         it just randomly returns one switch from all current switches in
         Mininet.
         Returns the name of the chosen switch.
@@ -1964,11 +1963,11 @@
                     candidateSwitches.append( switchName )
             else:
                 graphDict = self.getGraphDict( timeout=timeout, useId=False )
-                if graphDict == None:
+                if graphDict is None:
                     return None
                 self.graph.update( graphDict )
                 candidateSwitches = self.graph.getNonCutVertices()
-            if candidateSwitches == None:
+            if candidateSwitches is None:
                 return None
             elif len( candidateSwitches ) == 0:
                 main.log.info( self.name + ": No candidate switch for deletion" )
@@ -1989,16 +1988,16 @@
     def delSwitchRandom( self, timeout=60, nonCut=True ):
         """
         Randomly delete a switch from Mininet topology.
-        If nonCut is True, it gets a list of non-cut switches (the deletion
+        If nonCut is True, it gets a list of non-cut switches ( the deletion
         of a non-cut switch will not increase the number of connected
-        components of a graph) and randomly chooses one for deletion,
+        components of a graph ) and randomly chooses one for deletion,
         otherwise it just randomly delete one switch from all current
         switches in Mininet.
         Returns the name of the deleted switch
         """
         try:
             switch = self.getSwitchRandom( timeout, nonCut )
-            if switch == None:
+            if switch is None:
                 return None
             else:
                 deletionResult = self.delSwitch( switch )
@@ -2083,9 +2082,9 @@
     def getLinkRandom( self, timeout=60, nonCut=True ):
         """
         Randomly get a link from Mininet topology.
-        If nonCut is True, it gets a list of non-cut links (the deletion
+        If nonCut is True, it gets a list of non-cut links ( the deletion
         of a non-cut link will not increase the number of connected
-        component of a graph) and randomly returns one of them, otherwise
+        component of a graph ) and randomly returns one of them, otherwise
         it just randomly returns one link from all current links in
         Mininet.
         Returns the link as a list, e.g. [ 's1', 's2' ]
@@ -2103,11 +2102,11 @@
                     candidateLinks.append( [ link[ 'node1' ], link[ 'node2' ] ] )
             else:
                 graphDict = self.getGraphDict( timeout=timeout, useId=False )
-                if graphDict == None:
+                if graphDict is None:
                     return None
                 self.graph.update( graphDict )
                 candidateLinks = self.graph.getNonCutEdges()
-            if candidateLinks == None:
+            if candidateLinks is None:
                 return None
             elif len( candidateLinks ) == 0:
                 main.log.info( self.name + ": No candidate link for deletion" )
@@ -2128,16 +2127,16 @@
     def delLinkRandom( self, timeout=60, nonCut=True ):
         """
         Randomly delete a link from Mininet topology.
-        If nonCut is True, it gets a list of non-cut links (the deletion
+        If nonCut is True, it gets a list of non-cut links ( the deletion
         of a non-cut link will not increase the number of connected
-        component of a graph) and randomly chooses one for deletion,
+        component of a graph ) and randomly chooses one for deletion,
         otherwise it just randomly delete one link from all current links
         in Mininet.
         Returns the deleted link as a list, e.g. [ 's1', 's2' ]
         """
         try:
             link = self.getLinkRandom( timeout, nonCut )
-            if link == None:
+            if link is None:
                 return None
             else:
                 deletionResult = self.delLink( link[ 0 ], link[ 1 ] )
@@ -2299,8 +2298,8 @@
                         fileName +
                         "\" | grep -v grep | awk '{print $2}'\`" )
             except pexpect.TIMEOUT:
-                main.log.error(self.name + ": TIMEOUT exception found")
-                main.log.error(self.name + ":     " + self.handle.before)
+                main.log.error( self.name + ": TIMEOUT exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
                 main.cleanAndExit()
             except pexpect.EOF:
                 main.log.error( self.name + ": EOF exception found" )
@@ -2328,7 +2327,7 @@
             ethDevice = '-I ' + ethDevice + ' '
         cmd = srcHost + " arping -c1 "
         if noResult:
-            cmd += "-w10 " # If we don't want the actural arping result, set -w10, arping will exit after 10 ms.
+            cmd += "-w10 "  # If we don't want the actural arping result, set -w10, arping will exit after 10 ms.
         cmd += ethDevice + dstHost
         try:
             if output:
@@ -2413,11 +2412,11 @@
             assert flowTable1, "flowTable1 is empty or None"
             assert flowTable2, "flowTable2 is empty or None"
             returnValue = main.TRUE
-            if len(flowTable1) != len(flowTable2):
+            if len( flowTable1 ) != len( flowTable2 ):
                 main.log.warn( "Flow table lengths do not match" )
                 returnValue = main.FALSE
-            dFields = ["n_bytes", "cookie", "n_packets", "duration"]
-            for flow1, flow2 in zip(flowTable1, flowTable2):
+            dFields = [ "n_bytes", "cookie", "n_packets", "duration" ]
+            for flow1, flow2 in zip( flowTable1, flowTable2 ):
                 for field in dFields:
                     try:
                         flow1.pop( field )
@@ -2427,10 +2426,10 @@
                         flow2.pop( field )
                     except KeyError:
                         pass
-            for i in range( len(flowTable1) ):
-                if flowTable1[i] not in flowTable2:
+            for i in range( len( flowTable1 ) ):
+                if flowTable1[ i ] not in flowTable2:
                     main.log.warn( "Flow tables do not match:" )
-                    main.log.warn( "Old flow:\n{}\n not in new flow table".format( flowTable1[i] ) )
+                    main.log.warn( "Old flow:\n{}\n not in new flow table".format( flowTable1[ i ] ) )
                     returnValue = main.FALSE
                     break
             return returnValue
@@ -2442,7 +2441,7 @@
             main.cleanAndExit()
 
     def parseFlowTable( self, flowTable, version="", debug=True ):
-        '''
+        """
         Discription: Parses flows into json format.
         NOTE: this can parse any string thats separated with commas
         Arguments:
@@ -2452,69 +2451,70 @@
                 version: The version of OpenFlow. Currently, 1.3 and 1.0 are supported.
                 debug: prints out the final result
         returns: A list of flows in json format
-        '''
+        """
         jsonFlowTable = []
         try:
             for flow in flowTable:
                 jsonFlow = {}
                 # split up the fields of the flow
-                parsedFlow = flow.split(", ")
+                parsedFlow = flow.split( ", " )
                 # get rid of any spaces in front of the field
-                for i in range( len(parsedFlow) ):
-                    item = parsedFlow[i]
-                    if item[0] == " ":
-                        parsedFlow[i] = item[1:]
+                for i in range( len( parsedFlow ) ):
+                    item = parsedFlow[ i ]
+                    if item[ 0 ] == " ":
+                        parsedFlow[ i ] = item[ 1: ]
                 # grab the selector and treatment from the parsed flow
                 # the last element is the selector and the treatment
-                temp = parsedFlow.pop(-1)
+                temp = parsedFlow.pop( -1 )
                 # split up the selector and the treatment
-                temp = temp.split(" ")
+                temp = temp.split( " " )
                 index = 0
                 # parse the flags
                 # NOTE: This only parses one flag
                 flag = {}
                 if version == "1.3":
-                    flag = {"flag":[temp[index]]}
+                    flag = { "flag": [ temp[ index ] ] }
                     index += 1
                 # the first element is the selector and split it up
-                sel = temp[index]
+                sel = temp[ index ]
                 index += 1
-                sel = sel.split(",")
+                sel = sel.split( "," )
                 # the priority is stuck in the selecter so put it back
                 # in the flow
-                parsedFlow.append(sel.pop(0))
+                parsedFlow.append( sel.pop( 0 ) )
                 # parse selector
                 criteria = []
                 for item in sel:
                     # this is the type of the packet e.g. "arp"
                     if "=" not in item:
-                        criteria.append( {"type":item} )
+                        criteria.append( { "type": item } )
                     else:
-                        field = item.split("=")
-                        criteria.append( {field[0]:field[1]} )
-                selector = {"selector": {"criteria":sorted(criteria)} }
-                treat = temp[index]
+                        field = item.split( "=" )
+                        criteria.append( { field[ 0 ]: field[ 1 ] } )
+                selector = { "selector": { "criteria": sorted( criteria ) } }
+                treat = temp[ index ]
                 # get rid of the action part e.g. "action=output:2"
                 # we will add it back later
-                treat = treat.split("=")
-                treat.pop(0)
+                treat = treat.split( "=" )
+                treat.pop( 0 )
                 # parse treatment
                 action = []
                 for item in treat:
-                    field = item.split(":")
-                    action.append( {field[0]:field[1]} )
+                    field = item.split( ":" )
+                    action.append( { field[ 0 ]: field[ 1 ] } )
                 # create the treatment field and add the actions
-                treatment = {"treatment": {"action":sorted(action)} }
+                treatment = { "treatment": { "action": sorted( action ) } }
                 # parse the rest of the flow
                 for item in parsedFlow:
-                    field = item.split("=")
-                    jsonFlow.update( {field[0]:field[1]} )
+                    field = item.split( "=" )
+                    jsonFlow.update( { field[ 0 ]: field[ 1 ] } )
                 # add the treatment and the selector to the json flow
                 jsonFlow.update( selector )
                 jsonFlow.update( treatment )
                 jsonFlow.update( flag )
 
-                if debug: main.log.debug( "\033[94mJson flow:\033[0m\n{}\n".format(jsonFlow) )
+                if debug:
+                    main.log.debug( "\033[94mJson flow:\033[0m\n{}\n".format( jsonFlow ) )
 
                 # add the json flow to the json flow table
                 jsonFlowTable.append( jsonFlow )
@@ -2532,23 +2532,24 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def getFlowTable( self, sw, version="", debug=False):
-        '''
-        Discription: Returns the flow table(s) on a switch or switches in a list.
+    def getFlowTable( self, sw, version="", debug=False ):
+        """
+        Discription: Returns the flow table( s ) on a switch or switches in a list.
             Each element is a flow.
         Arguments:
             Required:
-                sw: The switch name ("s1") to retrive the flow table. Can also be
+                sw: The switch name ( "s1" ) to retrive the flow table. Can also be
                     a list of switches.
             Optional:
                 version: The version of OpenFlow. Currently, 1.3 and 1.0 are supported.
                 debug: prints out the final result
-        '''
+        """
         try:
             switches = []
-            if type(sw) is list:
-                switches.extend(sw)
-            else: switches.append(sw)
+            if isinstance( sw, list ):
+                switches.extend( sw )
+            else:
+                switches.append( sw )
 
             flows = []
             for s in switches:
@@ -2568,10 +2569,11 @@
                 # the first element is the command that was sent
                 # the second is the table header
                 # the last element is empty
-                response = response[2:-1]
+                response = response[ 2:-1 ]
                 flows.extend( response )
 
-            if debug: print "Flows:\n{}\n\n".format(flows)
+            if debug:
+                print "Flows:\n{}\n\n".format( flows )
 
             return self.parseFlowTable( flows, version, debug )
 
@@ -2583,11 +2585,11 @@
             main.cleanAndExit()
 
     def checkFlowId( self, sw, flowId, version="1.3", debug=True ):
-        '''
+        """
         Discription: Checks whether the ID provided matches a flow ID in Mininet
         Arguments:
             Required:
-                sw: The switch name ("s1") to retrive the flow table. Can also be
+                sw: The switch name ( "s1" ) to retrive the flow table. Can also be
                     a list of switches.
                 flowId: the flow ID in hex format. Can also be a list of IDs
             Optional:
@@ -2595,17 +2597,18 @@
                 debug: prints out the final result
         returns: main.TRUE if all IDs are present, otherwise returns main.FALSE
         NOTE: prints out IDs that are not present
-        '''
+        """
         try:
             main.log.info( "Getting flows from Mininet" )
             flows = self.getFlowTable( sw, version, debug )
-            if flows == None:
+            if flows is None:
                 return main.ERROR
 
-            if debug: print "flow ids:\n{}\n\n".format(flowId)
+            if debug:
+                print "flow ids:\n{}\n\n".format( flowId )
 
             # Check flowId is a list or a string
-            if type( flowId ) is str:
+            if isinstance( flowId, str ):
                 result = False
                 for f in flows:
                     if flowId in f.get( 'cookie' ):
@@ -2619,7 +2622,8 @@
                 # Save the IDs that are not in Mininet
                 absentIds = [ x for x in flowId if x not in mnFlowIds ]
 
-                if debug: print "mn flow ids:\n{}\n\n".format(mnFlowIds)
+                if debug:
+                    print "mn flow ids:\n{}\n\n".format( mnFlowIds )
 
                 # Print out the IDs that are not in Mininet
                 if absentIds:
@@ -2636,7 +2640,6 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-
     def startTcpdump( self, filename, intf="eth0", port="port 6653" ):
         """
            Runs tpdump on an interface and saves the file
@@ -2701,8 +2704,8 @@
             self.handle.sendline( "" )
             self.handle.expect( "mininet>" )
         except pexpect.TIMEOUT:
-            main.log.error(self.name + ": TIMEOUT exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": TIMEOUT exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -2783,7 +2786,7 @@
                 for line in response.split( "\n" ):
                     # Regex patterns to parse 'ovs-ofctl dump-ports-desc' output
                     # Example port:
-                    # 1(s1-eth1): addr:ae:60:72:77:55:51
+                    # 1( s1-eth1 ): addr:ae:60:72:77:55:51
                     pattern = "(?P<index>\d+)\((?P<name>[^-]+-eth(?P<port>\d+))\):\saddr:(?P<mac>([a-f0-9]{2}:){5}[a-f0-9]{2})"
                     result = re.search( pattern, line )
                     if result:
@@ -2883,7 +2886,7 @@
             dump = self.dump().split( "\n" )
             hosts = {}
             for line in dump:
-                if "Host" in line :
+                if "Host" in line:
                     result = re.search( hostRE, line )
                     name = result.group( 'name' )
                     interfaces = []
@@ -2945,11 +2948,11 @@
         """
         try:
             self.update()
-            response = self.links(timeout=timeout).split( '\n' )
+            response = self.links( timeout=timeout ).split( '\n' )
 
             # Examples:
-            # s1-eth3<->s2-eth1 (OK OK)
-            # s13-eth3<->h27-eth0 (OK OK)
+            # s1-eth3<->s2-eth1 ( OK OK )
+            # s13-eth3<->h27-eth0 ( OK OK )
             linkRE = "(?P<node1>[\w]+)\-eth(?P<port1>[\d]+)\<\-\>" +\
                      "(?P<node2>[\w]+)\-eth(?P<port2>[\d]+)"
             links = []
@@ -3268,11 +3271,11 @@
                     main.log.info( output )
             return hostResults
         except pexpect.EOF:
-            main.log.error(self.name + ": EOF exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
         except Exception:
-            main.log.exception(self.name + ": Uncaught exception!")
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
     def getHostsOld( self ):
@@ -3301,8 +3304,8 @@
 
             return hostList
         except pexpect.TIMEOUT:
-            main.log.error(self.name + ": TIMEOUT exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": TIMEOUT exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -3344,7 +3347,7 @@
             nodesList = nodesStr.split( "," )
 
             nodesSet = set( nodesList )
-            # discarding default controller(s) node
+            # discarding default controller( s ) node
             nodesSet.discard( 'c0' )
             nodesSet.discard( 'c1' )
             nodesSet.discard( 'c2' )
@@ -3354,8 +3357,8 @@
 
             return switchList
         except pexpect.TIMEOUT:
-            main.log.error(self.name + ": TIMEOUT exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": TIMEOUT exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -3374,7 +3377,7 @@
           vertex2: { 'edges': ..., 'name': ..., 'protocol': ... } }
         Each vertex should at least have an 'edges' attribute which describes the
         adjacency information. The value of 'edges' attribute is also represented by
-        a dictionary, which maps each edge (identified by the neighbor vertex) to a
+        a dictionary, which maps each edge ( identified by the neighbor vertex ) to a
         list of attributes.
         An example of the edges dictionary:
         'edges': { vertex2: { 'port': ..., 'weight': ... },
@@ -3382,7 +3385,7 @@
         If useId == True, dpid/mac will be used instead of names to identify
         vertices, which is helpful when e.g. comparing Mininet topology with ONOS
         topology.
-        If includeHost == True, all hosts (and host-switch links) will be included
+        If includeHost == True, all hosts ( and host-switch links ) will be included
         in topology data.
         Note that link or switch that are brought down by 'link x x down' or 'switch
         x down' commands still show in the output of Mininet CLI commands such as
@@ -3411,7 +3414,7 @@
                     # Get port index from OVS
                     # The index extracted from port name may be inconsistent with ONOS
                     portIndex = -1
-                    if not nodeName1 in portDict.keys():
+                    if nodeName1 not in portDict.keys():
                         portList = self.getOVSPorts( nodeName1 )
                         if len( portList ) == 0:
                             main.log.warn( self.name + ": No port found on switch " + nodeName1 )
@@ -3430,21 +3433,21 @@
                     else:
                         node1 = nodeName1
                         node2 = nodeName2
-                    if not node1 in graphDict.keys():
+                    if node1 not in graphDict.keys():
                         if useId:
-                            graphDict[ node1 ] = { 'edges':{},
-                                                   'dpid':switches[ nodeName1 ][ 'dpid' ],
-                                                   'name':nodeName1,
-                                                   'ports':switches[ nodeName1 ][ 'ports' ],
-                                                   'swClass':switches[ nodeName1 ][ 'swClass' ],
-                                                   'pid':switches[ nodeName1 ][ 'pid' ],
-                                                   'options':switches[ nodeName1 ][ 'options' ] }
+                            graphDict[ node1 ] = { 'edges': {},
+                                                   'dpid': switches[ nodeName1 ][ 'dpid' ],
+                                                   'name': nodeName1,
+                                                   'ports': switches[ nodeName1 ][ 'ports' ],
+                                                   'swClass': switches[ nodeName1 ][ 'swClass' ],
+                                                   'pid': switches[ nodeName1 ][ 'pid' ],
+                                                   'options': switches[ nodeName1 ][ 'options' ] }
                         else:
-                            graphDict[ node1 ] = { 'edges':{} }
+                            graphDict[ node1 ] = { 'edges': {} }
                     else:
                         # Assert node2 is not connected to any current links of node1
                         assert node2 not in graphDict[ node1 ][ 'edges' ].keys()
-                    graphDict[ node1 ][ 'edges' ][ node2 ] = { 'port':portIndex }
+                    graphDict[ node1 ][ 'edges' ][ node2 ] = { 'port': portIndex }
                     # Swap two nodes/ports
                     nodeName1, nodeName2 = nodeName2, nodeName1
                     port1, port2 = port2, port1
@@ -3482,8 +3485,8 @@
 
             return main.TRUE
         except pexpect.TIMEOUT:
-            main.log.error(self.name + ": TIMEOUT exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": TIMEOUT exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -3543,8 +3546,8 @@
 
                 return main.TRUE
             except pexpect.TIMEOUT:
-                main.log.error(self.name + ": TIMEOUT exception found")
-                main.log.error(self.name + ":     " + self.handle.before)
+                main.log.error( self.name + ": TIMEOUT exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
                 main.cleanAndExit()
             except pexpect.EOF:
                 main.log.error( self.name + ": EOF exception found" )
@@ -3570,8 +3573,8 @@
             getattr( main, name )
         except AttributeError:
             # namespace is clear, creating component
-            main.componentDictionary[name] = main.componentDictionary[self.name].copy()
-            main.componentDictionary[name]['connect_order'] = str( int( main.componentDictionary[name]['connect_order'] ) + 1 )
+            main.componentDictionary[ name ] = main.componentDictionary[ self.name ].copy()
+            main.componentDictionary[ name ][ 'connect_order' ] = str( int( main.componentDictionary[ name ][ 'connect_order' ] ) + 1 )
             main.componentInit( name )
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -3604,7 +3607,7 @@
             # Delete component
             delattr( main, name )
             # Delete component from ComponentDictionary
-            del( main.componentDictionary[name] )
+            del( main.componentDictionary[ name ] )
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":     " + self.handle.before )
@@ -3640,8 +3643,7 @@
             main.cleanAndExit()
 
     def changeInterfaceStatus( self, devicename, intf, status ):
-        '''
-
+        """
         Args:
             devicename: switch name
             intf: port name on switch
@@ -3649,30 +3651,29 @@
 
         Returns: boolean to show success change status
 
-        '''
+        """
         if status == "down" or status == "up":
             try:
                 cmd = devicename + " ifconfig " + intf + " " + status
                 self.handle.sendline( cmd )
-                self.handle.expect("mininet>")
+                self.handle.expect( "mininet>" )
                 return main.TRUE
             except pexpect.TIMEOUT:
-                main.log.exception(self.name + ": Command timed out")
+                main.log.exception( self.name + ": Command timed out" )
                 return main.FALSE
             except pexpect.EOF:
-                main.log.exception(self.name + ": connection closed.")
+                main.log.exception( self.name + ": connection closed." )
                 main.cleanAndExit()
             except TypeError:
-                main.log.exception(self.name + ": TypeError")
+                main.log.exception( self.name + ": TypeError" )
                 main.cleanAndExit()
             except Exception:
-                main.log.exception(self.name + ": Uncaught exception!")
+                main.log.exception( self.name + ": Uncaught exception!" )
                 main.cleanAndExit()
         else:
-            main.log.warn("Interface status should be up or down!")
+            main.log.warn( "Interface status should be up or down!" )
             return main.FALSE
 
 
-
 if __name__ != "__main__":
     sys.modules[ __name__ ] = MininetCliDriver()
diff --git a/TestON/drivers/common/cli/emulator/poxclidriver.py b/TestON/drivers/common/cli/emulator/poxclidriver.py
index de7a7c3..ec22d0b 100644
--- a/TestON/drivers/common/cli/emulator/poxclidriver.py
+++ b/TestON/drivers/common/cli/emulator/poxclidriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 26-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -45,7 +45,7 @@
         self.wrapped = sys.modules[ __name__ ]
 
     def connect( self, **connectargs ):
-        #,user_name, ip_address, pwd,options ):
+        # user_name, ip_address, pwd,options ):
         """
           this subroutine is to launch pox controller . It must have arguments as :
           user_name  = host name ,
diff --git a/TestON/drivers/common/cli/emulator/remotemininetdriver.py b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
index 71de94c..6deca9a 100644
--- a/TestON/drivers/common/cli/emulator/remotemininetdriver.py
+++ b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 26-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -56,7 +56,7 @@
             self.name = self.options[ 'name' ]
 
             try:
-                if os.getenv( str( self.ip_address ) ) != None:
+                if os.getenv( str( self.ip_address ) ) is not None:
                     self.ip_address = os.getenv( str( self.ip_address ) )
                 else:
                     main.log.info( self.name +
@@ -152,7 +152,7 @@
             self.handle.expect( self.prompt )
             return main.TRUE
         except TypeError:
-            main.log.exception(self.name + ": Object not as expected")
+            main.log.exception( self.name + ": Object not as expected" )
             return main.FALSE
         except pexpect.TIMEOUT:
             main.log.exception( self.name + ": TIMEOUT exception found in pingLong" )
@@ -166,7 +166,6 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-
     def pingstatus( self, **pingParams ):
         """
         Tails the respective ping output file and check that
@@ -203,7 +202,7 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
         except Exception:
-            main.log.exception(self.name + ": Uncaught exception!")
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
     def pingKill( self, testONUser, testONIP ):
@@ -262,11 +261,11 @@
             main.log.error( self.name + ":    " + self.handle.before )
             return main.FALSE
         except pexpect.EOF:
-            main.log.error(self.name + ": EOF exception found")
-            main.log.error(self.name + ":    " + self.handle.before)
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
             main.cleanAndExit()
         except Exception:
-            main.log.exception(self.name + ": Uncaught exception!")
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
     def pingHostOptical( self, **pingParams ):
@@ -336,11 +335,11 @@
                 main.lastResult = main.FALSE
                 return main.FALSE
         except pexpect.EOF:
-            main.log.error(self.name + ": EOF exception found")
-            main.log.error(self.name + ":    " + self.handle.before)
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
             main.cleanAndExit()
         except Exception:
-            main.log.exception(self.name + ": Uncaught exception!")
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
     def checknum( self, num ):
@@ -407,7 +406,7 @@
             self.handle.sendline( "" )
             self.handle.sendline( "" )
             i = self.handle.expect( [ 'No\ssuch\device', 'listening\son',
-                                    pexpect.TIMEOUT, self.prompt ], timeout=10 )
+                                      pexpect.TIMEOUT, self.prompt ], timeout=10 )
             main.log.info( self.handle.before + self.handle.after )
             if i == 0:
                 main.log.error( self.name + ": tcpdump - No such device exists.\
@@ -458,9 +457,9 @@
                 It runs python script "opticalTest.py" to create the
                 packet layer( mn ) and optical topology
             Optional:
-                name - Name of onos directory. (ONOS | onos)
+                name - Name of onos directory. ( ONOS | onos )
             Required:
-                ctrllerIP = Controller(s) IP address
+                ctrllerIP = Controller( s ) IP address
             TODO: If no ctrllerIP is provided, a default
                 $OC1 can be accepted
         """
@@ -468,15 +467,15 @@
             self.handle.sendline( "" )
             self.handle.expect( self.prompt )
             self.handle.sendline( "cd ~/" + name + "/tools/test/topos" )
-            self.handle.expect( "topos"+ self.prompt )
-            if ctrllerIP == None:
+            self.handle.expect( "topos" + self.prompt )
+            if ctrllerIP is None:
                 main.log.info( "You need to specify the IP" )
                 return main.FALSE
             else:
                 controller = ''
                 if isinstance( ctrllerIP, types.ListType ):
                     for i in xrange( len( ctrllerIP ) ):
-                        controller += ctrllerIP[i] + ' '
+                        controller += ctrllerIP[ i ] + ' '
                     main.log.info( "Mininet topology is being loaded with " +
                                    "controllers: " + controller )
                 elif isinstance( ctrllerIP, types.StringType ):
@@ -489,10 +488,10 @@
                 cmd = "sudo -E python opticalTest.py " + controller
                 main.log.info( self.name + ": cmd = " + cmd )
                 self.handle.sendline( cmd )
-                time.sleep(30)
+                time.sleep( 30 )
                 self.handle.sendline( "" )
                 self.handle.sendline( "" )
-                self.handle.expect("mininet>")
+                self.handle.expect( "mininet>" )
                 return main.TRUE
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -503,7 +502,7 @@
         """
             Since executing opticalTest.py will give you mininet
             prompt, you would at some point require to get onto
-            console of LincOE ((linc@onosTestBench)1>) to execute
+            console of LincOE ( ( linc@onosTestBench )1> ) to execute
             commands like bring a optical port up or down on a ROADM
             You can attach to console of Linc-OE session by a cmd:
             sudo ~/linc-oe/rel/linc/bin/linc attach
@@ -536,7 +535,7 @@
                 elif i == 1:
                     self.handle.sendline( "exit" )
                     self.handle.expect( "exit" )
-                    self.handle.expect(self.prompt)
+                    self.handle.expect( self.prompt )
                     self.handle.sendline( "exit" )
                     self.handle.expect( "exit" )
                     self.handle.expect( "closed" )
@@ -548,11 +547,11 @@
             main.log.error( self.name + ":    " + self.handle.before )
             return main.FALSE
         except pexpect.EOF:
-            main.log.error(self.name + ": EOF exception found")
-            main.log.error(self.name + ":    " + self.handle.before)
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
             main.cleanAndExit()
         except Exception:
-            main.log.exception(self.name + ": Uncaught exception!")
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
     def setIpTablesOUTPUT( self, dstIp, dstPort, action='add',
diff --git a/TestON/drivers/common/cli/emulatordriver.py b/TestON/drivers/common/cli/emulatordriver.py
index f63a49f..9bfd648 100644
--- a/TestON/drivers/common/cli/emulatordriver.py
+++ b/TestON/drivers/common/cli/emulatordriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 26-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -26,6 +26,7 @@
 """
 from drivers.common.clidriver import CLI
 
+
 class Emulator( CLI ):
     # The common functions for emulator included in emulatordriver
 
diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
old mode 100755
new mode 100644
index ba63b82..56e728b
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -2,7 +2,7 @@
 
 """
 OCT 13 2014
-Copyright 2014 Open Networking Foundation (ONF)
+Copyright 2014 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -11,7 +11,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,7 +21,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This driver enters the onos> prompt to issue commands.
 
@@ -47,6 +46,7 @@
 from cStringIO import StringIO
 from itertools import izip
 
+
 class OnosCliDriver( CLI ):
 
     def __init__( self ):
@@ -61,10 +61,11 @@
         self.graph = Graph()
         super( OnosCliDriver, self ).__init__()
 
-    def checkOptions(self, var, defaultVar):
+    def checkOptions( self, var, defaultVar ):
         if var is None or var == "":
             return defaultVar
         return var
+
     def connect( self, **connectargs ):
         """
         Creates ssh handle for ONOS cli.
@@ -81,9 +82,9 @@
                 elif key == "karaf_password":
                     self.karafPass = self.options[ key ]
 
-            self.home = self.checkOptions(self.home, "~/onos")
-            self.karafUser = self.checkOptions(self.karafUser, self.user_name)
-            self.karafPass = self.checkOptions(self.karafPass, self.pwd )
+            self.home = self.checkOptions( self.home, "~/onos" )
+            self.karafUser = self.checkOptions( self.karafUser, self.user_name )
+            self.karafPass = self.checkOptions( self.karafPass, self.pwd )
 
             for key in self.options:
                 if key == 'onosIp':
@@ -163,7 +164,7 @@
         """
         Sends 'logout' command to ONOS cli
         Returns main.TRUE if exited CLI and
-                main.FALSE on timeout (not guranteed you are disconnected)
+                main.FALSE on timeout ( not guranteed you are disconnected )
                 None on TypeError
                 Exits test on unknown error or pexpect exits unexpectedly
         """
@@ -227,12 +228,12 @@
                 # Expect the cellname in the ONOSCELL variable.
                 # Note that this variable name is subject to change
                 #   and that this driver will have to change accordingly
-                self.handle.expect(str(cellname))
+                self.handle.expect( str( cellname ) )
                 handleBefore = self.handle.before
                 handleAfter = self.handle.after
                 # Get the rest of the handle
-                self.handle.sendline("")
-                self.handle.expect(self.prompt)
+                self.handle.sendline( "" )
+                self.handle.expect( self.prompt )
                 handleMore = self.handle.before
 
                 main.log.info( "Cell call returned: " + handleBefore +
@@ -272,7 +273,7 @@
             # Check if we are already in the cli
             self.handle.sendline( "" )
             x = self.handle.expect( [
-                self.prompt, "onos>" ], commandlineTimeout)
+                self.prompt, "onos>" ], commandlineTimeout )
             if x == 1:
                 main.log.info( "ONOS cli is already running" )
                 return main.TRUE
@@ -351,11 +352,10 @@
         Note: karafTimeout is left as str so that this could be read
         and passed to startOnosCli from PARAMS file as str.
         """
-
         try:
             self.handle.sendline( "" )
             x = self.handle.expect( [
-                self.prompt, "onos>" ], commandlineTimeout)
+                self.prompt, "onos>" ], commandlineTimeout )
 
             if x == 1:
                 main.log.info( "ONOS cli is already running" )
@@ -478,7 +478,7 @@
             self.handle.sendline( "" )
             i = self.handle.expect( [ "onos>", self.prompt, pexpect.TIMEOUT ] )
             if i == 1:
-                main.log.error( self.name + ": onos cli session closed. ")
+                main.log.error( self.name + ": onos cli session closed. " )
                 if self.onosIp:
                     main.log.warn( "Trying to reconnect " + self.onosIp )
                     reconnectResult = self.startOnosCli( self.onosIp )
@@ -504,12 +504,12 @@
                 self.log( logStr, noExit=noExit )
             self.handle.sendline( cmdStr )
             if dollarSign:
-                i = self.handle.expect( ["onos>"], timeout )
+                i = self.handle.expect( [ "onos>" ], timeout )
             else:
-                i = self.handle.expect( ["onos>", self.prompt], timeout )
+                i = self.handle.expect( [ "onos>", self.prompt ], timeout )
             response = self.handle.before
             # TODO: do something with i
-            main.log.info( "Command '" + str( cmdStr ) + "' sent to "
+            main.log.info( "Command '" + str(cmdStr) + "' sent to "
                            + self.name + "." )
             if debug:
                 main.log.debug( self.name + ": Raw output" )
@@ -523,7 +523,7 @@
                 main.log.debug( self.name + ": " + repr( response ) )
 
             # Remove extra return chars that get added
-            response = re.sub(  r"\s\r", "", response )
+            response = re.sub( r"\s\r", "", response )
             if debug:
                 main.log.debug( self.name + ": Removed extra returns " +
                                 "from output" )
@@ -541,7 +541,7 @@
                 main.log.debug( self.name + ": split output" )
                 for r in output:
                     main.log.debug( self.name + ": " + repr( r ) )
-            output = output[1].strip()
+            output = output[ 1 ].strip()
             if showResponse:
                 main.log.info( "Response from ONOS: {}".format( output ) )
             return output
@@ -647,7 +647,7 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def nodes( self, jsonFormat=True):
+    def nodes( self, jsonFormat=True ):
         """
         List the nodes currently visible
         Issues command: 'nodes'
@@ -794,7 +794,7 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def checkMasters( self, jsonFormat=True  ):
+    def checkMasters( self, jsonFormat=True ):
         """
             Returns the output of the masters command.
             Optional argument:
@@ -852,7 +852,7 @@
                     main.log.info( "\n" + self.checkMasters( False ) )
                     return main.FALSE
             main.log.info( "Mastership balanced between " +
-                           str( len(masters) ) + " masters" )
+                           str( len( masters ) ) + " masters" )
             return main.TRUE
         except ( TypeError, ValueError ):
             main.log.exception( "{}: Object not as expected: {!r}".format( self.name, mastersOutput ) )
@@ -1186,9 +1186,9 @@
             else:
                 main.log.info( "Host intent installed between " +
                                str( hostIdOne ) + " and " + str( hostIdTwo ) )
-                match = re.search('id=0x([\da-f]+),', handle)
+                match = re.search( 'id=0x([\da-f]+),', handle )
                 if match:
-                    return match.group()[3:-1]
+                    return match.group()[ 3:-1 ]
                 else:
                     main.log.error( "Error, intent ID not found" )
                     main.log.debug( "Response from ONOS was: " +
@@ -1234,9 +1234,9 @@
                 main.log.info( "Optical intent installed between " +
                                str( ingressDevice ) + " and " +
                                str( egressDevice ) )
-                match = re.search('id=0x([\da-f]+),', handle)
+                match = re.search( 'id=0x([\da-f]+),', handle )
                 if match:
-                    return match.group()[3:-1]
+                    return match.group()[ 3:-1 ]
                 else:
                     main.log.error( "Error, intent ID not found" )
                     return None
@@ -1374,9 +1374,9 @@
                 main.log.info( "Point-to-point intent installed between " +
                                str( ingressDevice ) + " and " +
                                str( egressDevice ) )
-                match = re.search('id=0x([\da-f]+),', handle)
+                match = re.search( 'id=0x([\da-f]+),', handle )
                 if match:
-                    return match.group()[3:-1]
+                    return match.group()[ 3:-1 ]
                 else:
                     main.log.error( "Error, intent ID not found" )
                     return None
@@ -1532,9 +1532,9 @@
                                 "intent" )
                 return None
             else:
-                match = re.search('id=0x([\da-f]+),', handle)
+                match = re.search( 'id=0x([\da-f]+),', handle )
                 if match:
-                    return match.group()[3:-1]
+                    return match.group()[ 3:-1 ]
                 else:
                     main.log.error( "Error, intent ID not found" )
                     return None
@@ -1691,9 +1691,9 @@
                                 "intent" )
                 return None
             else:
-                match = re.search('id=0x([\da-f]+),', handle)
+                match = re.search( 'id=0x([\da-f]+),', handle )
                 if match:
-                    return match.group()[3:-1]
+                    return match.group()[ 3:-1 ]
                 else:
                     main.log.error( "Error, intent ID not found" )
                     return None
@@ -1729,7 +1729,7 @@
             tcpDst="",
             ingressLabel="",
             egressLabel="",
-            priority=""):
+            priority="" ):
         """
         Required:
             * ingressDevice: device id of ingress device
@@ -1824,9 +1824,9 @@
                 main.log.info( "MPLS intent installed between " +
                                str( ingressDevice ) + " and " +
                                str( egressDevice ) )
-                match = re.search('id=0x([\da-f]+),', handle)
+                match = re.search( 'id=0x([\da-f]+),', handle )
                 if match:
-                    return match.group()[3:-1]
+                    return match.group()[ 3:-1 ]
                 else:
                     main.log.error( "Error, intent ID not found" )
                     return None
@@ -2000,7 +2000,7 @@
             assert handle is not None, "Error in sendline"
             assert "Command not found:" not in handle, handle
             jsonResult = json.loads( handle )
-            return len(jsonResult['routes4'])
+            return len( jsonResult[ 'routes4' ] )
         except AssertionError:
             main.log.exception( "" )
             return None
@@ -2015,8 +2015,8 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    #=============Function to check Bandwidth allocation========
-    def allocations( self, jsonFormat = True, dollarSign = True ):
+    # =============Function to check Bandwidth allocation========
+    def allocations( self, jsonFormat=True, dollarSign=True ):
         """
         Description:
             Obtain Bandwidth Allocation Information from ONOS cli.
@@ -2043,7 +2043,7 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def intents( self, jsonFormat = True, summary = False, **intentargs):
+    def intents( self, jsonFormat=True, summary=False, **intentargs ):
         """
         Description:
             Obtain intents from the ONOS cli.
@@ -2091,22 +2091,21 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def getIntentState(self, intentsId, intentsJson=None):
+    def getIntentState( self, intentsId, intentsJson=None ):
         """
         Description:
-            Gets intent state. Accepts a single intent ID (string type) or a
+            Gets intent state. Accepts a single intent ID ( string type ) or a
             list of intent IDs.
         Parameters:
             intentsId: intent ID, both string type and list type are acceptable
             intentsJson: parsed json object from the onos:intents api
         Returns:
-            Returns the state (string type) of the ID if a single intent ID is
+            Returns the state ( string type ) of the ID if a single intent ID is
             accepted.
             Returns a list of dictionaries if a list of intent IDs is accepted,
             and each dictionary maps 'id' to the Intent ID and 'state' to
             corresponding intent state.
         """
-
         try:
             state = "State is Undefined"
             if not intentsJson:
@@ -2157,7 +2156,7 @@
         Required:
             intentsId - List of intents ID to be checked
         Optional:
-            expectedState - Check the expected state(s) of each intents
+            expectedState - Check the expected state( s ) of each intents
                             state in the list.
                             *NOTE: You can pass in a list of expected state,
                             Eg: expectedState = [ 'INSTALLED' , 'INSTALLING' ]
@@ -2169,15 +2168,15 @@
             returnValue = main.TRUE
             # Generating a dictionary: intent id as a key and state as value
 
-            #intentsDict = self.getIntentState( intentsId )
+            # intentsDict = self.getIntentState( intentsId )
             intentsDict = []
             for intent in json.loads( self.intents() ):
-                if isinstance ( intentsId, types.StringType) \
-                        and intent.get('id') == intentsId:
-                    intentsDict.append(intent)
-                elif isinstance ( intentsId, types.ListType ) \
+                if isinstance( intentsId, types.StringType ) \
+                        and intent.get( 'id' ) == intentsId:
+                    intentsDict.append( intent )
+                elif isinstance( intentsId, types.ListType ) \
                         and any( intent.get( 'id' ) == ids for ids in intentsId ):
-                            intentsDict.append(intent)
+                    intentsDict.append( intent )
 
             if not intentsDict:
                 main.log.info( self.name + ": There is something wrong " +
@@ -2248,10 +2247,10 @@
                 expected = expected.rstrip()
                 main.log.debug( "Expect: {}\nactual: {}".format( expected, actual ) )
                 if actual != expected and 'allocated' in actual and 'allocated' in expected:
-                    marker1 = actual.find('allocated')
-                    m1 = actual[:marker1]
-                    marker2 = expected.find('allocated')
-                    m2 = expected[:marker2]
+                    marker1 = actual.find( 'allocated' )
+                    m1 = actual[ :marker1 ]
+                    marker2 = expected.find( 'allocated' )
+                    m2 = expected[ :marker2 ]
                     if m1 != m2:
                         bandwidthFailed = True
                 elif actual != expected and 'allocated' not in actual and 'allocated' not in expected:
@@ -2260,7 +2259,7 @@
             ONOSOutput.close()
 
             if bandwidthFailed:
-                main.log.error("Bandwidth not allocated correctly using Intents!!")
+                main.log.error( "Bandwidth not allocated correctly using Intents!!" )
                 returnValue = main.FALSE
             return returnValue
         except TypeError:
@@ -2338,7 +2337,6 @@
             Returns main.TRUE only if the number of all installed intents are the same as total intents number
             , otherwise, returns main.FALSE.
         """
-
         try:
             cmd = "intents -s -j"
 
@@ -2350,10 +2348,10 @@
 
             # get total and installed number, see if they are match
             allState = response.get( 'all' )
-            if allState.get('total') == allState.get('installed'):
-                main.log.info( 'Total Intents: {}   Installed Intents: {}'.format( allState.get('total'), allState.get('installed') ) )
+            if allState.get( 'total' ) == allState.get( 'installed' ):
+                main.log.info( 'Total Intents: {}   Installed Intents: {}'.format( allState.get( 'total' ), allState.get( 'installed' ) ) )
                 return main.TRUE
-            main.log.info( 'Verified Intents failed Excepte intetnes: {} installed intents: {}'.format( allState.get('total'), allState.get('installed') ) )
+            main.log.info( 'Verified Intents failed Excepte intetnes: {} installed intents: {}'.format( allState.get( 'total' ), allState.get( 'installed' ) ) )
             return main.FALSE
 
         except ( TypeError, ValueError ):
@@ -2415,7 +2413,7 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def checkFlowCount(self, min=0, timeout=60 ):
+    def checkFlowCount( self, min=0, timeout=60 ):
         count = self.getTotalFlowsNum( timeout=timeout )
         count = int( count ) if count else 0
         return count if ( count > min ) else False
@@ -2435,11 +2433,11 @@
                           parameter is set true, return main.FALSE otherwise.
         """
         try:
-            states = ["PENDING_ADD", "PENDING_REMOVE", "REMOVED", "FAILED"]
+            states = [ "PENDING_ADD", "PENDING_REMOVE", "REMOVED", "FAILED" ]
             checkedStates = []
-            statesCount = [0, 0, 0, 0]
+            statesCount = [ 0, 0, 0, 0 ]
             for s in states:
-                rawFlows = self.flows( state=s, timeout = timeout )
+                rawFlows = self.flows( state=s, timeout=timeout )
                 if rawFlows:
                     # if we didn't get flows or flows function return None, we should return
                     # main.Flase
@@ -2447,19 +2445,19 @@
                 else:
                     return main.FALSE
             for i in range( len( states ) ):
-                for c in checkedStates[i]:
+                for c in checkedStates[ i ]:
                     try:
-                        statesCount[i] += int( c.get( "flowCount" ) )
+                        statesCount[ i ] += int( c.get( "flowCount" ) )
                     except TypeError:
                         main.log.exception( "Json object not as expected" )
-                main.log.info( states[i] + " flows: " + str( statesCount[i] ) )
+                main.log.info( states[ i ] + " flows: " + str( statesCount[ i ] ) )
 
             # We want to count PENDING_ADD if isPENDING is true
             if isPENDING:
-                if statesCount[1] + statesCount[2] + statesCount[3] > 0:
+                if statesCount[ 1 ] + statesCount[ 2 ] + statesCount[ 3 ] > 0:
                     return main.FALSE
             else:
-                if statesCount[0] + statesCount[1] + statesCount[2] + statesCount[3] > 0:
+                if statesCount[ 0 ] + statesCount[ 1 ] + statesCount[ 2 ] + statesCount[ 3 ] > 0:
                     return main.FALSE
             return main.TRUE
         except ( TypeError, ValueError ):
@@ -2481,7 +2479,7 @@
             main.cleanAndExit()
 
     def pushTestIntents( self, ingress, egress, batchSize, offset="",
-                         options="", timeout=10, background = False, noExit=False, getResponse=False ):
+                         options="", timeout=10, background=False, noExit=False, getResponse=False ):
         """
         Description:
             Push a number of intents in a batch format to
@@ -2548,18 +2546,17 @@
             The number of ADDED flows
             Or return None if any exceptions
         """
-
         try:
             # get total added flows number
             cmd = "flows -c added"
             rawFlows = self.sendline( cmd, timeout=timeout, noExit=noExit )
             if rawFlows:
-                rawFlows = rawFlows.split("\n")
+                rawFlows = rawFlows.split( "\n" )
                 totalFlows = 0
                 for l in rawFlows:
-                    totalFlows += int(l.split("Count=")[1])
+                    totalFlows += int( l.split( "Count=" )[ 1 ] )
             else:
-                main.log.error("Response not as expected!")
+                main.log.error( "Response not as expected!" )
                 return None
             return totalFlows
 
@@ -2581,7 +2578,7 @@
                 main.cleanAndExit()
             return None
 
-    def getTotalIntentsNum( self, timeout=60, noExit = False ):
+    def getTotalIntentsNum( self, timeout=60, noExit=False ):
         """
         Description:
             Get the total number of intents, include every states.
@@ -2596,7 +2593,7 @@
             if response is None:
                 return -1
             response = json.loads( response )
-            return int( response.get("intents") )
+            return int( response.get( "intents" ) )
         except ( TypeError, ValueError ):
             main.log.exception( "{}: Object not as expected: {!r}".format( self.name, response ) )
             return None
@@ -2690,7 +2687,7 @@
         """
         try:
             # Obtain output of intents function
-            intentsStr = self.intents(jsonFormat=True)
+            intentsStr = self.intents( jsonFormat=True )
             if intentsStr is None:
                 raise TypeError
             # Convert to a dictionary
@@ -2800,7 +2797,7 @@
                 main.log.info( "There are no nodes to get id from" )
                 return idList
             nodesJson = json.loads( nodesStr )
-            idList = [ node.get('id') for node in nodesJson ]
+            idList = [ node.get( 'id' ) for node in nodesJson ]
             return idList
         except ( TypeError, ValueError ):
             main.log.exception( "{}: Object not as expected: {!r}".format( self.name, nodesStr ) )
@@ -2852,7 +2849,7 @@
         import json
         try:
             # either onos:topology or 'topology' will work in CLI
-            topology = json.loads(topologyOutput)
+            topology = json.loads( topologyOutput )
             main.log.debug( topology )
             return topology
         except ( TypeError, ValueError ):
@@ -2866,7 +2863,7 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def checkStatus(self, numoswitch, numolink, numoctrl = -1, logLevel="info"):
+    def checkStatus( self, numoswitch, numolink, numoctrl=-1, logLevel="info" ):
         """
         Checks the number of switches & links that ONOS sees against the
         supplied values. By default this will report to main.log, but the
@@ -3225,7 +3222,7 @@
         Returns a dictionary containing the current intent states and the count
         """
         try:
-            intents = self.intents( )
+            intents = self.intents()
             states = []
             for intent in json.loads( intents ):
                 states.append( intent.get( 'state', None ) )
@@ -3301,7 +3298,7 @@
 
     def specificLeaderCandidate( self, topic ):
         """
-        Returns a list in format [leader,candidate1,candidate2,...] for a given
+        Returns a list in format [ leader,candidate1,candidate2,... ] for a given
         topic parameter and an empty list if the topic doesn't exist
         If no leader is elected leader in the returned list will be "none"
         Returns None if there is a type error processing the json object
@@ -3314,9 +3311,9 @@
             output = json.loads( rawOutput )
             results = []
             for dict in output:
-                if dict["topic"] == topic:
-                    leader = dict["leader"]
-                    candidates = re.split( ", ", dict["candidates"][1:-1] )
+                if dict[ "topic" ] == topic:
+                    leader = dict[ "leader" ]
+                    candidates = re.split( ", ", dict[ "candidates" ][ 1:-1 ] )
                     results.append( leader )
                     results.extend( candidates )
             return results
@@ -3405,10 +3402,10 @@
         information about installed ONOS applications
         """
         # Sample JSON object
-        # [{"name":"org.onosproject.openflow","id":0,"version":"1.2.0",
+        # [ { "name":"org.onosproject.openflow","id":0,"version":"1.2.0",
         # "description":"ONOS OpenFlow protocol southbound providers",
         # "origin":"ON.Lab","permissions":"[]","featuresRepo":"",
-        # "features":"[onos-openflow]","state":"ACTIVE"}]
+        # "features":"[onos-openflow]","state":"ACTIVE" } ]
         try:
             cmdStr = "onos:apps"
             if summary:
@@ -3455,8 +3452,8 @@
             appsJson = json.loads( output )
             state = None
             for app in appsJson:
-                if appName == app.get('name'):
-                    state = app.get('state')
+                if appName == app.get( 'name' ):
+                    state = app.get( 'state' )
                     break
             if state == "ACTIVE" or state == "INSTALLED":
                 return state
@@ -3508,7 +3505,7 @@
                 # Invalid option
                 main.log.error( "The ONOS app command argument only takes " +
                                 "the values: (activate|deactivate|uninstall)" +
-                                "; was given '" + option + "'")
+                                "; was given '" + option + "'" )
                 return main.FALSE
             cmdStr = "onos:app " + option + " " + appName
             output = self.sendline( cmdStr )
@@ -3566,7 +3563,7 @@
             if status == "INSTALLED":
                 response = self.app( appName, "activate" )
                 if check and response == main.TRUE:
-                    for i in range(10):  # try 10 times then give up
+                    for i in range( 10 ):  # try 10 times then give up
                         status = self.appStatus( appName )
                         if status == "ACTIVE":
                             return main.TRUE
@@ -3619,7 +3616,7 @@
             elif status == "ACTIVE":
                 response = self.app( appName, "deactivate" )
                 if check and response == main.TRUE:
-                    for i in range(10):  # try 10 times then give up
+                    for i in range( 10 ):  # try 10 times then give up
                         status = self.appStatus( appName )
                         if status == "INSTALLED":
                             return main.TRUE
@@ -3668,7 +3665,7 @@
             if status == "INSTALLED":
                 response = self.app( appName, "uninstall" )
                 if check and response == main.TRUE:
-                    for i in range(10):  # try 10 times then give up
+                    for i in range( 10 ):  # try 10 times then give up
                         status = self.appStatus( appName )
                         if status == "UNINSTALLED":
                             return main.TRUE
@@ -3683,7 +3680,7 @@
                                 "currently active." )
                 response = self.app( appName, "uninstall" )
                 if check and response == main.TRUE:
-                    for i in range(10):  # try 10 times then give up
+                    for i in range( 10 ):  # try 10 times then give up
                         status = self.appStatus( appName )
                         if status == "UNINSTALLED":
                             return main.TRUE
@@ -3788,8 +3785,8 @@
                     # there is more than one app with this ID
                     result = main.FALSE
                     # We will log this later in the method
-                elif not current[0][ 'name' ] == appName:
-                    currentName = current[0][ 'name' ]
+                elif not current[ 0 ][ 'name' ] == appName:
+                    currentName = current[ 0 ][ 'name' ]
                     result = main.FALSE
                     main.log.error( "'app-ids' has " + str( currentName ) +
                                     " registered under id:" + str( appID ) +
@@ -3804,12 +3801,12 @@
                 namesList.append( item[ 'name' ] )
             if len( idsList ) != len( set( idsList ) ) or\
                len( namesList ) != len( set( namesList ) ):
-                    main.log.error( "'app-ids' has some duplicate entries: \n"
-                                    + json.dumps( ids,
-                                                  sort_keys=True,
-                                                  indent=4,
-                                                  separators=( ',', ': ' ) ) )
-                    result = main.FALSE
+                main.log.error( "'app-ids' has some duplicate entries: \n"
+                                + json.dumps( ids,
+                                              sort_keys=True,
+                                              indent=4,
+                                              separators=( ',', ': ' ) ) )
+                result = main.FALSE
             return result
         except ( TypeError, ValueError ):
             main.log.exception( "{}: Object not as expected: {!r}".format( self.name, rawJson ) )
@@ -3880,7 +3877,7 @@
             propName - The case sensitive name of the property to be set/unset
         Optional arguments:
             value - The value to set the property to. If None, will unset the
-                    property and revert it to it's default value(if applicable)
+                    property and revert it to it's default value( if applicable )
             check - Boolean, Check whether the option was successfully set this
                     only applies when a value is given.
         returns:
@@ -3980,7 +3977,7 @@
         CLI command to add elements to a distributed set.
         Arguments:
             setName - The name of the set to add to.
-            values - The value(s) to add to the set, space seperated.
+            values - The value( s ) to add to the set, space seperated.
         Example usages:
             setTestAdd( "set1", "a b c" )
             setTestAdd( "set2", "1" )
@@ -3994,9 +3991,9 @@
             output = self.distPrimitivesSend( cmdStr )
             positiveMatch = "\[(.*)\] was added to the set " + str( setName )
             negativeMatch = "\[(.*)\] was already in set " + str( setName )
-            if re.search( positiveMatch, output):
+            if re.search( positiveMatch, output ):
                 return main.TRUE
-            elif re.search( negativeMatch, output):
+            elif re.search( negativeMatch, output ):
                 return main.FALSE
             else:
                 main.log.error( self.name + ": setTestAdd did not" +
@@ -4015,11 +4012,11 @@
         CLI command to remove elements from a distributed set.
         Required arguments:
             setName - The name of the set to remove from.
-            values - The value(s) to remove from the set, space seperated.
+            values - The value( s ) to remove from the set, space seperated.
         Optional arguments:
             clear - Clear all elements from the set
-            retain - Retain only the  given values. (intersection of the
-                     original set and the given set)
+            retain - Retain only the  given values. ( intersection of the
+                     original set and the given set )
         returns:
             main.TRUE on success OR
             main.FALSE if the set was not changed OR
@@ -4079,7 +4076,7 @@
         Required arguments:
             setName - The name of the set to remove from.
         Optional arguments:
-            values - The value(s) to check if in the set, space seperated.
+            values - The value( s ) to check if in the set, space seperated.
         returns:
             main.ERROR on error OR
             A list of elements in the set if no optional arguments are
@@ -4558,8 +4555,8 @@
             None on Error
 
             Example output
-            { 'Key1': {'oldValue': 'oldTestValue', 'value': 'Testing'},
-              'Key2': {'value': 'Testing'} }
+            { 'Key1': { 'oldValue': 'oldTestValue', 'value': 'Testing' },
+              'Key2': { 'value': 'Testing' } }
         """
         try:
             numKeys = str( numKeys )
@@ -4649,10 +4646,10 @@
 
     def setSwController( self, uri, ip, proto="tcp", port="6653", jsonFormat=True ):
         """
-        Descrition: sets the controller(s) for the specified device
+        Descrition: sets the controller( s ) for the specified device
 
         Parameters:
-            Required: uri - String: The uri of the device(switch).
+            Required: uri - String: The uri of the device( switch ).
                       ip - String or List: The ip address of the controller.
                       This parameter can be formed in a couple of different ways.
                         VALID:
@@ -4677,14 +4674,14 @@
                 cmd += " -j"
             cmd += " " + uri
             if isinstance( ip, str ):
-                ip = [ip]
+                ip = [ ip ]
             for item in ip:
                 if ":" in item:
                     sitem = item.split( ":" )
-                    if len(sitem) == 3:
+                    if len( sitem ) == 3:
                         cmd += " " + item
-                    elif "." in sitem[1]:
-                        cmd += " {}:{}".format(item, port)
+                    elif "." in sitem[ 1 ]:
+                        cmd += " {}:{}".format( item, port )
                     else:
                         main.log.error( "Malformed entry: " + item )
                         raise TypeError
@@ -4712,19 +4709,19 @@
             main.cleanAndExit()
 
     def removeDevice( self, device ):
-        '''
+        """
         Description:
-            Remove a device from ONOS by passing the uri of the device(s).
+            Remove a device from ONOS by passing the uri of the device( s ).
         Parameters:
-            device - (str or list) the id or uri of the device ex. "of:0000000000000001"
+            device - ( str or list ) the id or uri of the device ex. "of:0000000000000001"
         Returns:
             Returns main.FALSE if an exception is thrown or an error is present
             in the response. Otherwise, returns main.TRUE.
         NOTE:
             If a host cannot be removed, then this function will return main.FALSE
-        '''
+        """
         try:
-            if type( device ) is str:
+            if isinstance( device, str ):
                 deviceStr = device
                 device = []
                 device.append( deviceStr )
@@ -4753,19 +4750,19 @@
             main.cleanAndExit()
 
     def removeHost( self, host ):
-        '''
+        """
         Description:
-            Remove a host from ONOS by passing the id of the host(s)
+            Remove a host from ONOS by passing the id of the host( s )
         Parameters:
-            hostId - (str or list) the id or mac of the host ex. "00:00:00:00:00:01"
+            hostId - ( str or list ) the id or mac of the host ex. "00:00:00:00:00:01"
         Returns:
             Returns main.FALSE if an exception is thrown or an error is present
             in the response. Otherwise, returns main.TRUE.
         NOTE:
             If a host cannot be removed, then this function will return main.FALSE
-        '''
+        """
         try:
-            if type( host ) is str:
+            if isinstance( host, str ):
                 host = list( host )
 
             for h in host:
@@ -4792,16 +4789,16 @@
             main.cleanAndExit()
 
     def link( self, begin, end, state, timeout=30, showResponse=True ):
-        '''
+        """
         Description:
             Bring link down or up in the null-provider.
         params:
-            begin - (string) One end of a device or switch.
-            end - (string) the other end of the device or switch
+            begin - ( string ) One end of a device or switch.
+            end - ( string ) the other end of the device or switch
         returns:
             main.TRUE if no exceptions were thrown and no Errors are
             present in the resoponse. Otherwise, returns main.FALSE
-        '''
+        """
         try:
             cmd = "null-link null:{} null:{} {}".format( begin, end, state )
             response = self.sendline( cmd, showResponse=showResponse, timeout=timeout )
@@ -4826,18 +4823,18 @@
             main.cleanAndExit()
 
     def portstate( self, dpid, port, state ):
-        '''
+        """
         Description:
              Changes the state of port in an OF switch by means of the
              PORTSTATUS OF messages.
         params:
-            dpid - (string) Datapath ID of the device. Ex: 'of:0000000000000102'
-            port - (string) target port in the device. Ex: '2'
-            state - (string) target state (enable or disable)
+            dpid - ( string ) Datapath ID of the device. Ex: 'of:0000000000000102'
+            port - ( string ) target port in the device. Ex: '2'
+            state - ( string ) target state ( enable or disable )
         returns:
             main.TRUE if no exceptions were thrown and no Errors are
             present in the resoponse. Otherwise, returns main.FALSE
-        '''
+        """
         try:
             state = state.lower()
             assert state == 'enable' or state == 'disable', "Unknown state"
@@ -4900,12 +4897,12 @@
           vertex2: { 'edges': ..., 'name': ..., 'protocol': ... } }
         Each vertex should at least have an 'edges' attribute which describes the
         adjacency information. The value of 'edges' attribute is also represented by
-        a dictionary, which maps each edge (identified by the neighbor vertex) to a
+        a dictionary, which maps each edge ( identified by the neighbor vertex ) to a
         list of attributes.
         An example of the edges dictionary:
         'edges': { vertex2: { 'port': ..., 'weight': ... },
                    vertex3: { 'port': ..., 'weight': ... } }
-        If includeHost == True, all hosts (and host-switch links) will be included
+        If includeHost == True, all hosts ( and host-switch links ) will be included
         in topology data.
         """
         graphDict = {}
@@ -4926,7 +4923,7 @@
                 assert idToDevice[ nodeA ][ 'available' ] and idToDevice[ nodeB ][ 'available' ]
                 if nodeA not in graphDict.keys():
                     graphDict[ nodeA ] = { 'edges': {},
-                                           'dpid': idToDevice[ nodeA ][ 'id' ][3:],
+                                           'dpid': idToDevice[ nodeA ][ 'id' ][ 3: ],
                                            'type': idToDevice[ nodeA ][ 'type' ],
                                            'available': idToDevice[ nodeA ][ 'available' ],
                                            'role': idToDevice[ nodeA ][ 'role' ],
@@ -4935,7 +4932,7 @@
                                            'sw': idToDevice[ nodeA ][ 'sw' ],
                                            'serial': idToDevice[ nodeA ][ 'serial' ],
                                            'chassisId': idToDevice[ nodeA ][ 'chassisId' ],
-                                           'annotations': idToDevice[ nodeA ][ 'annotations' ]}
+                                           'annotations': idToDevice[ nodeA ][ 'annotations' ] }
                 else:
                     # Assert nodeB is not connected to any current links of nodeA
                     assert nodeB not in graphDict[ nodeA ][ 'edges' ].keys()
@@ -4961,11 +4958,11 @@
             return None
 
     def getIntentPerfSummary( self ):
-        '''
+        """
         Send command to check intent-perf summary
         Returns: dictionary for intent-perf summary
                  if something wrong, function will return None
-        '''
+        """
         cmd = "intent-perf -s"
         respDic = {}
         resp = self.sendline( cmd )
@@ -4977,9 +4974,9 @@
                 # Delete any white space in line
                 temp = re.sub( r'\s+', '', l )
                 temp = temp.split( ":" )
-                respDic[ temp[0] ] = temp[ 1 ]
+                respDic[ temp[ 0 ] ] = temp[ 1 ]
 
-        except (TypeError, ValueError):
+        except ( TypeError, ValueError ):
             main.log.exception( self.name + ": Object not as expected" )
             return None
         except KeyError:
@@ -5021,7 +5018,7 @@
                 total: return how many lines in karaf log
         """
         try:
-            assert type( searchTerm ) is str
+            assert isinstance( searchTerm, str )
             # Build the log paths string
             logPath = '/opt/onos/log/karaf.log.'
             logPaths = '/opt/onos/log/karaf.log'
@@ -5043,14 +5040,14 @@
                 return num
             elif mode == 'total':
                 totalLines = self.sendline( "cat /opt/onos/log/karaf.log | wc -l" )
-                return int(totalLines)
+                return int( totalLines )
             else:
                 main.log.error( self.name + " unsupported mode" )
                 return main.ERROR
             before = self.sendline( cmd )
             before = before.splitlines()
             # make sure the returned list only contains the search term
-            returnLines = [line for line in before if searchTerm in line]
+            returnLines = [ line for line in before if searchTerm in line ]
             return returnLines
         except AssertionError:
             main.log.error( self.name + " searchTerm is not string type" )
@@ -5096,7 +5093,7 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanAndExit()
         except NotImplementedError:
-            main.log.exception( self.name + ": Json output not supported")
+            main.log.exception( self.name + ": Json output not supported" )
             return None
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
@@ -5118,7 +5115,7 @@
             for match in mIter:
                 item = {}
                 item[ 'name' ] = match.group( 'name' )
-                ifaces = match.group( 'interfaces' ).split( ', ')
+                ifaces = match.group( 'interfaces' ).split( ', ' )
                 if ifaces == [ "" ]:
                     ifaces = []
                 item[ 'interfaces' ] = ifaces
@@ -5158,7 +5155,7 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanAndExit()
         except NotImplementedError:
-            main.log.exception( self.name + ": Json output not supported")
+            main.log.exception( self.name + ": Json output not supported" )
             return None
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
@@ -5390,14 +5387,14 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanAndExit()
         except NotImplementedError:
-            main.log.exception( self.name + ": Json output not supported")
+            main.log.exception( self.name + ": Json output not supported" )
             return None
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
     def getTimeStampFromLog( self, mode, searchTerm, splitTerm_before, splitTerm_after, startLine='', logNum=1 ):
-        '''
+        """
         Get the timestamp of searchTerm from karaf log.
 
         Arguments:
@@ -5410,17 +5407,17 @@
 
             others:
                 Please look at the "logsearch" Function in onosclidriver.py
-        '''
+        """
         if logNum < 0:
-            main.log.error("Get wrong log number ")
+            main.log.error( "Get wrong log number " )
             return main.ERROR
         lines = self.logSearch( mode=mode, searchTerm=searchTerm, startLine=startLine, logNum=logNum )
-        if len(lines) == 0:
+        if len( lines ) == 0:
             main.log.warn( "Captured timestamp string is empty" )
             return main.ERROR
         lines = lines[ 0 ]
         try:
-            assert type(lines) is str
+            assert isinstance( lines, str )
             # get the target value
             line = lines.split( splitTerm_before )
             key = line[ 1 ].split( splitTerm_after )
@@ -5588,7 +5585,7 @@
                 return None
             else:
                 match = re.search( pattern, output )
-                return match.group(0)
+                return match.group( 0 )
         except ( AttributeError, TypeError ):
             main.log.exception( self.name + ": Object not as expected; " + str( output ) )
             return None
@@ -5621,7 +5618,7 @@
                 return None
             else:
                 match = re.search( pattern, output )
-                return match.group(0)
+                return match.group( 0 )
         except ( AttributeError, TypeError ):
             main.log.exception( self.name + ": Object not as expected; " + str( output ) )
             return None
@@ -5654,7 +5651,7 @@
                 return None
             else:
                 match = re.search( pattern, output )
-                return match.group(0)
+                return match.group( 0 )
         except ( AttributeError, TypeError ):
             main.log.exception( self.name + ": Object not as expected; " + str( output ) )
             return None
@@ -5708,4 +5705,4 @@
             main.cleanAndExit()
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
-            main.cleanAndExit()
\ No newline at end of file
+            main.cleanAndExit()
diff --git a/TestON/drivers/common/cli/onosclusterdriver.py b/TestON/drivers/common/cli/onosclusterdriver.py
old mode 100755
new mode 100644
index 5093cfe..cc32b94
--- a/TestON/drivers/common/cli/onosclusterdriver.py
+++ b/TestON/drivers/common/cli/onosclusterdriver.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 """
-Copyright 2017 Open Networking Foundation (ONF)
+Copyright 2017 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -9,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -33,11 +33,15 @@
 from drivers.common.clidriver import CLI
 
 # FIXME: Move this to it's own file?
+
+
 class Controller():
+
     def __str__( self ):
         return self.name
+
     def __repr__( self ):
-        #TODO use repr() for components?
+        # TODO: use repr() for components?
         return "%s<IP=%s, CLI=%s, REST=%s, Bench=%s >" % ( self.name,
                                                            self.ipAddress,
                                                            self.CLI,
@@ -47,9 +51,9 @@
     def __getattr__( self, name ):
         """
         Called when an attribute lookup has not found the attribute
-        in the usual places (i.e. it is not an instance attribute nor
-        is it found in the class tree for self). name is the attribute
-        name. This method should return the (computed) attribute value
+        in the usual places ( i.e. it is not an instance attribute nor
+        is it found in the class tree for self ). name is the attribute
+        name. This method should return the ( computed ) attribute value
         or raise an AttributeError exception.
 
         We will look into each of the node's component handles to try to find the attreibute, looking at REST first
@@ -59,28 +63,26 @@
             main.log.warn( "Rest driver has attribute '%s'" % ( name ) )
             if not usedDriver:
                 usedDriver = True
-                main.log.debug("Using Rest driver's attribute for '%s'" % (name))
-                f = getattr( self.REST, name)
+                main.log.debug( "Using Rest driver's attribute for '%s'" % ( name ) )
+                f = getattr( self.REST, name )
         if hasattr( self.CLI, name ):
             main.log.warn( "CLI driver has attribute '%s'" % ( name ) )
             if not usedDriver:
                 usedDriver = True
-                main.log.debug("Using CLI driver's attribute for '%s'" % (name))
-                f = getattr( self.CLI, name)
+                main.log.debug( "Using CLI driver's attribute for '%s'" % ( name ) )
+                f = getattr( self.CLI, name )
         if hasattr( self.Bench, name ):
             main.log.warn( "Bench driver has attribute '%s'" % ( name ) )
             if not usedDriver:
                 usedDriver = True
-                main.log.debug("Using Bench driver's attribute for '%s'" % (name))
-                f = getattr( self.Bench, name)
+                main.log.debug( "Using Bench driver's attribute for '%s'" % ( name ) )
+                f = getattr( self.Bench, name )
         if usedDriver:
             return f
         raise AttributeError( "Could not find the attribute %s in %r or it's component handles" % ( name, self ) )
 
-
-
     def __init__( self, name, ipAddress, CLI=None, REST=None, Bench=None, pos=None, userName=None, server=None ):
-        #TODO: validate these arguments
+        # TODO: validate these arguments
         self.name = str( name )
         self.ipAddress = ipAddress
         self.CLI = CLI
@@ -92,6 +94,7 @@
         self.user_name = userName
         self.server = server
 
+
 class OnosClusterDriver( CLI ):
 
     def __init__( self ):
@@ -131,9 +134,9 @@
                 elif key == "cluster_name":
                     prefix = self.options[ key ]
 
-            self.home = self.checkOptions(self.home, "~/onos")
-            self.karafUser = self.checkOptions(self.karafUser, self.user_name)
-            self.karafPass = self.checkOptions(self.karafPass, self.pwd )
+            self.home = self.checkOptions( self.home, "~/onos" )
+            self.karafUser = self.checkOptions( self.karafUser, self.user_name )
+            self.karafPass = self.checkOptions( self.karafPass, self.pwd )
             prefix = self.checkOptions( prefix, "ONOS" )
 
             self.name = self.options[ 'name' ]
@@ -246,13 +249,13 @@
         """
         Parse the cluster options to create an ONOS cli component with the given name
         """
-        main.componentDictionary[name] = main.componentDictionary[self.name].copy()
+        main.componentDictionary[ name ] = main.componentDictionary[ self.name ].copy()
         clihost = main.componentDictionary[ name ][ 'COMPONENTS' ].get( "diff_clihost", "" )
         if clihost == "True":
             main.componentDictionary[ name ][ 'host' ] = host
-        main.componentDictionary[name]['type'] = "OnosCliDriver"
-        main.componentDictionary[name]['connect_order'] = str( int( main.componentDictionary[name]['connect_order'] ) + 1 )
-        main.log.debug( main.componentDictionary[name] )
+        main.componentDictionary[ name ][ 'type' ] = "OnosCliDriver"
+        main.componentDictionary[ name ][ 'connect_order' ] = str( int( main.componentDictionary[ name ][ 'connect_order' ] ) + 1 )
+        main.log.debug( main.componentDictionary[ name ] )
 
     def createCliComponent( self, name, host ):
         """
@@ -286,18 +289,18 @@
         """
         Parse the cluster options to create an ONOS cli component with the given name
         """
-        main.componentDictionary[name] = main.componentDictionary[self.name].copy()
-        main.log.debug( main.componentDictionary[name] )
-        user = main.componentDictionary[name]['COMPONENTS'].get( "web_user", "onos" )
-        main.componentDictionary[name]['user'] = self.checkOptions( user, "onos" )
-        password = main.componentDictionary[name]['COMPONENTS'].get( "web_pass", "rocks" )
-        main.componentDictionary[name]['pass'] = self.checkOptions( password, "rocks" )
-        main.componentDictionary[name]['host'] = host
-        port = main.componentDictionary[name]['COMPONENTS'].get( "rest_port", "8181" )
-        main.componentDictionary[name]['port'] = self.checkOptions( port, "8181" )
-        main.componentDictionary[name]['type'] = "OnosRestDriver"
-        main.componentDictionary[name]['connect_order'] = str( int( main.componentDictionary[name]['connect_order'] ) + 1 )
-        main.log.debug( main.componentDictionary[name] )
+        main.componentDictionary[ name ] = main.componentDictionary[ self.name ].copy()
+        main.log.debug( main.componentDictionary[ name ] )
+        user = main.componentDictionary[ name ][ 'COMPONENTS' ].get( "web_user", "onos" )
+        main.componentDictionary[ name ][ 'user' ] = self.checkOptions( user, "onos" )
+        password = main.componentDictionary[ name ][ 'COMPONENTS' ].get( "web_pass", "rocks" )
+        main.componentDictionary[ name ][ 'pass' ] = self.checkOptions( password, "rocks" )
+        main.componentDictionary[ name ][ 'host' ] = host
+        port = main.componentDictionary[ name ][ 'COMPONENTS' ].get( "rest_port", "8181" )
+        main.componentDictionary[ name ][ 'port' ] = self.checkOptions( port, "8181" )
+        main.componentDictionary[ name ][ 'type' ] = "OnosRestDriver"
+        main.componentDictionary[ name ][ 'connect_order' ] = str( int( main.componentDictionary[ name ][ 'connect_order' ] ) + 1 )
+        main.log.debug( main.componentDictionary[ name ] )
 
     def createRestComponent( self, name, ipAddress ):
         """
@@ -331,12 +334,12 @@
         """
         Parse the cluster options to create an ONOS "bench" component with the given name
         """
-        main.componentDictionary[name] = main.componentDictionary[self.name].copy()
-        main.componentDictionary[name]['type'] = "OnosDriver"
-        home = main.componentDictionary[name]['COMPONENTS'].get( "onos_home", None )
-        main.componentDictionary[name]['home'] = self.checkOptions( home, None )
-        main.componentDictionary[name]['connect_order'] = str( int( main.componentDictionary[name]['connect_order'] ) + 1 )
-        main.log.debug( main.componentDictionary[name] )
+        main.componentDictionary[ name ] = main.componentDictionary[ self.name ].copy()
+        main.componentDictionary[ name ][ 'type' ] = "OnosDriver"
+        home = main.componentDictionary[ name ][ 'COMPONENTS' ].get( "onos_home", None )
+        main.componentDictionary[ name ][ 'home' ] = self.checkOptions( home, None )
+        main.componentDictionary[ name ][ 'connect_order' ] = str( int( main.componentDictionary[ name ][ 'connect_order' ] ) + 1 )
+        main.log.debug( main.componentDictionary[ name ] )
 
     def createBenchComponent( self, name ):
         """
@@ -366,7 +369,6 @@
             main.log.error( name + " component already exists!" )
             main.cleanAndExit()
 
-
     def setServerOptions( self, name, ipAddress ):
         """
         Parse the cluster options to create an ONOS "server" component with the given name
@@ -383,7 +385,6 @@
         main.componentDictionary[name]['connect_order'] = str( int( main.componentDictionary[name]['connect_order'] ) + 1 )
         main.log.debug( main.componentDictionary[name] )
 
-
     def createServerComponent( self, name, ipAddress ):
         """
         Creates a new onos "server" component. This will be connected to the
@@ -414,7 +415,6 @@
             main.log.error( name + " component already exists!" )
             main.cleanAndExit()
 
-
     def createComponents( self, prefix='', createServer=True ):
         """
         Creates a CLI and REST component for each nodes in the cluster
@@ -425,7 +425,7 @@
         benchPrefix = prefix + "bench"
         serverPrefix = prefix + "server"
         for i in xrange( 1, self.maxNodes + 1 ):
-            cliName = cliPrefix + str( i  )
+            cliName = cliPrefix + str( i )
             restName = restPrefix + str( i )
             benchName = benchPrefix + str( i )
             serverName = serverPrefix + str( i )
diff --git a/TestON/drivers/common/cli/onosdriver.py b/TestON/drivers/common/cli/onosdriver.py
old mode 100755
new mode 100644
index eed4057..dadc78d
--- a/TestON/drivers/common/cli/onosdriver.py
+++ b/TestON/drivers/common/cli/onosdriver.py
@@ -30,6 +30,7 @@
 from requests.models import Response
 from drivers.common.clidriver import CLI
 
+
 class OnosDriver( CLI ):
 
     def __init__( self ):
@@ -72,10 +73,9 @@
                     break
                 self.maxNodes = None
 
-            if self.maxNodes == None or self.maxNodes == "":
+            if self.maxNodes is None or self.maxNodes == "":
                 self.maxNodes = 100
 
-
             # Grabs all OC environment variables based on max number of nodes
             self.onosIps = {}  # Dictionary of all possible ONOS ip
 
@@ -110,7 +110,7 @@
                 main.log.error( "Uncaught exception: " + str( inst ) )
 
             try:
-                if os.getenv( str( self.ip_address ) ) != None:
+                if os.getenv( str( self.ip_address ) ) is not None:
                     self.ip_address = os.getenv( str( self.ip_address ) )
                 else:
                     main.log.info( self.name +
@@ -172,7 +172,7 @@
         Returns milliseconds since epoch
 
         When checking multiple nodes in a for loop,
-        around a hundred milliseconds of difference (ascending) is
+        around a hundred milliseconds of difference ( ascending ) is
         generally acceptable due to calltime of the function.
         Few seconds, however, is not and it means clocks
         are off sync.
@@ -213,7 +213,7 @@
                     ret = main.FALSE
                     continue  # expect again
                 elif i == 2:
-                    # File(s) not found
+                    # File( s ) not found
                     main.log.error( "onos-package could not find a file or directory" )
                     ret = main.FALSE
                     continue  # expect again
@@ -305,7 +305,7 @@
                     'Runtime\sEnvironment\sto\scontinue',
                     'BUILD\sFAILURE',
                     'BUILD\sSUCCESS',
-                    'onos' + self.prompt,  #TODO: fix this to be more generic?
+                    'onos' + self.prompt,  # TODO: fix this to be more generic?
                     'ONOS' + self.prompt,
                     pexpect.TIMEOUT ], mciTimeout )
                 if i == 0:
@@ -417,7 +417,7 @@
             self.handle.expect( self.prompt )
             cmd = "git pull"
             if comp1 != "":
-                cmd += ' ' +  comp1
+                cmd += ' ' + comp1
             if fastForward:
                 cmd += ' ' + " --ff-only"
             self.handle.sendline( cmd )
@@ -498,7 +498,7 @@
                     self.handle.expect( self.prompt )
                     return main.ERROR
                 except Exception:
-                    main.log.exception( "Couldn't exit editor prompt!")
+                    main.log.exception( "Couldn't exit editor prompt!" )
 
                     main.cleanAndExit()
             elif i == 10:  # In the middle of a merge commit
@@ -652,11 +652,11 @@
             self.handle.sendline( "git name-rev --name-only HEAD" )
             self.handle.expect( "git name-rev --name-only HEAD" )
             self.handle.expect( self.prompt )
-            lines =  self.handle.before.splitlines()
-            if lines[1] == "master" or re.search( "^onos-\d+(\.\d+)+$", lines[1] ):
-                return lines[1]
+            lines = self.handle.before.splitlines()
+            if lines[ 1 ] == "master" or re.search( "^onos-\d+(\.\d+)+$", lines[ 1 ] ):
+                return lines[ 1 ]
             else:
-                main.log.info( lines[1] )
+                main.log.info( lines[ 1 ] )
                 return "unexpected ONOS branch"
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -702,11 +702,11 @@
                     # as xml specific tags that cause errors
                     line = line.replace( "<", "[" )
                     line = line.replace( ">", "]" )
-                    #main.log.wiki( "\t" + line )
+                    # main.log.wiki( "\t" + line )
                     main.log.wiki( line + "<br /> " )
                     main.log.summary( line )
                 main.log.wiki( "</blockquote>" )
-                main.log.summary("\n")
+                main.log.summary( "\n" )
             return lines[ 2 ]
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -733,7 +733,7 @@
                   supported currently
             * ONOS IP addresses ( onosIpAddrs )
                 - Must be passed in as last arguments
-            * ONOS USER (onosUser)
+            * ONOS USER ( onosUser )
                 - optional argument to set ONOS_USER environment variable
 
         NOTE: Assumes cells are located at:
@@ -837,14 +837,14 @@
                 handleAfter = self.handle.after
                 # Get the rest of the handle
                 self.handle.expect( self.prompt )
-                time.sleep(10)
+                time.sleep( 10 )
                 handleMore = self.handle.before
 
                 cell_result = handleBefore + handleAfter + handleMore
-                #print cell_result
+                # print cell_result
                 if( re.search( "No such cell", cell_result ) ):
                     main.log.error( "Cell call returned: " + handleBefore +
-                               handleAfter + handleMore )
+                                    handleAfter + handleMore )
 
                     main.cleanAndExit()
                 return main.TRUE
@@ -886,7 +886,7 @@
         Uses 'onos <node-ip> cfg set' to change a parameter value of an
         application.
 
-        ex)
+        ex )
             onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
         ONOSIp = '10.0.0.1'
         configName = 'org.onosproject.myapp'
@@ -899,11 +899,11 @@
             self.handle.sendline( "" )
             self.handle.expect( ":~" )
             self.handle.sendline( cfgStr )
-            self.handle.expect("cfg set")
+            self.handle.expect( "cfg set" )
             self.handle.expect( ":~" )
 
-            paramValue = configParam.split(" ")[1]
-            paramName = configParam.split(" ")[0]
+            paramValue = configParam.split( " " )[ 1 ]
+            paramName = configParam.split( " " )[ 0 ]
 
             checkStr = 'onos {} cfg get " {} {} " '.format( ONOSIp, configName, paramName )
 
@@ -911,7 +911,7 @@
             self.handle.expect( ":~" )
 
             if "value=" + paramValue + "," in self.handle.before:
-                main.log.info("cfg " + configName + " successfully set to " + configParam)
+                main.log.info( "cfg " + configName + " successfully set to " + configParam )
                 return main.TRUE
         except pexpect.ExceptionPexpect as e:
             main.log.exception( self.name + ": Pexpect exception found: " )
@@ -967,7 +967,7 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def onosSecureSSH( self, userName="onos", userPWD="rocks", node=""):
+    def onosSecureSSH( self, userName="onos", userPWD="rocks", node="" ):
         """
         Enables secure access to ONOS console
         by removing default users & keys.
@@ -976,7 +976,6 @@
 
         Returns: main.TRUE on success and main.FALSE on failure
         """
-
         try:
             self.handle.sendline( "" )
             self.handle.expect( self.prompt )
@@ -985,9 +984,9 @@
             # NOTE: this timeout may need to change depending on the network
             # and size of ONOS
             # TODO: Handle the other possible error
-            i = self.handle.expect([ "Network\sis\sunreachable",
-                                     self.prompt,
-                                     pexpect.TIMEOUT ], timeout=180 )
+            i = self.handle.expect( [ "Network\sis\sunreachable",
+                                      self.prompt,
+                                      pexpect.TIMEOUT ], timeout=180 )
             if i == 0:
                 # can't reach ONOS node
                 main.log.warn( "Network is unreachable" )
@@ -996,8 +995,8 @@
             elif i == 1:
                 # Process started
                 main.log.info(
-                "Secure SSH performed on " +
-                node)
+                    "Secure SSH performed on " +
+                    node )
                 return main.TRUE
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -1007,7 +1006,6 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-
     def onosInstall( self, options="-f", node="" ):
         """
         Installs ONOS bits on the designated cell machine.
@@ -1329,7 +1327,7 @@
     def isup( self, node="", timeout=240 ):
         """
         Run's onos-wait-for-start which only returns once ONOS is at run
-        level 100(ready for use)
+        level 100( ready for use )
 
         Returns: main.TRUE if ONOS is running and main.FALSE on timeout
         """
@@ -1337,7 +1335,7 @@
             self.handle.sendline( "onos-wait-for-start " + node )
             self.handle.expect( "onos-wait-for-start" )
             # NOTE: this timeout is arbitrary"
-            i = self.handle.expect([self.prompt, pexpect.TIMEOUT], timeout)
+            i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ], timeout )
             if i == 0:
                 main.log.info( self.name + ": " + node + " is up" )
                 return main.TRUE
@@ -1376,7 +1374,6 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-
     def pushTestIntentsShell(
             self,
             dpidSrc,
@@ -1518,7 +1515,7 @@
             self.handle.expect( self.prompt )
             self.handle.sendline( "" )
             if grepOptions:
-                grepStr = "grep "+str(grepOptions)
+                grepStr = "grep " + str( grepOptions )
             else:
                 grepStr = "grep"
 
@@ -1527,12 +1524,12 @@
                 str( interface ) +
                 " -t e | " +
                 grepStr + " --line-buffered \"" +
-                str(grep) +
+                str( grep ) +
                 "\" >" +
                 directory +
                 " &" )
-            self.handle.sendline(cmd)
-            main.log.info(cmd)
+            self.handle.sendline( cmd )
+            main.log.info( cmd )
             self.handle.expect( "Capturing on" )
             self.handle.sendline( "\n" )
             self.handle.expect( self.prompt )
@@ -1600,7 +1597,7 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def dumpONOSCmd(self, ONOSIp, CMD, destDir, filename, options=""):
+    def dumpONOSCmd( self, ONOSIp, CMD, destDir, filename, options="" ):
         """
         Dump Cmd to a desired directory.
         For debugging purposes, you may want to use
@@ -1615,15 +1612,14 @@
             * fileName: Name of the file
             * options: Options for ONOS command
         """
-
         localtime = time.strftime( '%x %X' )
         localtime = localtime.replace( "/", "" )
         localtime = localtime.replace( " ", "_" )
         localtime = localtime.replace( ":", "" )
         if destDir[ -1: ] != "/":
             destDir += "/"
-        cmd=CMD + " " + options + " > " + str( destDir ) + str( filename ) + localtime
-        return self.onosCli(ONOSIp, cmd)
+        cmd = CMD + " " + options + " > " + str( destDir ) + str( filename ) + localtime
+        return self.onosCli( ONOSIp, cmd )
 
     def cpLogsToDir( self, logToCopy,
                      destDir, copyFileName="" ):
@@ -1678,7 +1674,7 @@
         except Exception:
             main.log.exception( "Copying files failed" )
 
-    def checkLogs( self, onosIp, restart=False):
+    def checkLogs( self, onosIp, restart=False ):
         """
         runs onos-check-logs on the given onos node
         If restart is True, use the old version of onos-check-logs which
@@ -1741,17 +1737,17 @@
                      direction='INPUT', rule='DROP', states=True ):
         """
         Description:
-            add or remove iptables rule to DROP (default) packets from
+            add or remove iptables rule to DROP ( default ) packets from
             specific IP and PORT
         Usage:
-        * specify action ('add' or 'remove')
+        * specify action ( 'add' or 'remove' )
           when removing, pass in the same argument as you would add. It will
           delete that specific rule.
         * specify the ip to block
-        * specify the destination port to block (defaults to all ports)
-        * optional packet type to block (default tcp)
-        * optional iptables rule (default DROP)
-        * optional direction to block (default 'INPUT')
+        * specify the destination port to block ( defaults to all ports )
+        * optional packet type to block ( default tcp )
+        * optional iptables rule ( default DROP )
+        * optional direction to block ( default 'INPUT' )
         * States boolean toggles adding all supported tcp states to the
           firewall rule
         Returns:
@@ -1762,7 +1758,6 @@
         * This function uses root privilege iptables command which may result
           in unwanted network errors. USE WITH CAUTION
         """
-
         # NOTE*********
         #   The strict checking methods of this driver function is intentional
         #   to discourage any misuse or error of iptables, which can cause
@@ -1804,14 +1799,13 @@
             cmd = "sudo iptables " + actionFlag + " " +\
                   direction +\
                   " -s " + str( ip )
-                  # " -p " + str( packet_type ) +\
             if packet_type:
                 cmd += " -p " + str( packet_type )
             if port:
                 cmd += " --dport " + str( port )
             if states:
                 cmd += " -m state --state="
-                #FIXME- Allow user to configure which states to block
+                # FIXME- Allow user to configure which states to block
                 cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
             cmd += " -j " + str( rule )
 
@@ -1840,10 +1834,10 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def detailed_status(self, log_filename):
+    def detailed_status( self, log_filename ):
         """
         This method is used by STS to check the status of the controller
-        Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
+        Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR ( and reason )
         """
         import re
         try:
@@ -1884,8 +1878,8 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount):
-        '''
+    def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount ):
+        """
             Create/formats the LinkGraph.cfg file based on arguments
                 -only creates a linear topology and connects islands
                 -evenly distributes devices
@@ -1894,115 +1888,113 @@
                 ONOSIpList - list of all of the node IPs to be used
 
                 deviceCount - number of switches to be assigned
-        '''
-        main.log.info("Creating link graph configuration file." )
+        """
+        main.log.info( "Creating link graph configuration file." )
         linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
         tempFile = "/tmp/linkGraph.cfg"
 
-        linkGraph = open(tempFile, 'w+')
-        linkGraph.write("# NullLinkProvider topology description (config file).\n")
-        linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
-        linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
+        linkGraph = open( tempFile, 'w+' )
+        linkGraph.write( "# NullLinkProvider topology description (config file).\n" )
+        linkGraph.write( "# The NodeId is only added if the destination is another node's device.\n" )
+        linkGraph.write( "# Bugs: Comments cannot be appended to a line to be read.\n" )
 
-        clusterCount = len(ONOSIpList)
+        clusterCount = len( ONOSIpList )
 
-        if type(deviceCount) is int or type(deviceCount) is str:
-            deviceCount = int(deviceCount)
-            switchList = [0]*(clusterCount+1)
-            baselineSwitchCount = deviceCount/clusterCount
+        if isinstance( deviceCount, int ) or isinstance( deviceCount, str ):
+            deviceCount = int( deviceCount )
+            switchList = [ 0 ] * ( clusterCount + 1 )
+            baselineSwitchCount = deviceCount / clusterCount
 
-            for node in range(1, clusterCount + 1):
-                switchList[node] = baselineSwitchCount
+            for node in range( 1, clusterCount + 1 ):
+                switchList[ node ] = baselineSwitchCount
 
-            for node in range(1, (deviceCount%clusterCount)+1):
-                switchList[node] += 1
+            for node in range( 1, ( deviceCount % clusterCount ) + 1 ):
+                switchList[ node ] += 1
 
-        if type(deviceCount) is list:
-            main.log.info("Using provided device distribution")
-            switchList = [0]
+        if isinstance( deviceCount, list ):
+            main.log.info( "Using provided device distribution" )
+            switchList = [ 0 ]
             for i in deviceCount:
-                switchList.append(int(i))
+                switchList.append( int( i ) )
 
-        tempList = ['0']
-        tempList.extend(ONOSIpList)
+        tempList = [ '0' ]
+        tempList.extend( ONOSIpList )
         ONOSIpList = tempList
 
         myPort = 6
         lastSwitch = 0
-        for node in range(1, clusterCount+1):
-            if switchList[node] == 0:
+        for node in range( 1, clusterCount + 1 ):
+            if switchList[ node ] == 0:
                 continue
 
-            linkGraph.write("graph " + ONOSIpList[node] + " {\n")
+            linkGraph.write( "graph " + ONOSIpList[ node ] + " {\n" )
 
             if node > 1:
-                #connect to last device on previous node
-                line = ("\t0:5 -> " + str(lastSwitch) + ":6:" + lastIp + "\n")     #ONOSIpList[node-1]
-                linkGraph.write(line)
+                # connect to last device on previous node
+                line = ( "\t0:5 -> " + str( lastSwitch ) + ":6:" + lastIp + "\n" )  # ONOSIpList[ node-1 ]
+                linkGraph.write( line )
 
             lastSwitch = 0
-            for switch in range (0, switchList[node]-1):
+            for switch in range( 0, switchList[ node ] - 1 ):
                 line = ""
-                line = ("\t" + str(switch) + ":" + str(myPort))
+                line = ( "\t" + str( switch ) + ":" + str( myPort ) )
                 line += " -- "
-                line += (str(switch+1) + ":" + str(myPort-1) + "\n")
-                linkGraph.write(line)
-                lastSwitch = switch+1
-            lastIp = ONOSIpList[node]
+                line += ( str( switch + 1 ) + ":" + str( myPort - 1 ) + "\n" )
+                linkGraph.write( line )
+                lastSwitch = switch + 1
+            lastIp = ONOSIpList[ node ]
 
-            #lastSwitch += 1
-            if node < (clusterCount):
-                #connect to first device on the next node
-                line = ("\t" + str(lastSwitch) + ":6 -> 0:5:" + ONOSIpList[node+1] + "\n")
-                linkGraph.write(line)
+            # lastSwitch += 1
+            if node < ( clusterCount ):
+                # connect to first device on the next node
+                line = ( "\t" + str( lastSwitch ) + ":6 -> 0:5:" + ONOSIpList[ node + 1 ] + "\n" )
+                linkGraph.write( line )
 
-            linkGraph.write("}\n")
+            linkGraph.write( "}\n" )
         linkGraph.close()
 
-        #SCP
-        os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath)
-        main.log.info("linkGraph.cfg creation complete")
+        # SCP
+        os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath )
+        main.log.info( "linkGraph.cfg creation complete" )
 
-    def configNullDev( self, ONOSIpList, deviceCount, numPorts=10):
-
-        '''
+    def configNullDev( self, ONOSIpList, deviceCount, numPorts=10 ):
+        """
             ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
             deviceCount = number of switches to distribute, or list of values to use as custom distribution
             numPorts = number of ports per device. Defaults to 10 both in this function and in ONOS. Optional arg
-        '''
-
-        main.log.info("Configuring Null Device Provider" )
-        clusterCount = len(ONOSIpList)
+        """
+        main.log.info( "Configuring Null Device Provider" )
+        clusterCount = len( ONOSIpList )
 
         try:
 
-            if type(deviceCount) is int or type(deviceCount) is str:
-                main.log.info("Creating device distribution")
-                deviceCount = int(deviceCount)
-                switchList = [0]*(clusterCount+1)
-                baselineSwitchCount = deviceCount/clusterCount
+            if isinstance( deviceCount, int ) or isinstance( deviceCount, str ):
+                main.log.info( "Creating device distribution" )
+                deviceCount = int( deviceCount )
+                switchList = [ 0 ] * ( clusterCount + 1 )
+                baselineSwitchCount = deviceCount / clusterCount
 
-                for node in range(1, clusterCount + 1):
-                    switchList[node] = baselineSwitchCount
+                for node in range( 1, clusterCount + 1 ):
+                    switchList[ node ] = baselineSwitchCount
 
-                for node in range(1, (deviceCount%clusterCount)+1):
-                    switchList[node] += 1
+                for node in range( 1, ( deviceCount % clusterCount ) + 1 ):
+                    switchList[ node ] += 1
 
-            if type(deviceCount) is list:
-                main.log.info("Using provided device distribution")
+            if isinstance( deviceCount, list ):
+                main.log.info( "Using provided device distribution" )
 
-                if len(deviceCount) == clusterCount:
-                    switchList = ['0']
-                    switchList.extend(deviceCount)
+                if len( deviceCount ) == clusterCount:
+                    switchList = [ '0' ]
+                    switchList.extend( deviceCount )
 
-                if len(deviceCount) == (clusterCount + 1):
-                    if deviceCount[0] == '0' or deviceCount[0] == 0:
+                if len( deviceCount ) == ( clusterCount + 1 ):
+                    if deviceCount[ 0 ] == '0' or deviceCount[ 0 ] == 0:
                         switchList = deviceCount
 
-                assert len(switchList) == (clusterCount + 1)
+                assert len( switchList ) == ( clusterCount + 1 )
 
         except AssertionError:
-            main.log.error( "Bad device/Ip list match")
+            main.log.error( "Bad device/Ip list match" )
         except TypeError:
             main.log.exception( self.name + ": Object not as expected" )
             return None
@@ -2010,80 +2002,76 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
+        ONOSIp = [ 0 ]
+        ONOSIp.extend( ONOSIpList )
 
-        ONOSIp = [0]
-        ONOSIp.extend(ONOSIpList)
-
-        devicesString  = "devConfigs = "
-        for node in range(1, len(ONOSIp)):
-            devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
+        devicesString = "devConfigs = "
+        for node in range( 1, len( ONOSIp ) ):
+            devicesString += ( ONOSIp[ node ] + ":" + str( switchList[ node ] ) )
             if node < clusterCount:
-                devicesString += (",")
+                devicesString += ( "," )
 
         try:
-            self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
-            self.handle.expect(":~")
-            self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str(numPorts) )
-            self.handle.expect(":~")
+            self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
+            self.handle.expect( ":~" )
+            self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str( numPorts ) )
+            self.handle.expect( ":~" )
 
-            for i in range(10):
-                self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider")
-                self.handle.expect(":~")
+            for i in range( 10 ):
+                self.handle.sendline( "onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider" )
+                self.handle.expect( ":~" )
                 verification = self.handle.before
-                if (" value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification:
+                if ( " value=" + str( numPorts ) ) in verification and ( " value=" + devicesString ) in verification:
                     break
                 else:
-                    time.sleep(1)
+                    time.sleep( 1 )
 
-            assert ("value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification
+            assert ( "value=" + str( numPorts ) ) in verification and ( " value=" + devicesString ) in verification
 
         except AssertionError:
-            main.log.error("Incorrect Config settings: " + verification)
+            main.log.error( "Incorrect Config settings: " + verification )
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def configNullLink( self,fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0):
-        '''
+    def configNullLink( self, fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0 ):
+        """
                 fileName default is currently the same as the default on ONOS, specify alternate file if
                 you want to use a different topology file than linkGraph.cfg
-        '''
-
-
+        """
         try:
-            self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str(eventRate))
-            self.handle.expect(":~")
-            self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
-            self.handle.expect(":~")
+            self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str( eventRate ) )
+            self.handle.expect( ":~" )
+            self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
+            self.handle.expect( ":~" )
 
-            for i in range(10):
-                self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider")
-                self.handle.expect(":~")
+            for i in range( 10 ):
+                self.handle.sendline( "onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider" )
+                self.handle.expect( ":~" )
                 verification = self.handle.before
-                if (" value=" + str(eventRate)) in verification and (" value=" + fileName) in verification:
+                if ( " value=" + str( eventRate ) ) in verification and ( " value=" + fileName ) in verification:
                     break
                 else:
-                    time.sleep(1)
+                    time.sleep( 1 )
 
-            assert ("value=" + str(eventRate)) in verification and (" value=" + fileName) in verification
+            assert ( "value=" + str( eventRate ) ) in verification and ( " value=" + fileName ) in verification
 
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanAndExit()
         except AssertionError:
-            main.log.info("Settings did not post to ONOS")
-            main.log.error(varification)
+            main.log.info( "Settings did not post to ONOS" )
+            main.log.error( varification )
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
-            main.log.error(varification)
+            main.log.error( varification )
             main.cleanAndExit()
 
     def getOnosIps( self ):
         """
             Get all onos IPs stored in
         """
-
         return sorted( self.onosIps.values() )
 
     def listLog( self, nodeIp ):
@@ -2136,16 +2124,16 @@
         """
         try:
             main.log.info( " Log Report for {} ".format( nodeIp ).center( 70, '=' ) )
-            if type( searchTerms ) is str:
-                searchTerms = [searchTerms]
+            if isinstance( searchTerms, str ):
+                searchTerms = [ searchTerms ]
             numTerms = len( searchTerms )
             outputMode = outputMode.lower()
 
             totalHits = 0
             logLines = []
             for termIndex in range( numTerms ):
-                term = searchTerms[termIndex]
-                logLines.append( [term] )
+                term = searchTerms[ termIndex ]
+                logLines.append( [ term ] )
                 if startStr and endStr:
                     cmd = "onos-ssh {} \"sed -n '/{}/,/{}/p' /opt/onos/log/karaf.log | grep {}\"".format( nodeIp,
                                                                                                           startStr,
@@ -2162,7 +2150,7 @@
                     if term in line and "grep" not in line:
                         count += 1
                         if before.index( line ) > ( len( before ) - 7 ):
-                            logLines[termIndex].append( line )
+                            logLines[ termIndex ].append( line )
                 main.log.info( "{}: {}".format( term, count ) )
                 totalHits += count
                 if termIndex == numTerms - 1:
@@ -2170,10 +2158,10 @@
             if outputMode != "s":
                 outputString = ""
                 for term in logLines:
-                    outputString = term[0] + ": \n"
+                    outputString = term[ 0 ] + ": \n"
                     for line in range( 1, len( term ) ):
-                        outputString += ( "\t" + term[line] + "\n" )
-                    if outputString != ( term[0] + ": \n" ):
+                        outputString += ( "\t" + term[ line ] + "\n" )
+                    if outputString != ( term[ 0 ] + ": \n" ):
                         main.log.info( outputString )
             main.log.info( "=" * 70 )
             return totalHits
@@ -2190,7 +2178,7 @@
             main.cleanAndExit()
 
     def copyMininetFile( self, fileName, localPath, userName, ip,
-                         mnPath='~/mininet/custom/', timeout = 60 ):
+                         mnPath='~/mininet/custom/', timeout=60 ):
         """
         Description:
             Copy mininet topology file from dependency folder in the test folder
@@ -2206,7 +2194,6 @@
             Return main.TRUE if successfully copied the file otherwise
             return main.FALSE
         """
-
         try:
             cmd = "scp " + localPath + fileName + " " + userName + "@" + \
                   str( ip ) + ":" + mnPath + fileName
@@ -2243,22 +2230,22 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
 
-    def jvmSet(self, memory=8):
+    def jvmSet( self, memory=8 ):
 
         import os
 
-        homeDir = os.path.expanduser('~')
+        homeDir = os.path.expanduser( '~' )
         filename = "/onos/tools/package/bin/onos-service"
 
-        serviceConfig = open(homeDir + filename, 'w+')
-        serviceConfig.write("#!/bin/bash\n ")
-        serviceConfig.write("#------------------------------------- \n ")
-        serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
-        serviceConfig.write("#------------------------------------- \n ")
-        serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
-        serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms""" + str(memory) + "G -Xmx" + str(memory) + """G}" \n """)
-        serviceConfig.write("[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n")
-        serviceConfig.write("""${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """)
+        serviceConfig = open( homeDir + filename, 'w+' )
+        serviceConfig.write( "#!/bin/bash\n " )
+        serviceConfig.write( "#------------------------------------- \n " )
+        serviceConfig.write( "# Starts ONOS Apache Karaf container\n " )
+        serviceConfig.write( "#------------------------------------- \n " )
+        serviceConfig.write( "#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n " )
+        serviceConfig.write( """export JAVA_OPTS="${ JAVA_OPTS:--Xms""" + str(memory) + "G -Xmx" + str(memory) + """G }" \n """ )
+        serviceConfig.write( "[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n" )
+        serviceConfig.write( """${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """ )
         serviceConfig.close()
 
     def createDBFile( self, testData ):
@@ -2267,7 +2254,7 @@
         DBString = ""
 
         for item in testData:
-            if type( item ) is string:
+            if isinstance( item, string ):
                 item = "'" + item + "'"
             if testData.index( item ) < len( testData - 1 ):
                 item += ","
@@ -2279,15 +2266,15 @@
 
     def verifySummary( self, ONOSIp, *deviceCount ):
 
-        self.handle.sendline( "onos " + ONOSIp  + " summary" )
+        self.handle.sendline( "onos " + ONOSIp + " summary" )
         self.handle.expect( ":~" )
 
         summaryStr = self.handle.before
         print "\nSummary\n==============\n" + summaryStr + "\n\n"
 
-        #passed = "SCC(s)=1" in summaryStr
-        #if deviceCount:
-        #    passed = "devices=" + str(deviceCount) + "," not in summaryStr
+        # passed = "SCC(s)=1" in summaryStr
+        # if deviceCount:
+        #    passed = "devices=" + str( deviceCount ) + "," not in summaryStr
 
         passed = False
         if "SCC(s)=1," in summaryStr:
@@ -2298,7 +2285,7 @@
 
         if deviceCount:
             print" ============================="
-            checkStr = "devices=" + str( deviceCount[0] ) + ","
+            checkStr = "devices=" + str( deviceCount[ 0 ] ) + ","
             print "Checkstr: " + checkStr
             if checkStr not in summaryStr:
                 passed = False
@@ -2330,7 +2317,7 @@
             # IF self.ip_address is an ip address and matches
             #    self.nicAddr: return self.ip_address
             if match:
-                curIp = match.group(0)
+                curIp = match.group( 0 )
                 if nicPat:
                     nicMatch = re.search( nicPat, curIp )
                     if nicMatch:
@@ -2345,7 +2332,7 @@
             ips = re.findall( ifPat, raw )
             if iface:
                 if ips:
-                    ip = ips[0]
+                    ip = ips[ 0 ]
                     self.ip_address = ip
                     return ip
                 else:
@@ -2359,8 +2346,8 @@
                         return ip
             else:  # If only one non-localhost ip, return that
                 tmpList = [ ip for ip in ips if ip is not LOCALHOST ]
-                if len(tmpList) == 1:
-                    curIp = tmpList[0]
+                if len( tmpList ) == 1:
+                    curIp = tmpList[ 0 ]
                     self.ip_address = curIp
                     return curIp
             # Either no non-localhost IPs, or more than 1
@@ -2374,9 +2361,9 @@
             main.log.exception( "Uncaught exception" )
 
     def startBasicONOS( self, nodeList, opSleep=60, onosStartupSleep=30, onosUser="sdn" ):
-        '''
+        """
         Start onos cluster with defined nodes, but only with drivers app
-        '''
+        """
         import time
 
         self.createCellFile( self.ip_address,
@@ -2409,8 +2396,8 @@
 
         onosStatus = True
         for nd in nodeList:
-            onosStatus = onosStatus & self.isup( node = nd )
-            #print "onosStatus is: " + str( onosStatus )
+            onosStatus = onosStatus & self.isup( node=nd )
+            # print "onosStatus is: " + str( onosStatus )
 
         return main.TRUE if onosStatus else main.FALSE
 
diff --git a/TestON/drivers/common/cli/ovsdbdriver.py b/TestON/drivers/common/cli/ovsdbdriver.py
index 636a7b2..7c2a43d 100644
--- a/TestON/drivers/common/cli/ovsdbdriver.py
+++ b/TestON/drivers/common/cli/ovsdbdriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,7 +21,6 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 """
-
 """
 drivers for ovsdb commands.
 
@@ -51,11 +50,11 @@
     def connect( self, **connectargs ):
         try:
             for key in connectargs:
-                vars( self)[ key ] = connectargs[ key ]
+                vars( self )[ key ] = connectargs[ key ]
 
             self.name = self.options[ 'name' ]
-            if os.getenv( str( self.ip_address ) ) != None:
-                self.ip_address = os.getenv(str ( self.ip_address ) )
+            if os.getenv( str( self.ip_address ) ) is not None:
+                self.ip_address = os.getenv( str( self.ip_address ) )
             else:
                 main.log.info( self.name + ": Trying to connect to " +
                                self.ip_address )
@@ -63,7 +62,7 @@
                     user_name=self.user_name,
                     ip_address=self.ip_address,
                     port=self.port,
-                    pwd=self.pwd)
+                    pwd=self.pwd )
 
             if self.handle:
                 main.log.info( "Connection successful to the ovsdb node " +
@@ -91,7 +90,7 @@
         return response
 
     def setManager( self, ip, port, delaytime="5" ):
-        command= "sudo ovs-vsctl set-manager tcp:" + str( ip ) + ":" + str( port )
+        command = "sudo ovs-vsctl set-manager tcp:" + str( ip ) + ":" + str( port )
         try:
             handle = self.execute(
                 cmd=command,
@@ -102,7 +101,7 @@
                 return main.FALSE
             else:
                 main.log.info( "Ovsdb manager " + str( ip ) + " set" )
-                #delay time  for ovsdb connection create
+                # delay time  for ovsdb connection create
                 main.log.info( "Wait " + str( delaytime ) + " seconds for ovsdb connection create" )
                 time.sleep( int( delaytime ) )
                 return main.TRUE
@@ -112,7 +111,7 @@
             main.cleanAndExit()
 
     def delManager( self, delaytime="5" ):
-        command= "sudo ovs-vsctl del-manager"
+        command = "sudo ovs-vsctl del-manager"
         try:
             handle = self.execute(
                 cmd=command,
@@ -123,7 +122,7 @@
                 return main.FALSE
             else:
                 main.log.info( "Ovsdb manager delete" )
-                #delay time  for ovsdb connection delete
+                # delay time  for ovsdb connection delete
                 main.log.info( "Wait " + str( delaytime ) + " seconds for ovsdb connection delete" )
                 time.sleep( int( delaytime ) )
                 return main.TRUE
@@ -133,7 +132,7 @@
             main.cleanAndExit()
 
     def getManager( self ):
-        command= "sudo ovs-vsctl get-manager"
+        command = "sudo ovs-vsctl get-manager"
         try:
             response = self.execute(
                 cmd=command,
@@ -152,7 +151,7 @@
             The output of the command from the linux
             or main.FALSE on timeout
         """
-        command= "sudo ovs-vsctl list-br"
+        command = "sudo ovs-vsctl list-br"
         try:
             response = self.execute(
                 cmd=command,
@@ -174,7 +173,7 @@
             The output of the command from the linux
             or main.FALSE on timeout
         """
-        command= "sudo ovs-vsctl list-ports " + str( sw )
+        command = "sudo ovs-vsctl list-ports " + str( sw )
         try:
             response = self.execute(
                 cmd=command,
@@ -199,7 +198,7 @@
         try:
             response = self.execute(
                 cmd=command,
-                timeout=10)
+                timeout=10 )
             if response:
                 return response
             else:
@@ -220,7 +219,7 @@
         try:
             response = self.execute(
                 cmd=command,
-                timeout=10)
+                timeout=10 )
             if response:
                 return response
             else:
@@ -251,8 +250,8 @@
             else:
                 return main.FALSE
         except pexpect.EOF:
-            main.log.error(self.name + ": EOF exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
 
     def createHost( self, hostname ):
@@ -260,7 +259,7 @@
         try:
             handle = self.execute(
                 cmd=command,
-                timeout=10)
+                timeout=10 )
             if re.search( "Error", handle ):
                 main.log.error( "Error in create host" + str( hostname ) )
                 main.log.error( handle )
@@ -269,20 +268,20 @@
                 main.log.info( "Create " + str( hostname ) + " sucess" )
                 return main.TRUE
         except pexpect.EOF:
-            main.log.error(self.name + ": EOF exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
 
-    def createHostport(self, hostname="host1", hostport="host1-eth0", ovsport="port1", hostportmac="000000000001" ):
-        command = "sudo ip link add " + str(hostport) +" type veth peer name " + str(ovsport)
-        command += ";" + "sudo ip link set " + str(hostport) + " up"
-        command += ";" + "sudo ip link set " + str(ovsport) + " up"
-        command += ";" +" sudo ifconfig " + str(hostport) + " hw ether " + str(hostportmac)
-        command += ";" +" sudo ip link set " + str(hostport) + " netns " + str(hostname)
+    def createHostport( self, hostname="host1", hostport="host1-eth0", ovsport="port1", hostportmac="000000000001" ):
+        command = "sudo ip link add " + str( hostport ) + " type veth peer name " + str( ovsport )
+        command += ";" + "sudo ip link set " + str( hostport ) + " up"
+        command += ";" + "sudo ip link set " + str( ovsport ) + " up"
+        command += ";" + " sudo ifconfig " + str( hostport ) + " hw ether " + str( hostportmac )
+        command += ";" + " sudo ip link set " + str( hostport ) + " netns " + str( hostname )
         try:
             handle = self.execute(
                 cmd=command,
-                timeout=10)
+                timeout=10 )
             if re.search( "Error", handle ):
                 main.log.error( "Error in create host port " + str( hostport ) + " on " + str( hostname ) )
                 main.log.error( handle )
@@ -291,40 +290,40 @@
                 main.log.info( "Create host port " + str( hostport ) + " on " + str( hostname ) + " sucess" )
                 return main.TRUE
         except pexpect.EOF:
-            main.log.error(self.name + ": EOF exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
 
-    def addPortToOvs(self, ifaceId, attachedMac, vmuuid, port="port1", ovsname="br-int" ):
-        command = "sudo ovs-vsctl add-port " + str(ovsname) +" " + str(port)
+    def addPortToOvs( self, ifaceId, attachedMac, vmuuid, port="port1", ovsname="br-int" ):
+        command = "sudo ovs-vsctl add-port " + str( ovsname ) + " " + str( port )
         if ifaceId:
-            command += " -- set Interface " + str(port) + " external-ids:iface-id=" + str(ifaceId) + " external-ids:iface-status=active"
+            command += " -- set Interface " + str( port ) + " external-ids:iface-id=" + str( ifaceId ) + " external-ids:iface-status=active"
         if attachedMac:
-            command += " external-ids:attached-mac=" + str(attachedMac)
+            command += " external-ids:attached-mac=" + str( attachedMac )
         if vmuuid:
-            command += " external-ids:vm-uuid=" + str(vmuuid)
+            command += " external-ids:vm-uuid=" + str( vmuuid )
         try:
             handle = self.execute(
                 cmd=command,
-                timeout=10)
+                timeout=10 )
             if re.search( "Error", handle ):
-                main.log.error( "Error in add port " + str(port) + " to ovs " + str( ovsname ) )
+                main.log.error( "Error in add port " + str( port ) + " to ovs " + str( ovsname ) )
                 main.log.error( handle )
                 return main.FALSE
             else:
-                main.log.info( "Add port " + str(port) + " to ovs " + str( ovsname )  + " sucess" )
+                main.log.info( "Add port " + str( port ) + " to ovs " + str( ovsname ) + " sucess" )
                 return main.TRUE
         except pexpect.EOF:
-            main.log.error(self.name + ": EOF exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
 
-    def setHostportIp(self, ip, hostname="host1", hostport1="host1-eth0" ):
-        command = "sudo ip netns exec " + str(hostname) +" ifconfig " + str(hostport1) + " " + str(ip)
+    def setHostportIp( self, ip, hostname="host1", hostport1="host1-eth0" ):
+        command = "sudo ip netns exec " + str( hostname ) + " ifconfig " + str( hostport1 ) + " " + str( ip )
         try:
             handle = self.execute(
                 cmd=command,
-                timeout=10)
+                timeout=10 )
             if re.search( "Error", handle ):
                 main.log.error( "Error in set host ip for " + str( hostport1 ) + " on host " + str( hostname ) )
                 main.log.error( handle )
@@ -333,32 +332,32 @@
                 main.log.info( "Set host ip for " + str( hostport1 ) + " on host " + str( hostname ) + " sucess" )
                 return main.TRUE
         except pexpect.EOF:
-            main.log.error(self.name + ": EOF exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
 
-    def hostPing(self, src, target, hostname="host1" ):
+    def hostPing( self, src, target, hostname="host1" ):
         if src:
-            command = "sudo ip netns exec " + str( hostname ) +" ping -c 1 -S " +\
-             str( src ) + " " + str( target )
+            command = "sudo ip netns exec " + str( hostname ) + " ping -c 1 -S " +\
+                str( src ) + " " + str( target )
         else:
-            command = "sudo ip netns exec " + str( hostname ) +" ping -c 1 " + str( target )
+            command = "sudo ip netns exec " + str( hostname ) + " ping -c 1 " + str( target )
         try:
-            for i in range(1,5):
+            for i in range( 1, 5 ):
                 handle = self.execute(
                     cmd=command,
-                    timeout=10)
-                if re.search(',\s0\%\spacket\sloss', handle):
-                    main.log.info(self.name + ": no packets lost, host is reachable")
+                    timeout=10 )
+                if re.search( ',\s0\%\spacket\sloss', handle ):
+                    main.log.info( self.name + ": no packets lost, host is reachable" )
                     return main.TRUE
                     break
-                time.sleep(5)
+                time.sleep( 5 )
             else:
-                main.log.info(self.name + ": packets lost, host is unreachable")
+                main.log.info( self.name + ": packets lost, host is unreachable" )
                 return main.FALSE
         except pexpect.EOF:
-            main.log.error(self.name + ": EOF exception found")
-            main.log.error(self.name + ":     " + self.handle.before)
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
             main.cleanAndExit()
 
     def delBr( self, sw ):
@@ -368,7 +367,7 @@
         Return:
             Delete sucess return main.TRUE or main.FALSE on delete failed
         """
-        command= "sudo ovs-vsctl del-br " + str( sw )
+        command = "sudo ovs-vsctl del-br " + str( sw )
         try:
             response = self.execute(
                 cmd=command,
@@ -389,7 +388,7 @@
         Return:
             Delete sucess return main.TRUE or main.FALSE on delete failed
         """
-        command= "sudo ip netns delete " + str( hostname )
+        command = "sudo ip netns delete " + str( hostname )
         try:
             response = self.execute(
                 cmd=command,
diff --git a/TestON/drivers/common/cli/quaggaclidriver.py b/TestON/drivers/common/cli/quaggaclidriver.py
index e1cbeef..02c6af3 100644
--- a/TestON/drivers/common/cli/quaggaclidriver.py
+++ b/TestON/drivers/common/cli/quaggaclidriver.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -9,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,7 +19,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 import time
 import pexpect
 import sys
@@ -58,9 +57,9 @@
                 ip_address="1.1.1.1",
                 port=self.port,
                 pwd=self.pwd )
-        #main.log.info( "connect parameters:" + str( self.user_name ) + ";"
+        # main.log.info( "connect parameters:" + str( self.user_name ) + ";"
         #               + str( self.ip_address ) + ";" + str( self.port )
-        #               + ";" + str(self.pwd ) )
+        #               + ";" + str( self.pwd ) )
 
         if self.handle:
             # self.handle.expect( "",timeout=10 )
@@ -208,7 +207,7 @@
         routesJsonObj = json.loads( getRoutesResult )
 
         allRoutesActual = []
-        for route in routesJsonObj['routes4']:
+        for route in routesJsonObj[ 'routes4' ]:
             if 'prefix' in route:
                 if route[ 'prefix' ] == '172.16.10.0/24':
                     continue
@@ -221,7 +220,7 @@
         routesJsonObj = json.loads( getRoutesResult )
 
         allRoutesActual = []
-        for route in routesJsonObj['routes4']:
+        for route in routesJsonObj[ 'routes4' ]:
             if route[ 'prefix' ] == '172.16.10.0/24':
                 continue
             allRoutesActual.append(
@@ -237,10 +236,10 @@
         intentsJsonObj = json.loads( getIntentsResult )
 
         for intent in intentsJsonObj:
-            #if intent[ 'appId' ] != "org.onosproject.sdnip":
+            # if intent[ 'appId' ] != "org.onosproject.sdnip":
             #    continue
             if intent[ 'type' ] == "MultiPointToSinglePointIntent" \
-            and intent[ 'state' ] == 'INSTALLED':
+                    and intent[ 'state' ] == 'INSTALLED':
                 egress = str( intent[ 'egress' ][ 'device' ] ) + ":" \
                     + str( intent[ 'egress' ][ 'port' ] )
                 ingress = []
@@ -266,7 +265,7 @@
         num = 0
         for intent in intentsJsonObj:
             if intent[ 'type' ] == "MultiPointToSinglePointIntent" \
-            and intent[ 'state' ] == 'INSTALLED':
+                    and intent[ 'state' ] == 'INSTALLED':
                 num = num + 1
         return num
 
@@ -276,7 +275,7 @@
         num = 0
         for intent in intentsJsonObj:
             if intent[ 'type' ] == "PointToPointIntent" \
-            and intent[ 'state' ] == 'INSTALLED':
+                    and intent[ 'state' ] == 'INSTALLED':
                 num = num + 1
         return num
 
@@ -288,10 +287,10 @@
         intentsJsonObj = json.loads( getIntentsResult )
 
         for intent in intentsJsonObj:
-            #if intent[ 'appId' ] != "org.onosproject.sdnip":
+            # if intent[ 'appId' ] != "org.onosproject.sdnip":
             #    continue
             if intent[ 'type' ] == "PointToPointIntent" \
-            and "protocol=6" in str( intent[ 'selector' ] ):
+                    and "protocol=6" in str( intent[ 'selector' ] ):
                 ingress = str( intent[ 'ingress' ][ 'device' ] ) + ":" \
                     + str( intent[ 'ingress' ][ 'port' ] )
                 egress = str( intent[ 'egress' ][ 'device' ] ) + ":" + \
@@ -325,15 +324,15 @@
             # find out the BGP speaker IP address for this BGP peer
             bgpSpeakerIpAddress = ""
             for interfaceAddress in \
-            sdnipData[ 'bgpSpeakers' ][ 0 ][ 'interfaceAddresses' ]:
+                    sdnipData[ 'bgpSpeakers' ][ 0 ][ 'interfaceAddresses' ]:
                 # if eq( interfaceAddress[ 'interfaceDpid' ],sdnipData[
                 # 'bgpSpeakers' ][ 0 ][ 'attachmentDpid' ] ) and eq(
                 # interfaceAddress[ 'interfacePort' ], sdnipData[ 'bgpSpeakers'
                 # ][ 0 ][ 'attachmentPort' ] ):
                 if eq( interfaceAddress[ 'interfaceDpid' ],
                        peer[ 'attachmentDpid' ] ) \
-                and eq( interfaceAddress[ 'interfacePort' ],
-                        peer[ 'attachmentPort' ] ):
+                    and eq( interfaceAddress[ 'interfacePort' ],
+                            peer[ 'attachmentPort' ] ):
                     bgpSpeakerIpAddress = interfaceAddress[ 'ipAddress' ]
                     break
                 else:
@@ -343,9 +342,9 @@
             # direction
             selectorStr = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," \
                 + "IPV4_DST{ip=" + peer[ 'ipAddress' ] + "/32}," \
-                + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, \
-                TCP_DST{tcpPort=179}"
-            selector = selectorStr.replace( " ", "" ).replace("[", "" )\
+                + "IP_PROTO{ protocol=6 }, ETH_TYPE{ ethType=800 }, \
+                TCP_DST{ tcpPort=179 }"
+            selector = selectorStr.replace( " ", "" ).replace( "[", "" )\
                 .replace( "]", "" ).split( "," )
             intent = bgpSpeakerAttachmentPoint + "/" + \
                 bgpPeerAttachmentPoint + "/" + str( sorted( selector ) )
@@ -353,9 +352,9 @@
 
             selectorStr = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," \
                 + "IPV4_DST{ip=" + peer[ 'ipAddress' ] + "/32}," \
-                + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, \
-                TCP_SRC{tcpPort=179}"
-            selector = selectorStr.replace( " ", "" ).replace("[", "" )\
+                + "IP_PROTO{ protocol=6 }, ETH_TYPE{ ethType=800 }, \
+                TCP_SRC{ tcpPort=179 }"
+            selector = selectorStr.replace( " ", "" ).replace( "[", "" )\
                 .replace( "]", "" ).split( "," )
             intent = bgpSpeakerAttachmentPoint + "/" \
                 + bgpPeerAttachmentPoint + "/" + str( sorted( selector ) )
@@ -365,9 +364,9 @@
             # direction
             selectorStr = "IPV4_SRC{ip=" + peer[ 'ipAddress' ] + "/32}," \
                 + "IPV4_DST{ip=" + bgpSpeakerIpAddress + "/32}," \
-                + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, \
-                TCP_DST{tcpPort=179}"
-            selector = selectorStr.replace( " ", "" ).replace("[", "" )\
+                + "IP_PROTO{ protocol=6 }, ETH_TYPE{ ethType=800 }, \
+                TCP_DST{ tcpPort=179 }"
+            selector = selectorStr.replace( " ", "" ).replace( "[", "" )\
                 .replace( "]", "" ).split( "," )
             intent = bgpPeerAttachmentPoint + "/" \
                 + bgpSpeakerAttachmentPoint + "/" + str( sorted( selector ) )
@@ -375,8 +374,8 @@
 
             selectorStr = "IPV4_SRC{ip=" + peer[ 'ipAddress' ] + "/32}," \
                 + "IPV4_DST{ip=" + bgpSpeakerIpAddress + "/32}," \
-                + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, \
-                TCP_SRC{tcpPort=179}"
+                + "IP_PROTO{ protocol=6 }, ETH_TYPE{ ethType=800 }, \
+                TCP_SRC{ tcpPort=179 }"
             selector = selectorStr.replace( " ", "" ).replace( "[", "" )\
                 .replace( "]", "" ).split( "," )
             intent = bgpPeerAttachmentPoint + "/" \
@@ -400,23 +399,23 @@
 
         chunk_size = 20
 
-        if len(routes) > chunk_size:
-            num_iter = (int) (len(routes) / chunk_size)
+        if len( routes ) > chunk_size:
+            num_iter = ( int )( len( routes ) / chunk_size )
         else:
-            num_iter = 1;
+            num_iter = 1
 
         total = 0
-        for n in range( 0, num_iter + 1):
+        for n in range( 0, num_iter + 1 ):
             routeCmd = ""
-            if (len( routes ) - (n * chunk_size)) >= chunk_size:
-                m = (n + 1) * chunk_size
+            if ( len( routes ) - ( n * chunk_size ) ) >= chunk_size:
+                m = ( n + 1 ) * chunk_size
             else:
                 m = len( routes )
             for i in range( n * chunk_size, m ):
                 routeCmd = routeCmd + "network " + routes[ i ] + "\n"
                 total = total + 1
 
-            main.log.info(routeCmd)
+            main.log.info( routeCmd )
             try:
                 self.handle.sendline( routeCmd )
                 self.handle.expect( "bgpd", timeout=5 )
@@ -425,8 +424,8 @@
                 self.disconnect()
 
             # waitTimer = 1.00 / routeRate
-            main.log.info("Total routes so far " + ((str) (total)) + " wait for 0 sec")
-            #time.sleep( 1 )
+            main.log.info( "Total routes so far " + ( ( str )( total ) ) + " wait for 0 sec" )
+            # time.sleep( 1 )
         if routesAdded == len( routes ):
             main.log.info( "Finished adding routes" )
             return main.TRUE
@@ -489,7 +488,6 @@
             main.log.info( "NO HANDLE" )
             return main.FALSE
 
-
     # Please use the generateRoutes plus addRoutes instead of this one!
     def addRoute( self, net, numRoutes, routeRate ):
         try:
@@ -613,7 +611,7 @@
             count = 0
             while True:
                 i = child.expect( [ '17\d\.\d{1,3}\.\d{1,3}\.\d{1,3}',
-                                   'CLI#', pexpect.TIMEOUT ] )
+                                    'CLI#', pexpect.TIMEOUT ] )
                 if i == 0:
                     count = count + 1
                 elif i == 1:
@@ -700,4 +698,3 @@
             main.log.error( "Connection failed to the host" )
             response = main.FALSE
         return response
-
diff --git a/TestON/drivers/common/cli/remotesysdriver.py b/TestON/drivers/common/cli/remotesysdriver.py
index 48046f1..3c5dd17 100644
--- a/TestON/drivers/common/cli/remotesysdriver.py
+++ b/TestON/drivers/common/cli/remotesysdriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 26-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
diff --git a/TestON/drivers/common/cli/remotetestbed/floodlightclidriver.py b/TestON/drivers/common/cli/remotetestbed/floodlightclidriver.py
index b923a20..58667a1 100644
--- a/TestON/drivers/common/cli/remotetestbed/floodlightclidriver.py
+++ b/TestON/drivers/common/cli/remotetestbed/floodlightclidriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 12-Feb-2013
-Copyright 2013 Open Networking Foundation (ONF)
+Copyright 2013 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -28,6 +28,7 @@
 """
 from drivers.common.cli.remotetestbeddriver import RemoteTestBedDriver
 
+
 class FloodLightCliDriver( RemoteTestBedDriver ):
 
     """
diff --git a/TestON/drivers/common/cli/remotetestbed/necswitchdriver.py b/TestON/drivers/common/cli/remotetestbed/necswitchdriver.py
index b04b95c..9ab454d 100644
--- a/TestON/drivers/common/cli/remotetestbed/necswitchdriver.py
+++ b/TestON/drivers/common/cli/remotetestbed/necswitchdriver.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 class NEC:
 
     def __init__( self ):
diff --git a/TestON/drivers/common/cli/remotetestbed/remotepoxdriver.py b/TestON/drivers/common/cli/remotetestbed/remotepoxdriver.py
index 9a556c9..8369c24 100644
--- a/TestON/drivers/common/cli/remotetestbed/remotepoxdriver.py
+++ b/TestON/drivers/common/cli/remotetestbed/remotepoxdriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 12-Feb-2013
-Copyright 2013 Open Networking Foundation (ONF)
+Copyright 2013 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
diff --git a/TestON/drivers/common/cli/remotetestbed/remotevmdriver.py b/TestON/drivers/common/cli/remotetestbed/remotevmdriver.py
index 5875169..ebb3d75 100644
--- a/TestON/drivers/common/cli/remotetestbed/remotevmdriver.py
+++ b/TestON/drivers/common/cli/remotetestbed/remotevmdriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 12-Feb-2013
-Copyright 2013 Open Networking Foundation (ONF)
+Copyright 2013 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
diff --git a/TestON/drivers/common/cli/remotetestbeddriver.py b/TestON/drivers/common/cli/remotetestbeddriver.py
index e4bbbad..8dc73d5 100644
--- a/TestON/drivers/common/cli/remotetestbeddriver.py
+++ b/TestON/drivers/common/cli/remotetestbeddriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 26-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
diff --git a/TestON/drivers/common/cli/tool/dpctlclidriver.py b/TestON/drivers/common/cli/tool/dpctlclidriver.py
index 0dd15ee..dfff992 100644
--- a/TestON/drivers/common/cli/tool/dpctlclidriver.py
+++ b/TestON/drivers/common/cli/tool/dpctlclidriver.py
@@ -1,7 +1,7 @@
-#/usr/bin/env python
+# /usr/bin/env python
 """
 Created on 26-Nov-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -50,9 +50,9 @@
 
         self.handle = super(
                    DpctlCliDriver, self ).connect( user_name=self.user_name,
-                   ip_address=self.ip_address,
-                   port=None,
-                   pwd=self.pwd )
+                                                   ip_address=self.ip_address,
+                                                   port=None,
+                                                   pwd=self.pwd )
         if self.handle:
             main.log.info( "Connected to the host" )
             return main.TRUE
@@ -74,7 +74,7 @@
                                      "INPORT",
                                      "ACTION",
                                      "TIMEOUT" ],
-                             **flowParameters )
+                                     **flowParameters )
 
         cmd = "dpctl add-flow tcp:"
         tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
@@ -258,7 +258,7 @@
                                      "TCPIP",
                                      "TCPPORT",
                                      "STRING" ],
-                            **flowParameters )
+                                     **flowParameters )
 
         tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
         tcpPort = args[ "TCPPORT" ] if args[
@@ -286,7 +286,7 @@
                                      "TCPIP",
                                      "TCPPORT",
                                      "STRING" ],
-                             **flowParameters )
+                                     **flowParameters )
 
         tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
         tcpPort = args[ "TCPPORT" ] if args[
@@ -306,4 +306,3 @@
 if __name__ != "__main__":
     import sys
     sys.modules[ __name__ ] = DpctlCliDriver()
-
diff --git a/TestON/drivers/common/cli/toolsdriver.py b/TestON/drivers/common/cli/toolsdriver.py
index 79a0db2..c31dbf7 100644
--- a/TestON/drivers/common/cli/toolsdriver.py
+++ b/TestON/drivers/common/cli/toolsdriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 26-Nov-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
diff --git a/TestON/drivers/common/clidriver.py b/TestON/drivers/common/clidriver.py
index b7ad8c8..b178700 100644
--- a/TestON/drivers/common/clidriver.py
+++ b/TestON/drivers/common/clidriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 24-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -34,10 +34,10 @@
     def __init__( self ):
         super( CLI, self ).__init__()
 
-    def checkPrompt(self):
+    def checkPrompt( self ):
         for key in self.options:
-            if key == "prompt" and self.options['prompt'] is not None:
-                self.prompt = self.options['prompt']
+            if key == "prompt" and self.options[ 'prompt' ] is not None:
+                self.prompt = self.options[ 'prompt' ]
                 break
 
     def connect( self, **connectargs ):
@@ -100,7 +100,7 @@
                 else:
                     main.log.info( "Server asked for password, but none was "
                                     "given in the .topo file. Trying "
-                                    "no password.")
+                                    "no password." )
                     self.pwd = ""
                 self.handle.sendline( self.pwd )
                 j = self.handle.expect( [
@@ -181,8 +181,8 @@
         if index == 0:
             self.LASTRSP = self.LASTRSP + \
                 self.handle.before + self.handle.after
-            main.log.info( "Executed :" + str(cmd ) +
-                           " \t\t Expected Prompt '" + str( expectPrompt) +
+            main.log.info( "Executed :" + str( cmd ) +
+                           " \t\t Expected Prompt '" + str( expectPrompt ) +
                            "' Found" )
         elif index == 1:
             self.LASTRSP = self.LASTRSP + self.handle.before
@@ -397,7 +397,7 @@
                 else:
                     main.log.info( "Server asked for password, but none was "
                                     "given in the .topo file. Trying "
-                                    "no password.")
+                                    "no password." )
                     pwd = ""
                 handle.sendline( pwd )
                 j = handle.expect( [ self.prompt,
diff --git a/TestON/drivers/component.py b/TestON/drivers/component.py
index 968306e..7951c2e 100644
--- a/TestON/drivers/component.py
+++ b/TestON/drivers/component.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Created on 24-Oct-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -45,9 +45,9 @@
     def __getattr__( self, name ):
         """
          Called when an attribute lookup has not found the attribute
-         in the usual places (i.e. it is not an instance attribute nor
-         is it found in the class tree for self). name is the attribute
-         name. This method should return the (computed) attribute value
+         in the usual places ( i.e. it is not an instance attribute nor
+         is it found in the class tree for self ). name is the attribute
+         name. This method should return the ( computed ) attribute value
          or raise an AttributeError exception.
         """
         try:
@@ -117,4 +117,3 @@
 if __name__ != "__main__":
     import sys
     sys.modules[ __name__ ] = Component()
-
diff --git a/TestON/examples/Assert/Assert.py b/TestON/examples/Assert/Assert.py
index 2e2f957..3136932 100644
--- a/TestON/examples/Assert/Assert.py
+++ b/TestON/examples/Assert/Assert.py
@@ -1,5 +1,5 @@
-'''
-Copyright 2013 Open Networking Foundation (ONF)
+"""
+Copyright 2013 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -9,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,33 +20,42 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
-'''
-class Assert :
+"""
+class Assert:
 
-    def __init__(self) :
+    def __init__( self ):
         self.default = ''
 
-    def CASE1(self,main) :
+    def CASE1( self, main ):
 
-
-        main.case("Using assert to verify the result")
-        main.step("Using assert_equal to verify the result is equivalent or not")
+        main.case( "Using assert to verify the result" )
+        main.step( "Using assert_equal to verify the result is equivalent or not" )
         expect = main.TRUE
         actual = main.TRUE
-        main.log.warn(main.response_parser('<real></real><imag>2</imag><__complex__>true</__complex__>', "json"))
-        utilities.assert_equals(expect=expect,actual=actual,onpass="expect is equal to actual",onfail="expect is not equal to actual")
+        main.log.warn(
+            main.response_parser( '<real></real><imag>2</imag><__complex__>true</__complex__>',
+                                  "json" ) )
+        utilities.assert_equals( expect=expect, actual=actual,
+                                 onpass="expect is equal to actual",
+                                 onfail="expect is not equal to actual" )
 
-        main.step("Using assert_matches to verify the result matches or not")
+        main.step( "Using assert_matches to verify the result matches or not" )
         expect = "Res(.*)"
         actual = "Result"
-        utilities.assert_matches(expect=expect,actual=actual,onpass="expect is macthes to actual",onfail="expect is not matches to actual")
+        utilities.assert_matches( expect=expect, actual=actual,
+                                  onpass="expect is macthes to actual",
+                                  onfail="expect is not matches to actual" )
 
-        main.step("Using assert_greater to verify the result greater or not")
+        main.step( "Using assert_greater to verify the result greater or not" )
         expect = 10
         actual = 5
-        utilities.assert_greater(expect=actual,actual=expect,onpass="expect is greater than the actual",onfail="expect is not greater than the actual")
+        utilities.assert_greater( expect=actual, actual=expect,
+                                  onpass="expect is greater than the actual",
+                                  onfail="expect is not greater than the actual" )
 
-        main.step("Using assert_lesser to verify the result lesser or not")
+        main.step( "Using assert_lesser to verify the result lesser or not" )
         expect = 5
         actual = 10
-        utilities.assert_lesser(expect=actual,actual=expect,onpass="expect is lesser than the actual",onfail="expect is not lesser than the actual")
+        utilities.assert_lesser( expect=actual, actual=expect,
+                                 onpass="expect is lesser than the actual",
+                                 onfail="expect is not lesser than the actual" )
diff --git a/TestON/examples/ExperimentTest/ExperimentTest.py b/TestON/examples/ExperimentTest/ExperimentTest.py
index a57a8f0..a04c548 100644
--- a/TestON/examples/ExperimentTest/ExperimentTest.py
+++ b/TestON/examples/ExperimentTest/ExperimentTest.py
@@ -1,9 +1,9 @@
 #!/usr/bin/env python
-'''
+"""
 Created on 26-Nov-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
-@author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
+author:: Raghav Kashyap( raghavkashyap@paxterrasolutions.com )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -12,7 +12,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -26,41 +26,40 @@
 
 ofautomation>run ExperimentTest example 1
     will execute this example.
-'''
+"""
 class ExperimentTest:
-    '''
+
+    """
     Testing of the Experimental Mode
 
-    '''
-
-    def __init__(self):
+    """
+    def __init__( self ):
         self.default = ""
 
-    def CASE1(self,main):
-        '''
+    def CASE1( self, main ):
+        """
         Testing the configuration of the host by using checkIP functionof Mininet driver
-        '''
+        """
         main.EXPERIMENTAL_MODE = main.TRUE
-        main.case("Testing the configuration of the host")
-        main.step("Host IP Checking using checkIP")
-        result = main.Mininet1.checkIP(main.params['CASE1']['destination'])
-        main.step("Verifying the result")
-        utilities.assert_equals(expect=main.TRUE,actual=result,onpass="Host h2 IP address configured",onfail="Host h2 IP address didn't configured")
-        main.step("Calling Non Existing API for Experimental Mode")
-        testReturn = main.POX2.verify_flow(returns=main.TRUE)
-        utilities.assert_equals(expect=main.TRUE,actual=testReturn,onpass="Host h2 IP address configured",onfail="Host h2 IP address didn't configured")
+        main.case( "Testing the configuration of the host" )
+        main.step( "Host IP Checking using checkIP" )
+        result = main.Mininet1.checkIP( main.params[ 'CASE1' ][ 'destination' ] )
+        main.step( "Verifying the result" )
+        utilities.assert_equals( expect=main.TRUE, actual=result, onpass="Host h2 IP address configured", onfail="Host h2 IP address didn't configured" )
+        main.step( "Calling Non Existing API for Experimental Mode" )
+        testReturn = main.POX2.verify_flow( returns=main.TRUE )
+        utilities.assert_equals( expect=main.TRUE, actual=testReturn, onpass="Host h2 IP address configured", onfail="Host h2 IP address didn't configured" )
 
-    def CASE2(self,main):
-        '''
+    def CASE2( self, main ):
+        """
         Testing of the reachability of the hosts by using pingall of Mininet driver
-        '''
+        """
         main.EXPERIMENTAL_MODE = main.TRUE
-        main.case("Testing Reachabilty of all the hosts")
-        main.step("Checking Hosts reachability by using pingall")
+        main.case( "Testing Reachabilty of all the hosts" )
+        main.step( "Checking Hosts reachability by using pingall" )
         result = main.Mininet1.pingall()
-        main.step("Verifying the result")
-        utilities.assert_equals(expect=main.TRUE,actual=result,onpass="All hosts are reacchable",onfail="Hosts are not reachable")
-        main.step("Calling Non Existing API for Experimental Mode")
-        testReturn = main.Mininet1.verify_flow(returns=main.TRUE)
-        utilities.assert_equals(expect=main.TRUE,actual=testReturn,onpass="Host h2 IP address configured",onfail="Host h2 IP address didn't configured")
-
+        main.step( "Verifying the result" )
+        utilities.assert_equals( expect=main.TRUE, actual=result, onpass="All hosts are reacchable", onfail="Hosts are not reachable" )
+        main.step( "Calling Non Existing API for Experimental Mode" )
+        testReturn = main.Mininet1.verify_flow( returns=main.TRUE )
+        utilities.assert_equals( expect=main.TRUE, actual=testReturn, onpass="Host h2 IP address configured", onfail="Host h2 IP address didn't configured" )
diff --git a/TestON/examples/StepParams/StepParams.py b/TestON/examples/StepParams/StepParams.py
index 584dca1..c7e0915 100644
--- a/TestON/examples/StepParams/StepParams.py
+++ b/TestON/examples/StepParams/StepParams.py
@@ -1,9 +1,9 @@
 #!/usr/bin/env python
-'''
+"""
 Created on 28-Nov-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
-@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
+author:: Anil Kumar ( anilkumar.s@paxterrasolutions.com )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -12,7 +12,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,40 +21,40 @@
 
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-'''
+"""
 class StepParams:
-    '''
+
+    """
     This example shows the usage of the STEP level parameters, in params file the
-    [[CASE1]]
-    [[[STEP1]]]
+    [ [ CASE1 ] ]
+    [ [ [ STEP1 ] ] ]
         'host'  = 'h2'
 
     We can get this STEP level parameter like :
-    main.params['CASE1']['STEP1']['host']
+    main.params[ 'CASE1' ][ 'STEP1' ][ 'host' ]
 
 
     ofautomation>run StepParams example 1
-    '''
-    def __init__(self):
+    """
+    def __init__( self ):
         self.default = ""
 
-    def CASE1(self,main):
-        '''
+    def CASE1( self, main ):
+        """
         This example will showcase the usage of STEP level parameters to specify the host as h2
-        '''
-        main.case("Using STEP level parameters to specify the host as h2")
-        main.step("Host IP Checking using checkIP")
-        result = main.Mininet1.checkIP(main.params['CASE1']['STEP1']['host'])
-        main.step("Verifying the result")
-        utilities.assert_equals(expect=main.TRUE,actual=result,onpass="Host h2 IP address configured",onfail="Host h2 IP address didn't configured")
+        """
+        main.case( "Using STEP level parameters to specify the host as h2" )
+        main.step( "Host IP Checking using checkIP" )
+        result = main.Mininet1.checkIP( main.params[ 'CASE1' ][ 'STEP1' ][ 'host' ] )
+        main.step( "Verifying the result" )
+        utilities.assert_equals( expect=main.TRUE, actual=result, onpass="Host h2 IP address configured", onfail="Host h2 IP address didn't configured" )
 
-
-    def CASE2(self,main):
-        '''
+    def CASE2( self, main ):
+        """
                 This example will showcase the usage of STEP level parameters to specify the host as h3
-        '''
-        main.case("Using STEP level parameters to specify the host as h3")
-        main.step("Host IP Checking using checkIP")
-        result = main.Mininet1.checkIP(main.params['CASE2']['STEP1']['host'])
-        main.step("Verifying the result")
-        utilities.assert_equals(expect=main.TRUE,actual=result,onpass="Host h3 IP address configured",onfail="Host h3 IP address didn't configured")
+        """
+        main.case( "Using STEP level parameters to specify the host as h3" )
+        main.step( "Host IP Checking using checkIP" )
+        result = main.Mininet1.checkIP( main.params[ 'CASE2' ][ 'STEP1' ][ 'host' ] )
+        main.step( "Verifying the result" )
+        utilities.assert_equals( expect=main.TRUE, actual=result, onpass="Host h3 IP address configured", onfail="Host h3 IP address didn't configured" )
diff --git a/TestON/examples/Topology/Topology.py b/TestON/examples/Topology/Topology.py
index 5cfd5b6..b1e40c0 100644
--- a/TestON/examples/Topology/Topology.py
+++ b/TestON/examples/Topology/Topology.py
@@ -1,9 +1,9 @@
 #!/usr/bin/env python
-'''
+"""
 Created on 28-Nov-2012
-Copyright 2012 Open Networking Foundation (ONF)
+Copyright 2012 Open Networking Foundation ( ONF )
 
-@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
+author:: Anil Kumar ( anilkumar.s@paxterrasolutions.com )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -12,7 +12,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,21 +21,21 @@
 
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-'''
+"""
 class Topology:
-    '''
 
+    """
     This example shows, how we can use the topology file:
 
     In topo file we can specify the component like below:
-    [TOPOLOGY]
+    [ TOPOLOGY ]
 
-        [[COMPONENT]]
-            [[["Mininet1"]]]
+        [ [ COMPONENT ] ]
+            [ [ [ "Mininet1" ] ] ]
 
     The usage of this component in the test script like below:
 
-    main.Mininet1.checkIP(main.params['CASE1']['destination'])
+    main.Mininet1.checkIP( main.params[ 'CASE1' ][ 'destination' ] )
 
     Here we are using the Mininet1 which of type Mininet
 
@@ -43,18 +43,16 @@
 
     ofautomation>run Topology example 1
        will execute this example.
-    '''
-    def __init__(self):
+    """
+    def __init__( self ):
         self.default = ""
 
-    def CASE1(self,main):
-        '''
+    def CASE1( self, main ):
+        """
         This will showcase the usage of Topology
-        '''
-        main.case("Usage of Topology")
-        main.step("Mininet1 specified in Topology , using the Mininet1 to check host ip")
-        result = main.Mininet1.checkIP(main.params['CASE1']['destination'])
-        main.step("Verifying the result")
-        utilities.assert_equals(expect=main.TRUE,actual=result,onpass="Host h2 IP address configured",onfail="Host h2 IP address didn't configured")
-
-
+        """
+        main.case( "Usage of Topology" )
+        main.step( "Mininet1 specified in Topology , using the Mininet1 to check host ip" )
+        result = main.Mininet1.checkIP( main.params[ 'CASE1' ][ 'destination' ] )
+        main.step( "Verifying the result" )
+        utilities.assert_equals( expect=main.TRUE, actual=result, onpass="Host h2 IP address configured", onfail="Host h2 IP address didn't configured" )
diff --git a/TestON/tests/CHOTestMonkey/CHOTestMonkey.py b/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
index 3e21612..b7825e8 100644
--- a/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
+++ b/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 CHOTestMonkey class
 Author: you@onlab.us
@@ -95,7 +94,7 @@
             main.caseResult = main.TRUE
             stepResult = main.testSetUp.envSetup()
         except Exception as e:
-            main.testSetUp.envSetupException(e)
+            main.testSetUp.envSetupException( e )
 
         main.testSetUp.evnSetupConclusion( stepResult )
 
diff --git a/TestON/tests/CHOTestMonkey/dependencies/EventGenerator.py b/TestON/tests/CHOTestMonkey/dependencies/EventGenerator.py
index c19715e..7100fae 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/EventGenerator.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/EventGenerator.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file contains the event generator class for CHOTestMonkey
 Author: you@onlab.us
@@ -129,10 +128,10 @@
         This function triggers an event from inside of CHOTestMonkey
         """
         import time
-        if not typeIndex in EventType().map.keys():
+        if typeIndex not in EventType().map.keys():
             main.log.warn( "Event Generator - Unknown event type: " + str( typeIndex ) )
             return
-        if not scheduleMethod in EventScheduleMethod().map.keys():
+        if scheduleMethod not in EventScheduleMethod().map.keys():
             main.log.warn( "Event Generator - Unknown event schedule method: " + str( scheduleMethod ) )
             return
         while not main.eventScheduler.isAvailable():
@@ -145,7 +144,7 @@
         """
         if typeIndex > 100:
             # Handle group events
-            if not typeIndex in main.enabledEvents.keys():
+            if typeIndex not in main.enabledEvents.keys():
                 main.log.warn( "Event Generator - event type %s not enabled" % ( typeIndex ) )
                 return
             function = getattr( self, main.enabledEvents[ typeIndex ] )
diff --git a/TestON/tests/CHOTestMonkey/dependencies/EventTrigger.py b/TestON/tests/CHOTestMonkey/dependencies/EventTrigger.py
index 878071e..2bfdd35 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/EventTrigger.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/EventTrigger.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Insert network/ONOS/app events into CHOTestMonkey
 Author: you@onlab.us
@@ -104,5 +103,5 @@
         print e
 
 if __name__ == '__main__':
-    #testLoop( 2 )
+    # testLoop( 2 )
     replayFromFile()
diff --git a/TestON/tests/CHOTestMonkey/dependencies/GraphHelper.py b/TestON/tests/CHOTestMonkey/dependencies/GraphHelper.py
index 8ae1ff0..f2ae618 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/GraphHelper.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/GraphHelper.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Graph algorithm implementations for CHOTestMonkey
 Author: you@onlab.us
@@ -71,14 +70,14 @@
             else:
                 key = self.DFI[ neighbor.index ]
                 if key in self.backEdges.keys():
-                    if not link in self.backEdges[ key ] and\
-                            not backwardLink in self.backEdges[ key ]:
+                    if link not in self.backEdges[ key ] and\
+                            backwardLink not in self.backEdges[ key ]:
                         self.backEdges[ key ].append( backwardLink )
                 else:
                     tempKey = self.DFI[ device.index ]
                     if tempKey in self.backEdges.keys():
-                        if not link in self.backEdges[ tempKey ] and\
-                                not backwardLink in self.backEdges[ tempKey ]:
+                        if link not in self.backEdges[ tempKey ] and\
+                                backwardLink not in self.backEdges[ tempKey ]:
                             self.backEdges[ key ] = [ backwardLink ]
                     else:
                         self.backEdges[ key ] = [ backwardLink ]
diff --git a/TestON/tests/CHOTestMonkey/dependencies/cli.py b/TestON/tests/CHOTestMonkey/dependencies/cli.py
index aa080f5..6e67107 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/cli.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/cli.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Start CLI for CHOTestMonkey
 Author: you@onlab.us
diff --git a/TestON/tests/CHOTestMonkey/dependencies/elements/NetworkElement.py b/TestON/tests/CHOTestMonkey/dependencies/elements/NetworkElement.py
index b6e1520..50d6159 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/elements/NetworkElement.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/elements/NetworkElement.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file contains device, host and link class for CHOTestMonkey
 Author: you@onlab.us
diff --git a/TestON/tests/CHOTestMonkey/dependencies/elements/ONOSElement.py b/TestON/tests/CHOTestMonkey/dependencies/elements/ONOSElement.py
index e18e0b3..688324c 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/elements/ONOSElement.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/elements/ONOSElement.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file contains intent class for CHOTestMonkey
 Author: you@onlab.us
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/AppEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/AppEvent.py
index 45df912..8d347c1 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/AppEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/AppEvent.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file contains classes for CHOTestMonkey that are related to application event
 Author: you@onlab.us
@@ -88,7 +87,7 @@
 
     def startEvent( self, args ):
         with self.eventLock:
-            #main.log.info( "%s - starting event" % ( self.typeString ) )
+            # main.log.info( "%s - starting event" % ( self.typeString ) )
             if self.typeIndex == EventType().APP_INTENT_HOST_ADD or self.typeIndex == EventType().APP_INTENT_HOST_DEL:
                 if len( args ) < 3:
                     main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
@@ -237,7 +236,7 @@
 
     def startEvent( self, args ):
         with self.eventLock:
-            #main.log.info( "%s - starting event" % ( self.typeString ) )
+            # main.log.info( "%s - starting event" % ( self.typeString ) )
             if self.typeIndex == EventType().APP_INTENT_POINT_ADD or self.typeIndex == EventType().APP_INTENT_POINT_DEL:
                 if len( args ) < 3:
                     main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
index fc03203..579b17f 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file contains classes for CHOTestMonkey that are related to check event
 Author: you@onlab.us
@@ -152,7 +151,7 @@
             if controller.isUp():
                 with controller.CLILock:
                     topoState = controller.CLI.checkStatus( upDeviceNum, upLinkNum )
-                    #if not topoState:
+                    # if not topoState:
                     #    main.log.warn( "Topo Check - link or device number discoverd by ONOS%s is incorrect" % ( controller.index ) )
                     #    checkResult = EventStates().FAIL
                     # Compare ONOS and Mininet topologies
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/Event.py b/TestON/tests/CHOTestMonkey/dependencies/events/Event.py
index 2a637e6..e6b9e25 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/Event.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/Event.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file contains the Event class for CHOTestMonkey
 Author: you@onlab.us
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py
index 4d676cd..5632e12 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file contains classes for CHOTestMonkey that are related to network event
 Author: you@onlab.us
@@ -42,7 +41,7 @@
         args are the names of the two link ends, e.g. [ 's1', 's2' ]
         """
         with self.eventLock:
-            #main.log.info( "%s - starting event" % ( self.typeString ) )
+            # main.log.info( "%s - starting event" % ( self.typeString ) )
             if len( args ) < 2:
                 main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
                 return EventStates().ABORT
@@ -178,7 +177,7 @@
         args are the names of the device, e.g. 's1'
         """
         with self.eventLock:
-            #main.log.info( "%s - starting event" % ( self.typeString ) )
+            # main.log.info( "%s - starting event" % ( self.typeString ) )
             if len( args ) < 1:
                 main.log.warn( "%s - Not enough arguments: %s" % ( self.typeString, args ) )
                 return EventStates().ABORT
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/ONOSEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/ONOSEvent.py
index e8b7281..1630066 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/ONOSEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/ONOSEvent.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file contains classes for CHOTestMonkey that are related to application event
 Author: you@onlab.us
@@ -34,7 +33,7 @@
 
     def startEvent( self, args ):
         with self.eventLock:
-            #main.log.info( "%s - starting event" % ( self.typeString ) )
+            # main.log.info( "%s - starting event" % ( self.typeString ) )
             result = EventStates().PASS
             if self.typeIndex == EventType().ONOS_ONOS_DOWN or self.typeIndex == EventType().ONOS_ONOS_UP:
                 if len( args ) < 1:
@@ -123,7 +122,7 @@
 
     def startEvent( self, args ):
         with self.eventLock:
-            #main.log.info( "%s - starting event" % ( self.typeString ) )
+            # main.log.info( "%s - starting event" % ( self.typeString ) )
             result = self.startCfgEvent( args )
             return result
 
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/TestEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/TestEvent.py
index a7f99b9..866c219 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/TestEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/TestEvent.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file contains classes for CHOTestMonkey that are related to check event
 Author: you@onlab.us
diff --git a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoAtt.py b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoAtt.py
old mode 100755
new mode 100644
index c464f19..8cc532e
--- a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoAtt.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoAtt.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Custom topology for Mininet
 """
@@ -35,6 +34,7 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class attTopo( Topo ):
 
     def __init__( self, **opts ):
@@ -98,106 +98,107 @@
         PHNX_host = self.addHost( 'h25' )
 
         # add edges between switch and corresponding host
-        self.addLink( NY54 , NY54_host )
-        self.addLink( CMBR , CMBR_host )
-        self.addLink( CHCG , CHCG_host )
-        self.addLink( CLEV , CLEV_host )
-        self.addLink( RLGH , RLGH_host )
-        self.addLink( ATLN , ATLN_host )
-        self.addLink( PHLA , PHLA_host )
-        self.addLink( WASH , WASH_host )
-        self.addLink( NSVL , NSVL_host )
-        self.addLink( STLS , STLS_host )
-        self.addLink( NWOR , NWOR_host )
-        self.addLink( HSTN , HSTN_host )
-        self.addLink( SNAN , SNAN_host )
-        self.addLink( DLLS , DLLS_host )
-        self.addLink( ORLD , ORLD_host )
-        self.addLink( DNVR , DNVR_host )
-        self.addLink( KSCY , KSCY_host )
-        self.addLink( SNFN , SNFN_host )
-        self.addLink( SCRM , SCRM_host )
-        self.addLink( PTLD , PTLD_host )
-        self.addLink( STTL , STTL_host )
-        self.addLink( SLKC , SLKC_host )
-        self.addLink( LA03 , LA03_host )
-        self.addLink( SNDG , SNDG_host )
-        self.addLink( PHNX , PHNX_host )
+        self.addLink( NY54, NY54_host )
+        self.addLink( CMBR, CMBR_host )
+        self.addLink( CHCG, CHCG_host )
+        self.addLink( CLEV, CLEV_host )
+        self.addLink( RLGH, RLGH_host )
+        self.addLink( ATLN, ATLN_host )
+        self.addLink( PHLA, PHLA_host )
+        self.addLink( WASH, WASH_host )
+        self.addLink( NSVL, NSVL_host )
+        self.addLink( STLS, STLS_host )
+        self.addLink( NWOR, NWOR_host )
+        self.addLink( HSTN, HSTN_host )
+        self.addLink( SNAN, SNAN_host )
+        self.addLink( DLLS, DLLS_host )
+        self.addLink( ORLD, ORLD_host )
+        self.addLink( DNVR, DNVR_host )
+        self.addLink( KSCY, KSCY_host )
+        self.addLink( SNFN, SNFN_host )
+        self.addLink( SCRM, SCRM_host )
+        self.addLink( PTLD, PTLD_host )
+        self.addLink( STTL, STTL_host )
+        self.addLink( SLKC, SLKC_host )
+        self.addLink( LA03, LA03_host )
+        self.addLink( SNDG, SNDG_host )
+        self.addLink( PHNX, PHNX_host )
 
         # add edges between switches
-        self.addLink( NY54 , CMBR, bw=10, delay='0.979030824185ms')
-        self.addLink( NY54 , CHCG, bw=10, delay='0.806374975652ms')
-        self.addLink( NY54 , PHLA, bw=10, delay='0.686192970166ms')
-        self.addLink( NY54 , WASH, bw=10, delay='0.605826192092ms')
-        self.addLink( CMBR , PHLA, bw=10, delay='1.4018238197ms')
-        self.addLink( CHCG , CLEV, bw=10, delay='0.232315346482ms')
-        self.addLink( CHCG , PHLA, bw=10, delay='1.07297714274ms')
-        self.addLink( CHCG , STLS, bw=10, delay='1.12827896944ms')
-        self.addLink( CHCG , DNVR, bw=10, delay='1.35964770335ms')
-        self.addLink( CHCG , KSCY, bw=10, delay='1.5199778541ms')
-        self.addLink( CHCG , SNFN, bw=10, delay='0.620743405435ms')
-        self.addLink( CHCG , STTL, bw=10, delay='0.93027212534ms')
-        self.addLink( CHCG , SLKC, bw=10, delay='0.735621751348ms')
-        self.addLink( CLEV , NSVL, bw=10, delay='0.523419372248ms')
-        self.addLink( CLEV , STLS, bw=10, delay='1.00360290845ms')
-        self.addLink( CLEV , PHLA, bw=10, delay='0.882912133249ms')
-        self.addLink( RLGH , ATLN, bw=10, delay='1.1644489729ms')
-        self.addLink( RLGH , WASH, bw=10, delay='1.48176810502ms')
-        self.addLink( ATLN , WASH, bw=10, delay='0.557636936322ms')
-        self.addLink( ATLN , NSVL, bw=10, delay='1.32869749865ms')
-        self.addLink( ATLN , STLS, bw=10, delay='0.767705554748ms')
-        self.addLink( ATLN , DLLS, bw=10, delay='0.544782086448ms')
-        self.addLink( ATLN , ORLD, bw=10, delay='1.46119152532ms')
-        self.addLink( PHLA , WASH, bw=10, delay='0.372209320106ms')
-        self.addLink( NSVL , STLS, bw=10, delay='1.43250491305ms')
-        self.addLink( NSVL , DLLS, bw=10, delay='1.67698215288ms')
-        self.addLink( STLS , DLLS, bw=10, delay='0.256389964194ms')
-        self.addLink( STLS , KSCY, bw=10, delay='0.395511571791ms')
-        self.addLink( STLS , LA03, bw=10, delay='0.257085227363ms')
-        self.addLink( NWOR , HSTN, bw=10, delay='0.0952906633914ms')
-        self.addLink( NWOR , DLLS, bw=10, delay='1.60231329739ms')
-        self.addLink( NWOR , ORLD, bw=10, delay='0.692731063896ms')
-        self.addLink( HSTN , SNAN, bw=10, delay='0.284150653798ms')
-        self.addLink( HSTN , DLLS, bw=10, delay='1.65690128332ms')
-        self.addLink( HSTN , ORLD, bw=10, delay='0.731886304782ms')
-        self.addLink( SNAN , PHNX, bw=10, delay='1.34258627257ms')
-        self.addLink( SNAN , DLLS, bw=10, delay='1.50063532341ms')
-        self.addLink( DLLS , DNVR, bw=10, delay='0.251471593235ms')
-        self.addLink( DLLS , KSCY, bw=10, delay='0.18026026737ms')
-        self.addLink( DLLS , SNFN, bw=10, delay='0.74304274592ms')
-        self.addLink( DLLS , LA03, bw=10, delay='0.506439293357ms')
-        self.addLink( DNVR , KSCY, bw=10, delay='0.223328790403ms')
-        self.addLink( DNVR , SNFN, bw=10, delay='0.889017541903ms')
-        self.addLink( DNVR , SLKC, bw=10, delay='0.631898982721ms')
-        self.addLink( KSCY , SNFN, bw=10, delay='0.922778522233ms')
-        self.addLink( SNFN , SCRM, bw=10, delay='0.630352278097ms')
-        self.addLink( SNFN , PTLD, bw=10, delay='0.828572513655ms')
-        self.addLink( SNFN , STTL, bw=10, delay='1.54076081649ms')
-        self.addLink( SNFN , SLKC, bw=10, delay='0.621507502625ms')
-        self.addLink( SNFN , LA03, bw=10, delay='0.602936230151ms')
-        self.addLink( SCRM , SLKC, bw=10, delay='0.461350343644ms')
-        self.addLink( PTLD , STTL, bw=10, delay='1.17591515181ms')
-        self.addLink( SLKC , LA03, bw=10, delay='0.243225267023ms')
-        self.addLink( LA03 , SNDG, bw=10, delay='0.681264950821ms')
-        self.addLink( LA03 , PHNX, bw=10, delay='0.343709457969ms')
-        self.addLink( SNDG , PHNX, bw=10, delay='0.345064487693ms')
+        self.addLink( NY54, CMBR, bw=10, delay='0.979030824185ms' )
+        self.addLink( NY54, CHCG, bw=10, delay='0.806374975652ms' )
+        self.addLink( NY54, PHLA, bw=10, delay='0.686192970166ms' )
+        self.addLink( NY54, WASH, bw=10, delay='0.605826192092ms' )
+        self.addLink( CMBR, PHLA, bw=10, delay='1.4018238197ms' )
+        self.addLink( CHCG, CLEV, bw=10, delay='0.232315346482ms' )
+        self.addLink( CHCG, PHLA, bw=10, delay='1.07297714274ms' )
+        self.addLink( CHCG, STLS, bw=10, delay='1.12827896944ms' )
+        self.addLink( CHCG, DNVR, bw=10, delay='1.35964770335ms' )
+        self.addLink( CHCG, KSCY, bw=10, delay='1.5199778541ms' )
+        self.addLink( CHCG, SNFN, bw=10, delay='0.620743405435ms' )
+        self.addLink( CHCG, STTL, bw=10, delay='0.93027212534ms' )
+        self.addLink( CHCG, SLKC, bw=10, delay='0.735621751348ms' )
+        self.addLink( CLEV, NSVL, bw=10, delay='0.523419372248ms' )
+        self.addLink( CLEV, STLS, bw=10, delay='1.00360290845ms' )
+        self.addLink( CLEV, PHLA, bw=10, delay='0.882912133249ms' )
+        self.addLink( RLGH, ATLN, bw=10, delay='1.1644489729ms' )
+        self.addLink( RLGH, WASH, bw=10, delay='1.48176810502ms' )
+        self.addLink( ATLN, WASH, bw=10, delay='0.557636936322ms' )
+        self.addLink( ATLN, NSVL, bw=10, delay='1.32869749865ms' )
+        self.addLink( ATLN, STLS, bw=10, delay='0.767705554748ms' )
+        self.addLink( ATLN, DLLS, bw=10, delay='0.544782086448ms' )
+        self.addLink( ATLN, ORLD, bw=10, delay='1.46119152532ms' )
+        self.addLink( PHLA, WASH, bw=10, delay='0.372209320106ms' )
+        self.addLink( NSVL, STLS, bw=10, delay='1.43250491305ms' )
+        self.addLink( NSVL, DLLS, bw=10, delay='1.67698215288ms' )
+        self.addLink( STLS, DLLS, bw=10, delay='0.256389964194ms' )
+        self.addLink( STLS, KSCY, bw=10, delay='0.395511571791ms' )
+        self.addLink( STLS, LA03, bw=10, delay='0.257085227363ms' )
+        self.addLink( NWOR, HSTN, bw=10, delay='0.0952906633914ms' )
+        self.addLink( NWOR, DLLS, bw=10, delay='1.60231329739ms' )
+        self.addLink( NWOR, ORLD, bw=10, delay='0.692731063896ms' )
+        self.addLink( HSTN, SNAN, bw=10, delay='0.284150653798ms' )
+        self.addLink( HSTN, DLLS, bw=10, delay='1.65690128332ms' )
+        self.addLink( HSTN, ORLD, bw=10, delay='0.731886304782ms' )
+        self.addLink( SNAN, PHNX, bw=10, delay='1.34258627257ms' )
+        self.addLink( SNAN, DLLS, bw=10, delay='1.50063532341ms' )
+        self.addLink( DLLS, DNVR, bw=10, delay='0.251471593235ms' )
+        self.addLink( DLLS, KSCY, bw=10, delay='0.18026026737ms' )
+        self.addLink( DLLS, SNFN, bw=10, delay='0.74304274592ms' )
+        self.addLink( DLLS, LA03, bw=10, delay='0.506439293357ms' )
+        self.addLink( DNVR, KSCY, bw=10, delay='0.223328790403ms' )
+        self.addLink( DNVR, SNFN, bw=10, delay='0.889017541903ms' )
+        self.addLink( DNVR, SLKC, bw=10, delay='0.631898982721ms' )
+        self.addLink( KSCY, SNFN, bw=10, delay='0.922778522233ms' )
+        self.addLink( SNFN, SCRM, bw=10, delay='0.630352278097ms' )
+        self.addLink( SNFN, PTLD, bw=10, delay='0.828572513655ms' )
+        self.addLink( SNFN, STTL, bw=10, delay='1.54076081649ms' )
+        self.addLink( SNFN, SLKC, bw=10, delay='0.621507502625ms' )
+        self.addLink( SNFN, LA03, bw=10, delay='0.602936230151ms' )
+        self.addLink( SCRM, SLKC, bw=10, delay='0.461350343644ms' )
+        self.addLink( PTLD, STTL, bw=10, delay='1.17591515181ms' )
+        self.addLink( SLKC, LA03, bw=10, delay='0.243225267023ms' )
+        self.addLink( LA03, SNDG, bw=10, delay='0.681264950821ms' )
+        self.addLink( LA03, PHNX, bw=10, delay='0.343709457969ms' )
+        self.addLink( SNDG, PHNX, bw=10, delay='0.345064487693ms' )
 
 topos = { 'att': ( lambda: attTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = attTopo()
-    #if controller_ip == '':
-        #controller_ip = '10.0.2.2';
+    # if controller_ip == '':
+    # controller_ip = '10.0.2.2';
     #    controller_ip = '127.0.0.1';
-    network = Mininet(topo=topo, link=TCLink, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, link=TCLink, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoAttIpv6.py b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoAttIpv6.py
old mode 100755
new mode 100644
index 44133c6..8475efc
--- a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoAttIpv6.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoAttIpv6.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Custom topology for Mininet
 """
@@ -35,13 +34,16 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='1000::1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class attTopo( Topo ):
 
     def __init__( self, **opts ):
@@ -104,106 +106,107 @@
         PHNX_host = self.addHost( 'h25', ip='10.1.0.25/24', cls=dualStackHost, v6Addr='1000::25/64' )
 
         # add edges between switch and corresponding host
-        self.addLink( NY54 , NY54_host )
-        self.addLink( CMBR , CMBR_host )
-        self.addLink( CHCG , CHCG_host )
-        self.addLink( CLEV , CLEV_host )
-        self.addLink( RLGH , RLGH_host )
-        self.addLink( ATLN , ATLN_host )
-        self.addLink( PHLA , PHLA_host )
-        self.addLink( WASH , WASH_host )
-        self.addLink( NSVL , NSVL_host )
-        self.addLink( STLS , STLS_host )
-        self.addLink( NWOR , NWOR_host )
-        self.addLink( HSTN , HSTN_host )
-        self.addLink( SNAN , SNAN_host )
-        self.addLink( DLLS , DLLS_host )
-        self.addLink( ORLD , ORLD_host )
-        self.addLink( DNVR , DNVR_host )
-        self.addLink( KSCY , KSCY_host )
-        self.addLink( SNFN , SNFN_host )
-        self.addLink( SCRM , SCRM_host )
-        self.addLink( PTLD , PTLD_host )
-        self.addLink( STTL , STTL_host )
-        self.addLink( SLKC , SLKC_host )
-        self.addLink( LA03 , LA03_host )
-        self.addLink( SNDG , SNDG_host )
-        self.addLink( PHNX , PHNX_host )
+        self.addLink( NY54, NY54_host )
+        self.addLink( CMBR, CMBR_host )
+        self.addLink( CHCG, CHCG_host )
+        self.addLink( CLEV, CLEV_host )
+        self.addLink( RLGH, RLGH_host )
+        self.addLink( ATLN, ATLN_host )
+        self.addLink( PHLA, PHLA_host )
+        self.addLink( WASH, WASH_host )
+        self.addLink( NSVL, NSVL_host )
+        self.addLink( STLS, STLS_host )
+        self.addLink( NWOR, NWOR_host )
+        self.addLink( HSTN, HSTN_host )
+        self.addLink( SNAN, SNAN_host )
+        self.addLink( DLLS, DLLS_host )
+        self.addLink( ORLD, ORLD_host )
+        self.addLink( DNVR, DNVR_host )
+        self.addLink( KSCY, KSCY_host )
+        self.addLink( SNFN, SNFN_host )
+        self.addLink( SCRM, SCRM_host )
+        self.addLink( PTLD, PTLD_host )
+        self.addLink( STTL, STTL_host )
+        self.addLink( SLKC, SLKC_host )
+        self.addLink( LA03, LA03_host )
+        self.addLink( SNDG, SNDG_host )
+        self.addLink( PHNX, PHNX_host )
 
         # add edges between switches
-        self.addLink( NY54 , CMBR, bw=10, delay='0.979030824185ms')
-        self.addLink( NY54 , CHCG, bw=10, delay='0.806374975652ms')
-        self.addLink( NY54 , PHLA, bw=10, delay='0.686192970166ms')
-        self.addLink( NY54 , WASH, bw=10, delay='0.605826192092ms')
-        self.addLink( CMBR , PHLA, bw=10, delay='1.4018238197ms')
-        self.addLink( CHCG , CLEV, bw=10, delay='0.232315346482ms')
-        self.addLink( CHCG , PHLA, bw=10, delay='1.07297714274ms')
-        self.addLink( CHCG , STLS, bw=10, delay='1.12827896944ms')
-        self.addLink( CHCG , DNVR, bw=10, delay='1.35964770335ms')
-        self.addLink( CHCG , KSCY, bw=10, delay='1.5199778541ms')
-        self.addLink( CHCG , SNFN, bw=10, delay='0.620743405435ms')
-        self.addLink( CHCG , STTL, bw=10, delay='0.93027212534ms')
-        self.addLink( CHCG , SLKC, bw=10, delay='0.735621751348ms')
-        self.addLink( CLEV , NSVL, bw=10, delay='0.523419372248ms')
-        self.addLink( CLEV , STLS, bw=10, delay='1.00360290845ms')
-        self.addLink( CLEV , PHLA, bw=10, delay='0.882912133249ms')
-        self.addLink( RLGH , ATLN, bw=10, delay='1.1644489729ms')
-        self.addLink( RLGH , WASH, bw=10, delay='1.48176810502ms')
-        self.addLink( ATLN , WASH, bw=10, delay='0.557636936322ms')
-        self.addLink( ATLN , NSVL, bw=10, delay='1.32869749865ms')
-        self.addLink( ATLN , STLS, bw=10, delay='0.767705554748ms')
-        self.addLink( ATLN , DLLS, bw=10, delay='0.544782086448ms')
-        self.addLink( ATLN , ORLD, bw=10, delay='1.46119152532ms')
-        self.addLink( PHLA , WASH, bw=10, delay='0.372209320106ms')
-        self.addLink( NSVL , STLS, bw=10, delay='1.43250491305ms')
-        self.addLink( NSVL , DLLS, bw=10, delay='1.67698215288ms')
-        self.addLink( STLS , DLLS, bw=10, delay='0.256389964194ms')
-        self.addLink( STLS , KSCY, bw=10, delay='0.395511571791ms')
-        self.addLink( STLS , LA03, bw=10, delay='0.257085227363ms')
-        self.addLink( NWOR , HSTN, bw=10, delay='0.0952906633914ms')
-        self.addLink( NWOR , DLLS, bw=10, delay='1.60231329739ms')
-        self.addLink( NWOR , ORLD, bw=10, delay='0.692731063896ms')
-        self.addLink( HSTN , SNAN, bw=10, delay='0.284150653798ms')
-        self.addLink( HSTN , DLLS, bw=10, delay='1.65690128332ms')
-        self.addLink( HSTN , ORLD, bw=10, delay='0.731886304782ms')
-        self.addLink( SNAN , PHNX, bw=10, delay='1.34258627257ms')
-        self.addLink( SNAN , DLLS, bw=10, delay='1.50063532341ms')
-        self.addLink( DLLS , DNVR, bw=10, delay='0.251471593235ms')
-        self.addLink( DLLS , KSCY, bw=10, delay='0.18026026737ms')
-        self.addLink( DLLS , SNFN, bw=10, delay='0.74304274592ms')
-        self.addLink( DLLS , LA03, bw=10, delay='0.506439293357ms')
-        self.addLink( DNVR , KSCY, bw=10, delay='0.223328790403ms')
-        self.addLink( DNVR , SNFN, bw=10, delay='0.889017541903ms')
-        self.addLink( DNVR , SLKC, bw=10, delay='0.631898982721ms')
-        self.addLink( KSCY , SNFN, bw=10, delay='0.922778522233ms')
-        self.addLink( SNFN , SCRM, bw=10, delay='0.630352278097ms')
-        self.addLink( SNFN , PTLD, bw=10, delay='0.828572513655ms')
-        self.addLink( SNFN , STTL, bw=10, delay='1.54076081649ms')
-        self.addLink( SNFN , SLKC, bw=10, delay='0.621507502625ms')
-        self.addLink( SNFN , LA03, bw=10, delay='0.602936230151ms')
-        self.addLink( SCRM , SLKC, bw=10, delay='0.461350343644ms')
-        self.addLink( PTLD , STTL, bw=10, delay='1.17591515181ms')
-        self.addLink( SLKC , LA03, bw=10, delay='0.243225267023ms')
-        self.addLink( LA03 , SNDG, bw=10, delay='0.681264950821ms')
-        self.addLink( LA03 , PHNX, bw=10, delay='0.343709457969ms')
-        self.addLink( SNDG , PHNX, bw=10, delay='0.345064487693ms')
+        self.addLink( NY54, CMBR, bw=10, delay='0.979030824185ms' )
+        self.addLink( NY54, CHCG, bw=10, delay='0.806374975652ms' )
+        self.addLink( NY54, PHLA, bw=10, delay='0.686192970166ms' )
+        self.addLink( NY54, WASH, bw=10, delay='0.605826192092ms' )
+        self.addLink( CMBR, PHLA, bw=10, delay='1.4018238197ms' )
+        self.addLink( CHCG, CLEV, bw=10, delay='0.232315346482ms' )
+        self.addLink( CHCG, PHLA, bw=10, delay='1.07297714274ms' )
+        self.addLink( CHCG, STLS, bw=10, delay='1.12827896944ms' )
+        self.addLink( CHCG, DNVR, bw=10, delay='1.35964770335ms' )
+        self.addLink( CHCG, KSCY, bw=10, delay='1.5199778541ms' )
+        self.addLink( CHCG, SNFN, bw=10, delay='0.620743405435ms' )
+        self.addLink( CHCG, STTL, bw=10, delay='0.93027212534ms' )
+        self.addLink( CHCG, SLKC, bw=10, delay='0.735621751348ms' )
+        self.addLink( CLEV, NSVL, bw=10, delay='0.523419372248ms' )
+        self.addLink( CLEV, STLS, bw=10, delay='1.00360290845ms' )
+        self.addLink( CLEV, PHLA, bw=10, delay='0.882912133249ms' )
+        self.addLink( RLGH, ATLN, bw=10, delay='1.1644489729ms' )
+        self.addLink( RLGH, WASH, bw=10, delay='1.48176810502ms' )
+        self.addLink( ATLN, WASH, bw=10, delay='0.557636936322ms' )
+        self.addLink( ATLN, NSVL, bw=10, delay='1.32869749865ms' )
+        self.addLink( ATLN, STLS, bw=10, delay='0.767705554748ms' )
+        self.addLink( ATLN, DLLS, bw=10, delay='0.544782086448ms' )
+        self.addLink( ATLN, ORLD, bw=10, delay='1.46119152532ms' )
+        self.addLink( PHLA, WASH, bw=10, delay='0.372209320106ms' )
+        self.addLink( NSVL, STLS, bw=10, delay='1.43250491305ms' )
+        self.addLink( NSVL, DLLS, bw=10, delay='1.67698215288ms' )
+        self.addLink( STLS, DLLS, bw=10, delay='0.256389964194ms' )
+        self.addLink( STLS, KSCY, bw=10, delay='0.395511571791ms' )
+        self.addLink( STLS, LA03, bw=10, delay='0.257085227363ms' )
+        self.addLink( NWOR, HSTN, bw=10, delay='0.0952906633914ms' )
+        self.addLink( NWOR, DLLS, bw=10, delay='1.60231329739ms' )
+        self.addLink( NWOR, ORLD, bw=10, delay='0.692731063896ms' )
+        self.addLink( HSTN, SNAN, bw=10, delay='0.284150653798ms' )
+        self.addLink( HSTN, DLLS, bw=10, delay='1.65690128332ms' )
+        self.addLink( HSTN, ORLD, bw=10, delay='0.731886304782ms' )
+        self.addLink( SNAN, PHNX, bw=10, delay='1.34258627257ms' )
+        self.addLink( SNAN, DLLS, bw=10, delay='1.50063532341ms' )
+        self.addLink( DLLS, DNVR, bw=10, delay='0.251471593235ms' )
+        self.addLink( DLLS, KSCY, bw=10, delay='0.18026026737ms' )
+        self.addLink( DLLS, SNFN, bw=10, delay='0.74304274592ms' )
+        self.addLink( DLLS, LA03, bw=10, delay='0.506439293357ms' )
+        self.addLink( DNVR, KSCY, bw=10, delay='0.223328790403ms' )
+        self.addLink( DNVR, SNFN, bw=10, delay='0.889017541903ms' )
+        self.addLink( DNVR, SLKC, bw=10, delay='0.631898982721ms' )
+        self.addLink( KSCY, SNFN, bw=10, delay='0.922778522233ms' )
+        self.addLink( SNFN, SCRM, bw=10, delay='0.630352278097ms' )
+        self.addLink( SNFN, PTLD, bw=10, delay='0.828572513655ms' )
+        self.addLink( SNFN, STTL, bw=10, delay='1.54076081649ms' )
+        self.addLink( SNFN, SLKC, bw=10, delay='0.621507502625ms' )
+        self.addLink( SNFN, LA03, bw=10, delay='0.602936230151ms' )
+        self.addLink( SCRM, SLKC, bw=10, delay='0.461350343644ms' )
+        self.addLink( PTLD, STTL, bw=10, delay='1.17591515181ms' )
+        self.addLink( SLKC, LA03, bw=10, delay='0.243225267023ms' )
+        self.addLink( LA03, SNDG, bw=10, delay='0.681264950821ms' )
+        self.addLink( LA03, PHNX, bw=10, delay='0.343709457969ms' )
+        self.addLink( SNDG, PHNX, bw=10, delay='0.345064487693ms' )
 
 topos = { 'att': ( lambda: attTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = attTopo()
-    #if controller_ip == '':
-        #controller_ip = '10.0.2.2';
+    # if controller_ip == '':
+    # controller_ip = '10.0.2.2';
     #    controller_ip = '127.0.0.1';
-    network = Mininet(topo=topo, link=TCLink, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, link=TCLink, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoChordal.py b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoChordal.py
old mode 100755
new mode 100644
index 7515d8f..3cb030b
--- a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoChordal.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoChordal.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 from mininet.topo import Topo
 from mininet.net import Mininet
 from mininet.node import RemoteController
@@ -32,6 +31,7 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class chordalTopo( Topo ):
 
     def __init__( self, **opts ):
@@ -95,348 +95,349 @@
         s25_host = self.addHost( 'h25' )
 
         # add edges between switch and corresponding host
-        self.addLink( s1 , s1_host )
-        self.addLink( s2 , s2_host )
-        self.addLink( s3 , s3_host )
-        self.addLink( s4 , s4_host )
-        self.addLink( s5 , s5_host )
-        self.addLink( s6 , s6_host )
-        self.addLink( s7 , s7_host )
-        self.addLink( s8 , s8_host )
-        self.addLink( s9 , s9_host )
-        self.addLink( s10 , s10_host )
-        self.addLink( s11 , s11_host )
-        self.addLink( s12 , s12_host )
-        self.addLink( s13 , s13_host )
-        self.addLink( s14 , s14_host )
-        self.addLink( s15 , s15_host )
-        self.addLink( s16 , s16_host )
-        self.addLink( s17 , s17_host )
-        self.addLink( s18 , s18_host )
-        self.addLink( s19 , s19_host )
-        self.addLink( s20 , s20_host )
-        self.addLink( s21 , s21_host )
-        self.addLink( s22 , s22_host )
-        self.addLink( s23 , s23_host )
-        self.addLink( s24 , s24_host )
-        self.addLink( s25 , s25_host )
-        self.addLink(s1, s2)
-        self.addLink(s1, s3)
-        self.addLink(s1, s4)
-        self.addLink(s1, s5)
-        self.addLink(s1, s6)
-        self.addLink(s1, s7)
-        self.addLink(s1, s8)
-        self.addLink(s1, s9)
-        self.addLink(s1, s10)
-        self.addLink(s1, s11)
-        self.addLink(s1, s12)
-        self.addLink(s1, s13)
-        self.addLink(s1, s14)
-        self.addLink(s1, s15)
-        self.addLink(s1, s16)
-        self.addLink(s1, s17)
-        self.addLink(s1, s18)
-        self.addLink(s1, s19)
-        self.addLink(s1, s20)
-        self.addLink(s1, s21)
-        self.addLink(s1, s22)
-        self.addLink(s1, s23)
-        self.addLink(s1, s24)
-        self.addLink(s1, s25)
-        self.addLink(s2, s3)
-        self.addLink(s2, s4)
-        self.addLink(s2, s5)
-        self.addLink(s2, s6)
-        self.addLink(s2, s7)
-        self.addLink(s2, s8)
-        self.addLink(s2, s9)
-        self.addLink(s2, s10)
-        self.addLink(s2, s11)
-        self.addLink(s2, s12)
-        self.addLink(s2, s13)
-        self.addLink(s2, s14)
-        self.addLink(s2, s15)
-        self.addLink(s2, s16)
-        self.addLink(s2, s17)
-        self.addLink(s2, s18)
-        self.addLink(s2, s19)
-        self.addLink(s2, s20)
-        self.addLink(s2, s21)
-        self.addLink(s2, s22)
-        self.addLink(s2, s23)
-        self.addLink(s2, s24)
-        self.addLink(s2, s25)
-        self.addLink(s3, s4)
-        self.addLink(s3, s5)
-        self.addLink(s3, s6)
-        self.addLink(s3, s7)
-        self.addLink(s3, s8)
-        self.addLink(s3, s9)
-        self.addLink(s3, s10)
-        self.addLink(s3, s11)
-        self.addLink(s3, s12)
-        self.addLink(s3, s13)
-        self.addLink(s3, s14)
-        self.addLink(s3, s15)
-        self.addLink(s3, s16)
-        self.addLink(s3, s17)
-        self.addLink(s3, s18)
-        self.addLink(s3, s19)
-        self.addLink(s3, s20)
-        self.addLink(s3, s21)
-        self.addLink(s3, s22)
-        self.addLink(s3, s23)
-        self.addLink(s3, s24)
-        self.addLink(s3, s25)
-        self.addLink(s4, s5)
-        self.addLink(s4, s6)
-        self.addLink(s4, s7)
-        self.addLink(s4, s8)
-        self.addLink(s4, s9)
-        self.addLink(s4, s10)
-        self.addLink(s4, s11)
-        self.addLink(s4, s12)
-        self.addLink(s4, s13)
-        self.addLink(s4, s14)
-        self.addLink(s4, s15)
-        self.addLink(s4, s16)
-        self.addLink(s4, s17)
-        self.addLink(s4, s18)
-        self.addLink(s4, s19)
-        self.addLink(s4, s20)
-        self.addLink(s4, s21)
-        self.addLink(s4, s22)
-        self.addLink(s4, s23)
-        self.addLink(s4, s24)
-        self.addLink(s4, s25)
-        self.addLink(s5, s6)
-        self.addLink(s5, s7)
-        self.addLink(s5, s8)
-        self.addLink(s5, s9)
-        self.addLink(s5, s10)
-        self.addLink(s5, s11)
-        self.addLink(s5, s12)
-        self.addLink(s5, s13)
-        self.addLink(s5, s14)
-        self.addLink(s5, s15)
-        self.addLink(s5, s16)
-        self.addLink(s5, s17)
-        self.addLink(s5, s18)
-        self.addLink(s5, s19)
-        self.addLink(s5, s20)
-        self.addLink(s5, s21)
-        self.addLink(s5, s22)
-        self.addLink(s5, s23)
-        self.addLink(s5, s24)
-        self.addLink(s5, s25)
-        self.addLink(s6, s7)
-        self.addLink(s6, s8)
-        self.addLink(s6, s9)
-        self.addLink(s6, s10)
-        self.addLink(s6, s11)
-        self.addLink(s6, s12)
-        self.addLink(s6, s13)
-        self.addLink(s6, s14)
-        self.addLink(s6, s15)
-        self.addLink(s6, s16)
-        self.addLink(s6, s17)
-        self.addLink(s6, s18)
-        self.addLink(s6, s19)
-        self.addLink(s6, s20)
-        self.addLink(s6, s21)
-        self.addLink(s6, s22)
-        self.addLink(s6, s23)
-        self.addLink(s6, s24)
-        self.addLink(s6, s25)
-        self.addLink(s7, s8)
-        self.addLink(s7, s9)
-        self.addLink(s7, s10)
-        self.addLink(s7, s11)
-        self.addLink(s7, s12)
-        self.addLink(s7, s13)
-        self.addLink(s7, s14)
-        self.addLink(s7, s15)
-        self.addLink(s7, s16)
-        self.addLink(s7, s17)
-        self.addLink(s7, s18)
-        self.addLink(s7, s19)
-        self.addLink(s7, s20)
-        self.addLink(s7, s21)
-        self.addLink(s7, s22)
-        self.addLink(s7, s23)
-        self.addLink(s7, s24)
-        self.addLink(s7, s25)
-        self.addLink(s8, s9)
-        self.addLink(s8, s10)
-        self.addLink(s8, s11)
-        self.addLink(s8, s12)
-        self.addLink(s8, s13)
-        self.addLink(s8, s14)
-        self.addLink(s8, s15)
-        self.addLink(s8, s16)
-        self.addLink(s8, s17)
-        self.addLink(s8, s18)
-        self.addLink(s8, s19)
-        self.addLink(s8, s20)
-        self.addLink(s8, s21)
-        self.addLink(s8, s22)
-        self.addLink(s8, s23)
-        self.addLink(s8, s24)
-        self.addLink(s8, s25)
-        self.addLink(s9, s10)
-        self.addLink(s9, s11)
-        self.addLink(s9, s12)
-        self.addLink(s9, s13)
-        self.addLink(s9, s14)
-        self.addLink(s9, s15)
-        self.addLink(s9, s16)
-        self.addLink(s9, s17)
-        self.addLink(s9, s18)
-        self.addLink(s9, s19)
-        self.addLink(s9, s20)
-        self.addLink(s9, s21)
-        self.addLink(s9, s22)
-        self.addLink(s9, s23)
-        self.addLink(s9, s24)
-        self.addLink(s9, s25)
-        self.addLink(s10, s11)
-        self.addLink(s10, s12)
-        self.addLink(s10, s13)
-        self.addLink(s10, s14)
-        self.addLink(s10, s15)
-        self.addLink(s10, s16)
-        self.addLink(s10, s17)
-        self.addLink(s10, s18)
-        self.addLink(s10, s19)
-        self.addLink(s10, s20)
-        self.addLink(s10, s21)
-        self.addLink(s10, s22)
-        self.addLink(s10, s23)
-        self.addLink(s10, s24)
-        self.addLink(s10, s25)
-        self.addLink(s11, s12)
-        self.addLink(s11, s13)
-        self.addLink(s11, s14)
-        self.addLink(s11, s15)
-        self.addLink(s11, s16)
-        self.addLink(s11, s17)
-        self.addLink(s11, s18)
-        self.addLink(s11, s19)
-        self.addLink(s11, s20)
-        self.addLink(s11, s21)
-        self.addLink(s11, s22)
-        self.addLink(s11, s23)
-        self.addLink(s11, s24)
-        self.addLink(s11, s25)
-        self.addLink(s12, s13)
-        self.addLink(s12, s14)
-        self.addLink(s12, s15)
-        self.addLink(s12, s16)
-        self.addLink(s12, s17)
-        self.addLink(s12, s18)
-        self.addLink(s12, s19)
-        self.addLink(s12, s20)
-        self.addLink(s12, s21)
-        self.addLink(s12, s22)
-        self.addLink(s12, s23)
-        self.addLink(s12, s24)
-        self.addLink(s12, s25)
-        self.addLink(s13, s14)
-        self.addLink(s13, s15)
-        self.addLink(s13, s16)
-        self.addLink(s13, s17)
-        self.addLink(s13, s18)
-        self.addLink(s13, s19)
-        self.addLink(s13, s20)
-        self.addLink(s13, s21)
-        self.addLink(s13, s22)
-        self.addLink(s13, s23)
-        self.addLink(s13, s24)
-        self.addLink(s13, s25)
-        self.addLink(s14, s15)
-        self.addLink(s14, s16)
-        self.addLink(s14, s17)
-        self.addLink(s14, s18)
-        self.addLink(s14, s19)
-        self.addLink(s14, s20)
-        self.addLink(s14, s21)
-        self.addLink(s14, s22)
-        self.addLink(s14, s23)
-        self.addLink(s14, s24)
-        self.addLink(s14, s25)
-        self.addLink(s15, s16)
-        self.addLink(s15, s17)
-        self.addLink(s15, s18)
-        self.addLink(s15, s19)
-        self.addLink(s15, s20)
-        self.addLink(s15, s21)
-        self.addLink(s15, s22)
-        self.addLink(s15, s23)
-        self.addLink(s15, s24)
-        self.addLink(s15, s25)
-        self.addLink(s16, s17)
-        self.addLink(s16, s18)
-        self.addLink(s16, s19)
-        self.addLink(s16, s20)
-        self.addLink(s16, s21)
-        self.addLink(s16, s22)
-        self.addLink(s16, s23)
-        self.addLink(s16, s24)
-        self.addLink(s16, s25)
-        self.addLink(s17, s18)
-        self.addLink(s17, s19)
-        self.addLink(s17, s20)
-        self.addLink(s17, s21)
-        self.addLink(s17, s22)
-        self.addLink(s17, s23)
-        self.addLink(s17, s24)
-        self.addLink(s17, s25)
-        self.addLink(s18, s19)
-        self.addLink(s18, s20)
-        self.addLink(s18, s21)
-        self.addLink(s18, s22)
-        self.addLink(s18, s23)
-        self.addLink(s18, s24)
-        self.addLink(s18, s25)
-        self.addLink(s19, s20)
-        self.addLink(s19, s21)
-        self.addLink(s19, s22)
-        self.addLink(s19, s23)
-        self.addLink(s19, s24)
-        self.addLink(s19, s25)
-        self.addLink(s20, s21)
-        self.addLink(s20, s22)
-        self.addLink(s20, s23)
-        self.addLink(s20, s24)
-        self.addLink(s20, s25)
-        self.addLink(s21, s22)
-        self.addLink(s21, s23)
-        self.addLink(s21, s24)
-        self.addLink(s21, s25)
-        self.addLink(s22, s23)
-        self.addLink(s22, s24)
-        self.addLink(s22, s25)
-        self.addLink(s23, s24)
-        self.addLink(s23, s25)
-        self.addLink(s24, s25)
+        self.addLink( s1, s1_host )
+        self.addLink( s2, s2_host )
+        self.addLink( s3, s3_host )
+        self.addLink( s4, s4_host )
+        self.addLink( s5, s5_host )
+        self.addLink( s6, s6_host )
+        self.addLink( s7, s7_host )
+        self.addLink( s8, s8_host )
+        self.addLink( s9, s9_host )
+        self.addLink( s10, s10_host )
+        self.addLink( s11, s11_host )
+        self.addLink( s12, s12_host )
+        self.addLink( s13, s13_host )
+        self.addLink( s14, s14_host )
+        self.addLink( s15, s15_host )
+        self.addLink( s16, s16_host )
+        self.addLink( s17, s17_host )
+        self.addLink( s18, s18_host )
+        self.addLink( s19, s19_host )
+        self.addLink( s20, s20_host )
+        self.addLink( s21, s21_host )
+        self.addLink( s22, s22_host )
+        self.addLink( s23, s23_host )
+        self.addLink( s24, s24_host )
+        self.addLink( s25, s25_host )
+        self.addLink( s1, s2 )
+        self.addLink( s1, s3 )
+        self.addLink( s1, s4 )
+        self.addLink( s1, s5 )
+        self.addLink( s1, s6 )
+        self.addLink( s1, s7 )
+        self.addLink( s1, s8 )
+        self.addLink( s1, s9 )
+        self.addLink( s1, s10 )
+        self.addLink( s1, s11 )
+        self.addLink( s1, s12 )
+        self.addLink( s1, s13 )
+        self.addLink( s1, s14 )
+        self.addLink( s1, s15 )
+        self.addLink( s1, s16 )
+        self.addLink( s1, s17 )
+        self.addLink( s1, s18 )
+        self.addLink( s1, s19 )
+        self.addLink( s1, s20 )
+        self.addLink( s1, s21 )
+        self.addLink( s1, s22 )
+        self.addLink( s1, s23 )
+        self.addLink( s1, s24 )
+        self.addLink( s1, s25 )
+        self.addLink( s2, s3 )
+        self.addLink( s2, s4 )
+        self.addLink( s2, s5 )
+        self.addLink( s2, s6 )
+        self.addLink( s2, s7 )
+        self.addLink( s2, s8 )
+        self.addLink( s2, s9 )
+        self.addLink( s2, s10 )
+        self.addLink( s2, s11 )
+        self.addLink( s2, s12 )
+        self.addLink( s2, s13 )
+        self.addLink( s2, s14 )
+        self.addLink( s2, s15 )
+        self.addLink( s2, s16 )
+        self.addLink( s2, s17 )
+        self.addLink( s2, s18 )
+        self.addLink( s2, s19 )
+        self.addLink( s2, s20 )
+        self.addLink( s2, s21 )
+        self.addLink( s2, s22 )
+        self.addLink( s2, s23 )
+        self.addLink( s2, s24 )
+        self.addLink( s2, s25 )
+        self.addLink( s3, s4 )
+        self.addLink( s3, s5 )
+        self.addLink( s3, s6 )
+        self.addLink( s3, s7 )
+        self.addLink( s3, s8 )
+        self.addLink( s3, s9 )
+        self.addLink( s3, s10 )
+        self.addLink( s3, s11 )
+        self.addLink( s3, s12 )
+        self.addLink( s3, s13 )
+        self.addLink( s3, s14 )
+        self.addLink( s3, s15 )
+        self.addLink( s3, s16 )
+        self.addLink( s3, s17 )
+        self.addLink( s3, s18 )
+        self.addLink( s3, s19 )
+        self.addLink( s3, s20 )
+        self.addLink( s3, s21 )
+        self.addLink( s3, s22 )
+        self.addLink( s3, s23 )
+        self.addLink( s3, s24 )
+        self.addLink( s3, s25 )
+        self.addLink( s4, s5 )
+        self.addLink( s4, s6 )
+        self.addLink( s4, s7 )
+        self.addLink( s4, s8 )
+        self.addLink( s4, s9 )
+        self.addLink( s4, s10 )
+        self.addLink( s4, s11 )
+        self.addLink( s4, s12 )
+        self.addLink( s4, s13 )
+        self.addLink( s4, s14 )
+        self.addLink( s4, s15 )
+        self.addLink( s4, s16 )
+        self.addLink( s4, s17 )
+        self.addLink( s4, s18 )
+        self.addLink( s4, s19 )
+        self.addLink( s4, s20 )
+        self.addLink( s4, s21 )
+        self.addLink( s4, s22 )
+        self.addLink( s4, s23 )
+        self.addLink( s4, s24 )
+        self.addLink( s4, s25 )
+        self.addLink( s5, s6 )
+        self.addLink( s5, s7 )
+        self.addLink( s5, s8 )
+        self.addLink( s5, s9 )
+        self.addLink( s5, s10 )
+        self.addLink( s5, s11 )
+        self.addLink( s5, s12 )
+        self.addLink( s5, s13 )
+        self.addLink( s5, s14 )
+        self.addLink( s5, s15 )
+        self.addLink( s5, s16 )
+        self.addLink( s5, s17 )
+        self.addLink( s5, s18 )
+        self.addLink( s5, s19 )
+        self.addLink( s5, s20 )
+        self.addLink( s5, s21 )
+        self.addLink( s5, s22 )
+        self.addLink( s5, s23 )
+        self.addLink( s5, s24 )
+        self.addLink( s5, s25 )
+        self.addLink( s6, s7 )
+        self.addLink( s6, s8 )
+        self.addLink( s6, s9 )
+        self.addLink( s6, s10 )
+        self.addLink( s6, s11 )
+        self.addLink( s6, s12 )
+        self.addLink( s6, s13 )
+        self.addLink( s6, s14 )
+        self.addLink( s6, s15 )
+        self.addLink( s6, s16 )
+        self.addLink( s6, s17 )
+        self.addLink( s6, s18 )
+        self.addLink( s6, s19 )
+        self.addLink( s6, s20 )
+        self.addLink( s6, s21 )
+        self.addLink( s6, s22 )
+        self.addLink( s6, s23 )
+        self.addLink( s6, s24 )
+        self.addLink( s6, s25 )
+        self.addLink( s7, s8 )
+        self.addLink( s7, s9 )
+        self.addLink( s7, s10 )
+        self.addLink( s7, s11 )
+        self.addLink( s7, s12 )
+        self.addLink( s7, s13 )
+        self.addLink( s7, s14 )
+        self.addLink( s7, s15 )
+        self.addLink( s7, s16 )
+        self.addLink( s7, s17 )
+        self.addLink( s7, s18 )
+        self.addLink( s7, s19 )
+        self.addLink( s7, s20 )
+        self.addLink( s7, s21 )
+        self.addLink( s7, s22 )
+        self.addLink( s7, s23 )
+        self.addLink( s7, s24 )
+        self.addLink( s7, s25 )
+        self.addLink( s8, s9 )
+        self.addLink( s8, s10 )
+        self.addLink( s8, s11 )
+        self.addLink( s8, s12 )
+        self.addLink( s8, s13 )
+        self.addLink( s8, s14 )
+        self.addLink( s8, s15 )
+        self.addLink( s8, s16 )
+        self.addLink( s8, s17 )
+        self.addLink( s8, s18 )
+        self.addLink( s8, s19 )
+        self.addLink( s8, s20 )
+        self.addLink( s8, s21 )
+        self.addLink( s8, s22 )
+        self.addLink( s8, s23 )
+        self.addLink( s8, s24 )
+        self.addLink( s8, s25 )
+        self.addLink( s9, s10 )
+        self.addLink( s9, s11 )
+        self.addLink( s9, s12 )
+        self.addLink( s9, s13 )
+        self.addLink( s9, s14 )
+        self.addLink( s9, s15 )
+        self.addLink( s9, s16 )
+        self.addLink( s9, s17 )
+        self.addLink( s9, s18 )
+        self.addLink( s9, s19 )
+        self.addLink( s9, s20 )
+        self.addLink( s9, s21 )
+        self.addLink( s9, s22 )
+        self.addLink( s9, s23 )
+        self.addLink( s9, s24 )
+        self.addLink( s9, s25 )
+        self.addLink( s10, s11 )
+        self.addLink( s10, s12 )
+        self.addLink( s10, s13 )
+        self.addLink( s10, s14 )
+        self.addLink( s10, s15 )
+        self.addLink( s10, s16 )
+        self.addLink( s10, s17 )
+        self.addLink( s10, s18 )
+        self.addLink( s10, s19 )
+        self.addLink( s10, s20 )
+        self.addLink( s10, s21 )
+        self.addLink( s10, s22 )
+        self.addLink( s10, s23 )
+        self.addLink( s10, s24 )
+        self.addLink( s10, s25 )
+        self.addLink( s11, s12 )
+        self.addLink( s11, s13 )
+        self.addLink( s11, s14 )
+        self.addLink( s11, s15 )
+        self.addLink( s11, s16 )
+        self.addLink( s11, s17 )
+        self.addLink( s11, s18 )
+        self.addLink( s11, s19 )
+        self.addLink( s11, s20 )
+        self.addLink( s11, s21 )
+        self.addLink( s11, s22 )
+        self.addLink( s11, s23 )
+        self.addLink( s11, s24 )
+        self.addLink( s11, s25 )
+        self.addLink( s12, s13 )
+        self.addLink( s12, s14 )
+        self.addLink( s12, s15 )
+        self.addLink( s12, s16 )
+        self.addLink( s12, s17 )
+        self.addLink( s12, s18 )
+        self.addLink( s12, s19 )
+        self.addLink( s12, s20 )
+        self.addLink( s12, s21 )
+        self.addLink( s12, s22 )
+        self.addLink( s12, s23 )
+        self.addLink( s12, s24 )
+        self.addLink( s12, s25 )
+        self.addLink( s13, s14 )
+        self.addLink( s13, s15 )
+        self.addLink( s13, s16 )
+        self.addLink( s13, s17 )
+        self.addLink( s13, s18 )
+        self.addLink( s13, s19 )
+        self.addLink( s13, s20 )
+        self.addLink( s13, s21 )
+        self.addLink( s13, s22 )
+        self.addLink( s13, s23 )
+        self.addLink( s13, s24 )
+        self.addLink( s13, s25 )
+        self.addLink( s14, s15 )
+        self.addLink( s14, s16 )
+        self.addLink( s14, s17 )
+        self.addLink( s14, s18 )
+        self.addLink( s14, s19 )
+        self.addLink( s14, s20 )
+        self.addLink( s14, s21 )
+        self.addLink( s14, s22 )
+        self.addLink( s14, s23 )
+        self.addLink( s14, s24 )
+        self.addLink( s14, s25 )
+        self.addLink( s15, s16 )
+        self.addLink( s15, s17 )
+        self.addLink( s15, s18 )
+        self.addLink( s15, s19 )
+        self.addLink( s15, s20 )
+        self.addLink( s15, s21 )
+        self.addLink( s15, s22 )
+        self.addLink( s15, s23 )
+        self.addLink( s15, s24 )
+        self.addLink( s15, s25 )
+        self.addLink( s16, s17 )
+        self.addLink( s16, s18 )
+        self.addLink( s16, s19 )
+        self.addLink( s16, s20 )
+        self.addLink( s16, s21 )
+        self.addLink( s16, s22 )
+        self.addLink( s16, s23 )
+        self.addLink( s16, s24 )
+        self.addLink( s16, s25 )
+        self.addLink( s17, s18 )
+        self.addLink( s17, s19 )
+        self.addLink( s17, s20 )
+        self.addLink( s17, s21 )
+        self.addLink( s17, s22 )
+        self.addLink( s17, s23 )
+        self.addLink( s17, s24 )
+        self.addLink( s17, s25 )
+        self.addLink( s18, s19 )
+        self.addLink( s18, s20 )
+        self.addLink( s18, s21 )
+        self.addLink( s18, s22 )
+        self.addLink( s18, s23 )
+        self.addLink( s18, s24 )
+        self.addLink( s18, s25 )
+        self.addLink( s19, s20 )
+        self.addLink( s19, s21 )
+        self.addLink( s19, s22 )
+        self.addLink( s19, s23 )
+        self.addLink( s19, s24 )
+        self.addLink( s19, s25 )
+        self.addLink( s20, s21 )
+        self.addLink( s20, s22 )
+        self.addLink( s20, s23 )
+        self.addLink( s20, s24 )
+        self.addLink( s20, s25 )
+        self.addLink( s21, s22 )
+        self.addLink( s21, s23 )
+        self.addLink( s21, s24 )
+        self.addLink( s21, s25 )
+        self.addLink( s22, s23 )
+        self.addLink( s22, s24 )
+        self.addLink( s22, s25 )
+        self.addLink( s23, s24 )
+        self.addLink( s23, s25 )
+        self.addLink( s24, s25 )
 
 topos = { 'chordal': ( lambda: chordalTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = chordalTopo()
-    #if controller_ip == '':
-        #controller_ip = '10.0.2.2';
+    # if controller_ip == '':
+    # controller_ip = '10.0.2.2';
     #    controller_ip = '127.0.0.1';
-    network = Mininet(topo=topo, switch=OVSSwitch,autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, switch=OVSSwitch, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoChordalIpv6.py b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoChordalIpv6.py
old mode 100755
new mode 100644
index 929949d..907fec9
--- a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoChordalIpv6.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoChordalIpv6.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 from mininet.topo import Topo
 from mininet.net import Mininet
 from mininet.node import Host, RemoteController
@@ -32,13 +31,16 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='1000::1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class chordalTopo( Topo ):
 
     def __init__( self, **opts ):
@@ -101,348 +103,349 @@
         s25_host = self.addHost( 'h25', ip='10.1.0.25/24', cls=dualStackHost, v6Addr='1000::25/64' )
 
         # add edges between switch and corresponding host
-        self.addLink( s1 , s1_host )
-        self.addLink( s2 , s2_host )
-        self.addLink( s3 , s3_host )
-        self.addLink( s4 , s4_host )
-        self.addLink( s5 , s5_host )
-        self.addLink( s6 , s6_host )
-        self.addLink( s7 , s7_host )
-        self.addLink( s8 , s8_host )
-        self.addLink( s9 , s9_host )
-        self.addLink( s10 , s10_host )
-        self.addLink( s11 , s11_host )
-        self.addLink( s12 , s12_host )
-        self.addLink( s13 , s13_host )
-        self.addLink( s14 , s14_host )
-        self.addLink( s15 , s15_host )
-        self.addLink( s16 , s16_host )
-        self.addLink( s17 , s17_host )
-        self.addLink( s18 , s18_host )
-        self.addLink( s19 , s19_host )
-        self.addLink( s20 , s20_host )
-        self.addLink( s21 , s21_host )
-        self.addLink( s22 , s22_host )
-        self.addLink( s23 , s23_host )
-        self.addLink( s24 , s24_host )
-        self.addLink( s25 , s25_host )
-        self.addLink(s1, s2)
-        self.addLink(s1, s3)
-        self.addLink(s1, s4)
-        self.addLink(s1, s5)
-        self.addLink(s1, s6)
-        self.addLink(s1, s7)
-        self.addLink(s1, s8)
-        self.addLink(s1, s9)
-        self.addLink(s1, s10)
-        self.addLink(s1, s11)
-        self.addLink(s1, s12)
-        self.addLink(s1, s13)
-        self.addLink(s1, s14)
-        self.addLink(s1, s15)
-        self.addLink(s1, s16)
-        self.addLink(s1, s17)
-        self.addLink(s1, s18)
-        self.addLink(s1, s19)
-        self.addLink(s1, s20)
-        self.addLink(s1, s21)
-        self.addLink(s1, s22)
-        self.addLink(s1, s23)
-        self.addLink(s1, s24)
-        self.addLink(s1, s25)
-        self.addLink(s2, s3)
-        self.addLink(s2, s4)
-        self.addLink(s2, s5)
-        self.addLink(s2, s6)
-        self.addLink(s2, s7)
-        self.addLink(s2, s8)
-        self.addLink(s2, s9)
-        self.addLink(s2, s10)
-        self.addLink(s2, s11)
-        self.addLink(s2, s12)
-        self.addLink(s2, s13)
-        self.addLink(s2, s14)
-        self.addLink(s2, s15)
-        self.addLink(s2, s16)
-        self.addLink(s2, s17)
-        self.addLink(s2, s18)
-        self.addLink(s2, s19)
-        self.addLink(s2, s20)
-        self.addLink(s2, s21)
-        self.addLink(s2, s22)
-        self.addLink(s2, s23)
-        self.addLink(s2, s24)
-        self.addLink(s2, s25)
-        self.addLink(s3, s4)
-        self.addLink(s3, s5)
-        self.addLink(s3, s6)
-        self.addLink(s3, s7)
-        self.addLink(s3, s8)
-        self.addLink(s3, s9)
-        self.addLink(s3, s10)
-        self.addLink(s3, s11)
-        self.addLink(s3, s12)
-        self.addLink(s3, s13)
-        self.addLink(s3, s14)
-        self.addLink(s3, s15)
-        self.addLink(s3, s16)
-        self.addLink(s3, s17)
-        self.addLink(s3, s18)
-        self.addLink(s3, s19)
-        self.addLink(s3, s20)
-        self.addLink(s3, s21)
-        self.addLink(s3, s22)
-        self.addLink(s3, s23)
-        self.addLink(s3, s24)
-        self.addLink(s3, s25)
-        self.addLink(s4, s5)
-        self.addLink(s4, s6)
-        self.addLink(s4, s7)
-        self.addLink(s4, s8)
-        self.addLink(s4, s9)
-        self.addLink(s4, s10)
-        self.addLink(s4, s11)
-        self.addLink(s4, s12)
-        self.addLink(s4, s13)
-        self.addLink(s4, s14)
-        self.addLink(s4, s15)
-        self.addLink(s4, s16)
-        self.addLink(s4, s17)
-        self.addLink(s4, s18)
-        self.addLink(s4, s19)
-        self.addLink(s4, s20)
-        self.addLink(s4, s21)
-        self.addLink(s4, s22)
-        self.addLink(s4, s23)
-        self.addLink(s4, s24)
-        self.addLink(s4, s25)
-        self.addLink(s5, s6)
-        self.addLink(s5, s7)
-        self.addLink(s5, s8)
-        self.addLink(s5, s9)
-        self.addLink(s5, s10)
-        self.addLink(s5, s11)
-        self.addLink(s5, s12)
-        self.addLink(s5, s13)
-        self.addLink(s5, s14)
-        self.addLink(s5, s15)
-        self.addLink(s5, s16)
-        self.addLink(s5, s17)
-        self.addLink(s5, s18)
-        self.addLink(s5, s19)
-        self.addLink(s5, s20)
-        self.addLink(s5, s21)
-        self.addLink(s5, s22)
-        self.addLink(s5, s23)
-        self.addLink(s5, s24)
-        self.addLink(s5, s25)
-        self.addLink(s6, s7)
-        self.addLink(s6, s8)
-        self.addLink(s6, s9)
-        self.addLink(s6, s10)
-        self.addLink(s6, s11)
-        self.addLink(s6, s12)
-        self.addLink(s6, s13)
-        self.addLink(s6, s14)
-        self.addLink(s6, s15)
-        self.addLink(s6, s16)
-        self.addLink(s6, s17)
-        self.addLink(s6, s18)
-        self.addLink(s6, s19)
-        self.addLink(s6, s20)
-        self.addLink(s6, s21)
-        self.addLink(s6, s22)
-        self.addLink(s6, s23)
-        self.addLink(s6, s24)
-        self.addLink(s6, s25)
-        self.addLink(s7, s8)
-        self.addLink(s7, s9)
-        self.addLink(s7, s10)
-        self.addLink(s7, s11)
-        self.addLink(s7, s12)
-        self.addLink(s7, s13)
-        self.addLink(s7, s14)
-        self.addLink(s7, s15)
-        self.addLink(s7, s16)
-        self.addLink(s7, s17)
-        self.addLink(s7, s18)
-        self.addLink(s7, s19)
-        self.addLink(s7, s20)
-        self.addLink(s7, s21)
-        self.addLink(s7, s22)
-        self.addLink(s7, s23)
-        self.addLink(s7, s24)
-        self.addLink(s7, s25)
-        self.addLink(s8, s9)
-        self.addLink(s8, s10)
-        self.addLink(s8, s11)
-        self.addLink(s8, s12)
-        self.addLink(s8, s13)
-        self.addLink(s8, s14)
-        self.addLink(s8, s15)
-        self.addLink(s8, s16)
-        self.addLink(s8, s17)
-        self.addLink(s8, s18)
-        self.addLink(s8, s19)
-        self.addLink(s8, s20)
-        self.addLink(s8, s21)
-        self.addLink(s8, s22)
-        self.addLink(s8, s23)
-        self.addLink(s8, s24)
-        self.addLink(s8, s25)
-        self.addLink(s9, s10)
-        self.addLink(s9, s11)
-        self.addLink(s9, s12)
-        self.addLink(s9, s13)
-        self.addLink(s9, s14)
-        self.addLink(s9, s15)
-        self.addLink(s9, s16)
-        self.addLink(s9, s17)
-        self.addLink(s9, s18)
-        self.addLink(s9, s19)
-        self.addLink(s9, s20)
-        self.addLink(s9, s21)
-        self.addLink(s9, s22)
-        self.addLink(s9, s23)
-        self.addLink(s9, s24)
-        self.addLink(s9, s25)
-        self.addLink(s10, s11)
-        self.addLink(s10, s12)
-        self.addLink(s10, s13)
-        self.addLink(s10, s14)
-        self.addLink(s10, s15)
-        self.addLink(s10, s16)
-        self.addLink(s10, s17)
-        self.addLink(s10, s18)
-        self.addLink(s10, s19)
-        self.addLink(s10, s20)
-        self.addLink(s10, s21)
-        self.addLink(s10, s22)
-        self.addLink(s10, s23)
-        self.addLink(s10, s24)
-        self.addLink(s10, s25)
-        self.addLink(s11, s12)
-        self.addLink(s11, s13)
-        self.addLink(s11, s14)
-        self.addLink(s11, s15)
-        self.addLink(s11, s16)
-        self.addLink(s11, s17)
-        self.addLink(s11, s18)
-        self.addLink(s11, s19)
-        self.addLink(s11, s20)
-        self.addLink(s11, s21)
-        self.addLink(s11, s22)
-        self.addLink(s11, s23)
-        self.addLink(s11, s24)
-        self.addLink(s11, s25)
-        self.addLink(s12, s13)
-        self.addLink(s12, s14)
-        self.addLink(s12, s15)
-        self.addLink(s12, s16)
-        self.addLink(s12, s17)
-        self.addLink(s12, s18)
-        self.addLink(s12, s19)
-        self.addLink(s12, s20)
-        self.addLink(s12, s21)
-        self.addLink(s12, s22)
-        self.addLink(s12, s23)
-        self.addLink(s12, s24)
-        self.addLink(s12, s25)
-        self.addLink(s13, s14)
-        self.addLink(s13, s15)
-        self.addLink(s13, s16)
-        self.addLink(s13, s17)
-        self.addLink(s13, s18)
-        self.addLink(s13, s19)
-        self.addLink(s13, s20)
-        self.addLink(s13, s21)
-        self.addLink(s13, s22)
-        self.addLink(s13, s23)
-        self.addLink(s13, s24)
-        self.addLink(s13, s25)
-        self.addLink(s14, s15)
-        self.addLink(s14, s16)
-        self.addLink(s14, s17)
-        self.addLink(s14, s18)
-        self.addLink(s14, s19)
-        self.addLink(s14, s20)
-        self.addLink(s14, s21)
-        self.addLink(s14, s22)
-        self.addLink(s14, s23)
-        self.addLink(s14, s24)
-        self.addLink(s14, s25)
-        self.addLink(s15, s16)
-        self.addLink(s15, s17)
-        self.addLink(s15, s18)
-        self.addLink(s15, s19)
-        self.addLink(s15, s20)
-        self.addLink(s15, s21)
-        self.addLink(s15, s22)
-        self.addLink(s15, s23)
-        self.addLink(s15, s24)
-        self.addLink(s15, s25)
-        self.addLink(s16, s17)
-        self.addLink(s16, s18)
-        self.addLink(s16, s19)
-        self.addLink(s16, s20)
-        self.addLink(s16, s21)
-        self.addLink(s16, s22)
-        self.addLink(s16, s23)
-        self.addLink(s16, s24)
-        self.addLink(s16, s25)
-        self.addLink(s17, s18)
-        self.addLink(s17, s19)
-        self.addLink(s17, s20)
-        self.addLink(s17, s21)
-        self.addLink(s17, s22)
-        self.addLink(s17, s23)
-        self.addLink(s17, s24)
-        self.addLink(s17, s25)
-        self.addLink(s18, s19)
-        self.addLink(s18, s20)
-        self.addLink(s18, s21)
-        self.addLink(s18, s22)
-        self.addLink(s18, s23)
-        self.addLink(s18, s24)
-        self.addLink(s18, s25)
-        self.addLink(s19, s20)
-        self.addLink(s19, s21)
-        self.addLink(s19, s22)
-        self.addLink(s19, s23)
-        self.addLink(s19, s24)
-        self.addLink(s19, s25)
-        self.addLink(s20, s21)
-        self.addLink(s20, s22)
-        self.addLink(s20, s23)
-        self.addLink(s20, s24)
-        self.addLink(s20, s25)
-        self.addLink(s21, s22)
-        self.addLink(s21, s23)
-        self.addLink(s21, s24)
-        self.addLink(s21, s25)
-        self.addLink(s22, s23)
-        self.addLink(s22, s24)
-        self.addLink(s22, s25)
-        self.addLink(s23, s24)
-        self.addLink(s23, s25)
-        self.addLink(s24, s25)
+        self.addLink( s1, s1_host )
+        self.addLink( s2, s2_host )
+        self.addLink( s3, s3_host )
+        self.addLink( s4, s4_host )
+        self.addLink( s5, s5_host )
+        self.addLink( s6, s6_host )
+        self.addLink( s7, s7_host )
+        self.addLink( s8, s8_host )
+        self.addLink( s9, s9_host )
+        self.addLink( s10, s10_host )
+        self.addLink( s11, s11_host )
+        self.addLink( s12, s12_host )
+        self.addLink( s13, s13_host )
+        self.addLink( s14, s14_host )
+        self.addLink( s15, s15_host )
+        self.addLink( s16, s16_host )
+        self.addLink( s17, s17_host )
+        self.addLink( s18, s18_host )
+        self.addLink( s19, s19_host )
+        self.addLink( s20, s20_host )
+        self.addLink( s21, s21_host )
+        self.addLink( s22, s22_host )
+        self.addLink( s23, s23_host )
+        self.addLink( s24, s24_host )
+        self.addLink( s25, s25_host )
+        self.addLink( s1, s2 )
+        self.addLink( s1, s3 )
+        self.addLink( s1, s4 )
+        self.addLink( s1, s5 )
+        self.addLink( s1, s6 )
+        self.addLink( s1, s7 )
+        self.addLink( s1, s8 )
+        self.addLink( s1, s9 )
+        self.addLink( s1, s10 )
+        self.addLink( s1, s11 )
+        self.addLink( s1, s12 )
+        self.addLink( s1, s13 )
+        self.addLink( s1, s14 )
+        self.addLink( s1, s15 )
+        self.addLink( s1, s16 )
+        self.addLink( s1, s17 )
+        self.addLink( s1, s18 )
+        self.addLink( s1, s19 )
+        self.addLink( s1, s20 )
+        self.addLink( s1, s21 )
+        self.addLink( s1, s22 )
+        self.addLink( s1, s23 )
+        self.addLink( s1, s24 )
+        self.addLink( s1, s25 )
+        self.addLink( s2, s3 )
+        self.addLink( s2, s4 )
+        self.addLink( s2, s5 )
+        self.addLink( s2, s6 )
+        self.addLink( s2, s7 )
+        self.addLink( s2, s8 )
+        self.addLink( s2, s9 )
+        self.addLink( s2, s10 )
+        self.addLink( s2, s11 )
+        self.addLink( s2, s12 )
+        self.addLink( s2, s13 )
+        self.addLink( s2, s14 )
+        self.addLink( s2, s15 )
+        self.addLink( s2, s16 )
+        self.addLink( s2, s17 )
+        self.addLink( s2, s18 )
+        self.addLink( s2, s19 )
+        self.addLink( s2, s20 )
+        self.addLink( s2, s21 )
+        self.addLink( s2, s22 )
+        self.addLink( s2, s23 )
+        self.addLink( s2, s24 )
+        self.addLink( s2, s25 )
+        self.addLink( s3, s4 )
+        self.addLink( s3, s5 )
+        self.addLink( s3, s6 )
+        self.addLink( s3, s7 )
+        self.addLink( s3, s8 )
+        self.addLink( s3, s9 )
+        self.addLink( s3, s10 )
+        self.addLink( s3, s11 )
+        self.addLink( s3, s12 )
+        self.addLink( s3, s13 )
+        self.addLink( s3, s14 )
+        self.addLink( s3, s15 )
+        self.addLink( s3, s16 )
+        self.addLink( s3, s17 )
+        self.addLink( s3, s18 )
+        self.addLink( s3, s19 )
+        self.addLink( s3, s20 )
+        self.addLink( s3, s21 )
+        self.addLink( s3, s22 )
+        self.addLink( s3, s23 )
+        self.addLink( s3, s24 )
+        self.addLink( s3, s25 )
+        self.addLink( s4, s5 )
+        self.addLink( s4, s6 )
+        self.addLink( s4, s7 )
+        self.addLink( s4, s8 )
+        self.addLink( s4, s9 )
+        self.addLink( s4, s10 )
+        self.addLink( s4, s11 )
+        self.addLink( s4, s12 )
+        self.addLink( s4, s13 )
+        self.addLink( s4, s14 )
+        self.addLink( s4, s15 )
+        self.addLink( s4, s16 )
+        self.addLink( s4, s17 )
+        self.addLink( s4, s18 )
+        self.addLink( s4, s19 )
+        self.addLink( s4, s20 )
+        self.addLink( s4, s21 )
+        self.addLink( s4, s22 )
+        self.addLink( s4, s23 )
+        self.addLink( s4, s24 )
+        self.addLink( s4, s25 )
+        self.addLink( s5, s6 )
+        self.addLink( s5, s7 )
+        self.addLink( s5, s8 )
+        self.addLink( s5, s9 )
+        self.addLink( s5, s10 )
+        self.addLink( s5, s11 )
+        self.addLink( s5, s12 )
+        self.addLink( s5, s13 )
+        self.addLink( s5, s14 )
+        self.addLink( s5, s15 )
+        self.addLink( s5, s16 )
+        self.addLink( s5, s17 )
+        self.addLink( s5, s18 )
+        self.addLink( s5, s19 )
+        self.addLink( s5, s20 )
+        self.addLink( s5, s21 )
+        self.addLink( s5, s22 )
+        self.addLink( s5, s23 )
+        self.addLink( s5, s24 )
+        self.addLink( s5, s25 )
+        self.addLink( s6, s7 )
+        self.addLink( s6, s8 )
+        self.addLink( s6, s9 )
+        self.addLink( s6, s10 )
+        self.addLink( s6, s11 )
+        self.addLink( s6, s12 )
+        self.addLink( s6, s13 )
+        self.addLink( s6, s14 )
+        self.addLink( s6, s15 )
+        self.addLink( s6, s16 )
+        self.addLink( s6, s17 )
+        self.addLink( s6, s18 )
+        self.addLink( s6, s19 )
+        self.addLink( s6, s20 )
+        self.addLink( s6, s21 )
+        self.addLink( s6, s22 )
+        self.addLink( s6, s23 )
+        self.addLink( s6, s24 )
+        self.addLink( s6, s25 )
+        self.addLink( s7, s8 )
+        self.addLink( s7, s9 )
+        self.addLink( s7, s10 )
+        self.addLink( s7, s11 )
+        self.addLink( s7, s12 )
+        self.addLink( s7, s13 )
+        self.addLink( s7, s14 )
+        self.addLink( s7, s15 )
+        self.addLink( s7, s16 )
+        self.addLink( s7, s17 )
+        self.addLink( s7, s18 )
+        self.addLink( s7, s19 )
+        self.addLink( s7, s20 )
+        self.addLink( s7, s21 )
+        self.addLink( s7, s22 )
+        self.addLink( s7, s23 )
+        self.addLink( s7, s24 )
+        self.addLink( s7, s25 )
+        self.addLink( s8, s9 )
+        self.addLink( s8, s10 )
+        self.addLink( s8, s11 )
+        self.addLink( s8, s12 )
+        self.addLink( s8, s13 )
+        self.addLink( s8, s14 )
+        self.addLink( s8, s15 )
+        self.addLink( s8, s16 )
+        self.addLink( s8, s17 )
+        self.addLink( s8, s18 )
+        self.addLink( s8, s19 )
+        self.addLink( s8, s20 )
+        self.addLink( s8, s21 )
+        self.addLink( s8, s22 )
+        self.addLink( s8, s23 )
+        self.addLink( s8, s24 )
+        self.addLink( s8, s25 )
+        self.addLink( s9, s10 )
+        self.addLink( s9, s11 )
+        self.addLink( s9, s12 )
+        self.addLink( s9, s13 )
+        self.addLink( s9, s14 )
+        self.addLink( s9, s15 )
+        self.addLink( s9, s16 )
+        self.addLink( s9, s17 )
+        self.addLink( s9, s18 )
+        self.addLink( s9, s19 )
+        self.addLink( s9, s20 )
+        self.addLink( s9, s21 )
+        self.addLink( s9, s22 )
+        self.addLink( s9, s23 )
+        self.addLink( s9, s24 )
+        self.addLink( s9, s25 )
+        self.addLink( s10, s11 )
+        self.addLink( s10, s12 )
+        self.addLink( s10, s13 )
+        self.addLink( s10, s14 )
+        self.addLink( s10, s15 )
+        self.addLink( s10, s16 )
+        self.addLink( s10, s17 )
+        self.addLink( s10, s18 )
+        self.addLink( s10, s19 )
+        self.addLink( s10, s20 )
+        self.addLink( s10, s21 )
+        self.addLink( s10, s22 )
+        self.addLink( s10, s23 )
+        self.addLink( s10, s24 )
+        self.addLink( s10, s25 )
+        self.addLink( s11, s12 )
+        self.addLink( s11, s13 )
+        self.addLink( s11, s14 )
+        self.addLink( s11, s15 )
+        self.addLink( s11, s16 )
+        self.addLink( s11, s17 )
+        self.addLink( s11, s18 )
+        self.addLink( s11, s19 )
+        self.addLink( s11, s20 )
+        self.addLink( s11, s21 )
+        self.addLink( s11, s22 )
+        self.addLink( s11, s23 )
+        self.addLink( s11, s24 )
+        self.addLink( s11, s25 )
+        self.addLink( s12, s13 )
+        self.addLink( s12, s14 )
+        self.addLink( s12, s15 )
+        self.addLink( s12, s16 )
+        self.addLink( s12, s17 )
+        self.addLink( s12, s18 )
+        self.addLink( s12, s19 )
+        self.addLink( s12, s20 )
+        self.addLink( s12, s21 )
+        self.addLink( s12, s22 )
+        self.addLink( s12, s23 )
+        self.addLink( s12, s24 )
+        self.addLink( s12, s25 )
+        self.addLink( s13, s14 )
+        self.addLink( s13, s15 )
+        self.addLink( s13, s16 )
+        self.addLink( s13, s17 )
+        self.addLink( s13, s18 )
+        self.addLink( s13, s19 )
+        self.addLink( s13, s20 )
+        self.addLink( s13, s21 )
+        self.addLink( s13, s22 )
+        self.addLink( s13, s23 )
+        self.addLink( s13, s24 )
+        self.addLink( s13, s25 )
+        self.addLink( s14, s15 )
+        self.addLink( s14, s16 )
+        self.addLink( s14, s17 )
+        self.addLink( s14, s18 )
+        self.addLink( s14, s19 )
+        self.addLink( s14, s20 )
+        self.addLink( s14, s21 )
+        self.addLink( s14, s22 )
+        self.addLink( s14, s23 )
+        self.addLink( s14, s24 )
+        self.addLink( s14, s25 )
+        self.addLink( s15, s16 )
+        self.addLink( s15, s17 )
+        self.addLink( s15, s18 )
+        self.addLink( s15, s19 )
+        self.addLink( s15, s20 )
+        self.addLink( s15, s21 )
+        self.addLink( s15, s22 )
+        self.addLink( s15, s23 )
+        self.addLink( s15, s24 )
+        self.addLink( s15, s25 )
+        self.addLink( s16, s17 )
+        self.addLink( s16, s18 )
+        self.addLink( s16, s19 )
+        self.addLink( s16, s20 )
+        self.addLink( s16, s21 )
+        self.addLink( s16, s22 )
+        self.addLink( s16, s23 )
+        self.addLink( s16, s24 )
+        self.addLink( s16, s25 )
+        self.addLink( s17, s18 )
+        self.addLink( s17, s19 )
+        self.addLink( s17, s20 )
+        self.addLink( s17, s21 )
+        self.addLink( s17, s22 )
+        self.addLink( s17, s23 )
+        self.addLink( s17, s24 )
+        self.addLink( s17, s25 )
+        self.addLink( s18, s19 )
+        self.addLink( s18, s20 )
+        self.addLink( s18, s21 )
+        self.addLink( s18, s22 )
+        self.addLink( s18, s23 )
+        self.addLink( s18, s24 )
+        self.addLink( s18, s25 )
+        self.addLink( s19, s20 )
+        self.addLink( s19, s21 )
+        self.addLink( s19, s22 )
+        self.addLink( s19, s23 )
+        self.addLink( s19, s24 )
+        self.addLink( s19, s25 )
+        self.addLink( s20, s21 )
+        self.addLink( s20, s22 )
+        self.addLink( s20, s23 )
+        self.addLink( s20, s24 )
+        self.addLink( s20, s25 )
+        self.addLink( s21, s22 )
+        self.addLink( s21, s23 )
+        self.addLink( s21, s24 )
+        self.addLink( s21, s25 )
+        self.addLink( s22, s23 )
+        self.addLink( s22, s24 )
+        self.addLink( s22, s25 )
+        self.addLink( s23, s24 )
+        self.addLink( s23, s25 )
+        self.addLink( s24, s25 )
 
 topos = { 'chordal': ( lambda: chordalTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = chordalTopo()
-    #if controller_ip == '':
-        #controller_ip = '10.0.2.2';
+    # if controller_ip == '':
+    # controller_ip = '10.0.2.2';
     #    controller_ip = '127.0.0.1';
-    network = Mininet(topo=topo, switch=OVSSwitch,autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, switch=OVSSwitch, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoRingIpv6.py b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoRingIpv6.py
old mode 100755
new mode 100644
index 982840e..09e0691
--- a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoRingIpv6.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoRingIpv6.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 from mininet.topo import Topo
 from mininet.net import Mininet
 from mininet.node import Host, RemoteController
@@ -32,13 +31,16 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='1000::1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class ringTopo( Topo ):
 
     def __init__( self, **opts ):
@@ -71,43 +73,44 @@
         s10_host = self.addHost( 'h10', ip='10.1.0.10/24', cls=dualStackHost, v6Addr='1000::10/64' )
 
         # add edges between switch and corresponding host
-        self.addLink( s1 , s1_host )
-        self.addLink( s2 , s2_host )
-        self.addLink( s3 , s3_host )
-        self.addLink( s4 , s4_host )
-        self.addLink( s5 , s5_host )
-        self.addLink( s6 , s6_host )
-        self.addLink( s7 , s7_host )
-        self.addLink( s8 , s8_host )
-        self.addLink( s9 , s9_host )
-        self.addLink( s10 , s10_host )
-        self.addLink(s1, s2)
-        self.addLink(s2, s3)
-        self.addLink(s3, s4)
-        self.addLink(s4, s5)
-        self.addLink(s5, s6)
-        self.addLink(s6, s7)
-        self.addLink(s7, s8)
-        self.addLink(s8, s9)
-        self.addLink(s9, s10)
-        self.addLink(s10, s1)
+        self.addLink( s1, s1_host )
+        self.addLink( s2, s2_host )
+        self.addLink( s3, s3_host )
+        self.addLink( s4, s4_host )
+        self.addLink( s5, s5_host )
+        self.addLink( s6, s6_host )
+        self.addLink( s7, s7_host )
+        self.addLink( s8, s8_host )
+        self.addLink( s9, s9_host )
+        self.addLink( s10, s10_host )
+        self.addLink( s1, s2 )
+        self.addLink( s2, s3 )
+        self.addLink( s3, s4 )
+        self.addLink( s4, s5 )
+        self.addLink( s5, s6 )
+        self.addLink( s6, s7 )
+        self.addLink( s7, s8 )
+        self.addLink( s8, s9 )
+        self.addLink( s9, s10 )
+        self.addLink( s10, s1 )
 
 topos = { 'ring': ( lambda: ringTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = ringTopo()
-    #if controller_ip == '':
-        #controller_ip = '10.0.2.2';
+    # if controller_ip == '':
+    # controller_ip = '10.0.2.2';
     #    controller_ip = '127.0.0.1';
-    network = Mininet(topo=topo, switch=OVSSwitch, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, switch=OVSSwitch, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoSpine.py b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoSpine.py
old mode 100755
new mode 100644
index 8914e0b..48c4619
--- a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoSpine.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoSpine.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 from mininet.topo import Topo
 from mininet.net import Mininet
 from mininet.node import Controller, RemoteController, OVSController
@@ -32,6 +31,7 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class spineTopo( Topo ):
 
     def __init__( self, **opts ):
@@ -123,16 +123,16 @@
         s78 = self.addSwitch( 's78' )
 
         # ... and now hosts
-        #s1_host = self.addHost( 'h1' )
-        #s2_host = self.addHost( 'h2' )
-        #s3_host = self.addHost( 'h3' )
-        #s4_host = self.addHost( 'h4' )
-        #s5_host = self.addHost( 'h5' )
-        #s6_host = self.addHost( 'h6' )
-        #s7_host = self.addHost( 'h7' )
-        #s8_host = self.addHost( 'h8' )
-        #s9_host = self.addHost( 'h9' )
-        #s10_host = self.addHost( 'h10' )
+        # s1_host = self.addHost( 'h1' )
+        # s2_host = self.addHost( 'h2' )
+        # s3_host = self.addHost( 'h3' )
+        # s4_host = self.addHost( 'h4' )
+        # s5_host = self.addHost( 'h5' )
+        # s6_host = self.addHost( 'h6' )
+        # s7_host = self.addHost( 'h7' )
+        # s8_host = self.addHost( 'h8' )
+        # s9_host = self.addHost( 'h9' )
+        # s10_host = self.addHost( 'h10' )
         s11_host = self.addHost( 'h11' )
         s12_host = self.addHost( 'h12' )
         s13_host = self.addHost( 'h13' )
@@ -203,253 +203,254 @@
         s78_host = self.addHost( 'h78' )
 
         # add edges between switch and corresponding host
-        #self.addLink( s1 , s1_host )
-        #self.addLink( s2 , s2_host )
-        #self.addLink( s3 , s3_host )
-        #self.addLink( s4 , s4_host )
-        #self.addLink( s5 , s5_host )
-        #self.addLink( s6 , s6_host )
-        #self.addLink( s7 , s7_host )
-        #self.addLink( s8 , s8_host )
-        #self.addLink( s9 , s9_host )
-        #self.addLink( s10 , s10_host )
-        self.addLink( s11 , s11_host )
-        self.addLink( s12 , s12_host )
-        self.addLink( s13 , s13_host )
-        self.addLink( s14 , s14_host )
-        self.addLink( s15 , s15_host )
-        self.addLink( s16 , s16_host )
-        self.addLink( s17 , s17_host )
-        self.addLink( s18 , s18_host )
-        self.addLink( s19 , s19_host )
-        self.addLink( s20 , s20_host )
-        self.addLink( s21 , s21_host )
-        self.addLink( s22 , s22_host )
-        self.addLink( s23 , s23_host )
-        self.addLink( s24 , s24_host )
-        self.addLink( s25 , s25_host )
-        self.addLink( s26 , s26_host )
-        self.addLink( s27 , s27_host )
-        self.addLink( s28 , s28_host )
-        self.addLink( s29 , s29_host )
-        self.addLink( s30 , s30_host )
-        self.addLink( s31 , s31_host )
-        self.addLink( s32 , s32_host )
-        self.addLink( s33 , s33_host )
-        self.addLink( s34 , s34_host )
-        self.addLink( s35 , s35_host )
-        self.addLink( s36 , s36_host )
-        self.addLink( s37 , s37_host )
-        self.addLink( s38 , s38_host )
-        self.addLink( s39 , s39_host )
-        self.addLink( s40 , s40_host )
-        self.addLink( s41 , s41_host )
-        self.addLink( s42 , s42_host )
-        self.addLink( s43 , s43_host )
-        self.addLink( s44 , s44_host )
-        self.addLink( s45 , s45_host )
-        self.addLink( s46 , s46_host )
-        self.addLink( s47 , s47_host )
-        self.addLink( s48 , s48_host )
-        self.addLink( s49 , s49_host )
-        self.addLink( s50 , s50_host )
-        self.addLink( s51 , s51_host )
-        self.addLink( s52 , s52_host )
-        self.addLink( s53 , s53_host )
-        self.addLink( s54 , s54_host )
-        self.addLink( s55 , s55_host )
-        self.addLink( s56 , s56_host )
-        self.addLink( s57 , s57_host )
-        self.addLink( s58 , s58_host )
-        self.addLink( s59 , s59_host )
-        self.addLink( s60 , s60_host )
-        self.addLink( s61 , s61_host )
-        self.addLink( s62 , s62_host )
-        self.addLink( s63 , s63_host )
-        self.addLink( s64 , s64_host )
-        self.addLink( s65 , s65_host )
-        self.addLink( s66 , s66_host )
-        self.addLink( s67 , s67_host )
-        self.addLink( s68 , s68_host )
-        self.addLink( s69 , s69_host )
-        self.addLink( s70 , s70_host )
-        self.addLink( s71 , s71_host )
-        self.addLink( s72 , s72_host )
-        self.addLink( s73 , s73_host )
-        self.addLink( s74 , s74_host )
-        self.addLink( s75 , s75_host )
-        self.addLink( s76 , s76_host )
-        self.addLink( s77 , s77_host )
-        self.addLink( s78 , s78_host )
+        # self.addLink( s1 , s1_host )
+        # self.addLink( s2 , s2_host )
+        # self.addLink( s3 , s3_host )
+        # self.addLink( s4 , s4_host )
+        # self.addLink( s5 , s5_host )
+        # self.addLink( s6 , s6_host )
+        # self.addLink( s7 , s7_host )
+        # self.addLink( s8 , s8_host )
+        # self.addLink( s9 , s9_host )
+        # self.addLink( s10 , s10_host )
+        self.addLink( s11, s11_host )
+        self.addLink( s12, s12_host )
+        self.addLink( s13, s13_host )
+        self.addLink( s14, s14_host )
+        self.addLink( s15, s15_host )
+        self.addLink( s16, s16_host )
+        self.addLink( s17, s17_host )
+        self.addLink( s18, s18_host )
+        self.addLink( s19, s19_host )
+        self.addLink( s20, s20_host )
+        self.addLink( s21, s21_host )
+        self.addLink( s22, s22_host )
+        self.addLink( s23, s23_host )
+        self.addLink( s24, s24_host )
+        self.addLink( s25, s25_host )
+        self.addLink( s26, s26_host )
+        self.addLink( s27, s27_host )
+        self.addLink( s28, s28_host )
+        self.addLink( s29, s29_host )
+        self.addLink( s30, s30_host )
+        self.addLink( s31, s31_host )
+        self.addLink( s32, s32_host )
+        self.addLink( s33, s33_host )
+        self.addLink( s34, s34_host )
+        self.addLink( s35, s35_host )
+        self.addLink( s36, s36_host )
+        self.addLink( s37, s37_host )
+        self.addLink( s38, s38_host )
+        self.addLink( s39, s39_host )
+        self.addLink( s40, s40_host )
+        self.addLink( s41, s41_host )
+        self.addLink( s42, s42_host )
+        self.addLink( s43, s43_host )
+        self.addLink( s44, s44_host )
+        self.addLink( s45, s45_host )
+        self.addLink( s46, s46_host )
+        self.addLink( s47, s47_host )
+        self.addLink( s48, s48_host )
+        self.addLink( s49, s49_host )
+        self.addLink( s50, s50_host )
+        self.addLink( s51, s51_host )
+        self.addLink( s52, s52_host )
+        self.addLink( s53, s53_host )
+        self.addLink( s54, s54_host )
+        self.addLink( s55, s55_host )
+        self.addLink( s56, s56_host )
+        self.addLink( s57, s57_host )
+        self.addLink( s58, s58_host )
+        self.addLink( s59, s59_host )
+        self.addLink( s60, s60_host )
+        self.addLink( s61, s61_host )
+        self.addLink( s62, s62_host )
+        self.addLink( s63, s63_host )
+        self.addLink( s64, s64_host )
+        self.addLink( s65, s65_host )
+        self.addLink( s66, s66_host )
+        self.addLink( s67, s67_host )
+        self.addLink( s68, s68_host )
+        self.addLink( s69, s69_host )
+        self.addLink( s70, s70_host )
+        self.addLink( s71, s71_host )
+        self.addLink( s72, s72_host )
+        self.addLink( s73, s73_host )
+        self.addLink( s74, s74_host )
+        self.addLink( s75, s75_host )
+        self.addLink( s76, s76_host )
+        self.addLink( s77, s77_host )
+        self.addLink( s78, s78_host )
 
-        #info( '*** Add Leaf links\n')
-        self.addLink(s1, s9)
-        self.addLink(s2, s10)
-        self.addLink(s3, s9)
-        self.addLink(s4, s10)
-        self.addLink(s5, s9)
-        self.addLink(s6, s10)
-        self.addLink(s7, s9)
-        self.addLink(s8, s10)
-        self.addLink(s9, s11)
-        self.addLink(s9, s12)
-        self.addLink(s10, s13)
-        self.addLink(s10, s14)
-        self.addLink(s11, s12)
-        self.addLink(s13, s14)
+        # info( '*** Add Leaf links\n' )
+        self.addLink( s1, s9 )
+        self.addLink( s2, s10 )
+        self.addLink( s3, s9 )
+        self.addLink( s4, s10 )
+        self.addLink( s5, s9 )
+        self.addLink( s6, s10 )
+        self.addLink( s7, s9 )
+        self.addLink( s8, s10 )
+        self.addLink( s9, s11 )
+        self.addLink( s9, s12 )
+        self.addLink( s10, s13 )
+        self.addLink( s10, s14 )
+        self.addLink( s11, s12 )
+        self.addLink( s13, s14 )
 
-        #info( '*** Add Spine-1 links\n')
-        self.addLink(s15, s1)
-        self.addLink(s15, s2)
-        self.addLink(s16, s1)
-        self.addLink(s16, s2)
-        self.addLink(s17, s1)
-        self.addLink(s17, s2)
-        self.addLink(s18, s1)
-        self.addLink(s18, s2)
-        self.addLink(s19, s1)
-        self.addLink(s19, s2)
-        self.addLink(s20, s1)
-        self.addLink(s20, s2)
-        self.addLink(s21, s1)
-        self.addLink(s21, s2)
-        self.addLink(s22, s1)
-        self.addLink(s22, s2)
-        self.addLink(s23, s1)
-        self.addLink(s23, s2)
-        self.addLink(s24, s1)
-        self.addLink(s24, s2)
-        self.addLink(s25, s1)
-        self.addLink(s25, s2)
-        self.addLink(s26, s1)
-        self.addLink(s26, s2)
-        self.addLink(s27, s1)
-        self.addLink(s27, s2)
-        self.addLink(s28, s1)
-        self.addLink(s28, s2)
-        self.addLink(s29, s1)
-        self.addLink(s29, s2)
-        self.addLink(s30, s1)
-        self.addLink(s30, s2)
+        # info( '*** Add Spine-1 links\n' )
+        self.addLink( s15, s1 )
+        self.addLink( s15, s2 )
+        self.addLink( s16, s1 )
+        self.addLink( s16, s2 )
+        self.addLink( s17, s1 )
+        self.addLink( s17, s2 )
+        self.addLink( s18, s1 )
+        self.addLink( s18, s2 )
+        self.addLink( s19, s1 )
+        self.addLink( s19, s2 )
+        self.addLink( s20, s1 )
+        self.addLink( s20, s2 )
+        self.addLink( s21, s1 )
+        self.addLink( s21, s2 )
+        self.addLink( s22, s1 )
+        self.addLink( s22, s2 )
+        self.addLink( s23, s1 )
+        self.addLink( s23, s2 )
+        self.addLink( s24, s1 )
+        self.addLink( s24, s2 )
+        self.addLink( s25, s1 )
+        self.addLink( s25, s2 )
+        self.addLink( s26, s1 )
+        self.addLink( s26, s2 )
+        self.addLink( s27, s1 )
+        self.addLink( s27, s2 )
+        self.addLink( s28, s1 )
+        self.addLink( s28, s2 )
+        self.addLink( s29, s1 )
+        self.addLink( s29, s2 )
+        self.addLink( s30, s1 )
+        self.addLink( s30, s2 )
 
-        #info( '*** Add Spine-2 links\n')
-        self.addLink(s31, s3)
-        self.addLink(s31, s4)
-        self.addLink(s32, s3)
-        self.addLink(s32, s4)
-        self.addLink(s33, s3)
-        self.addLink(s33, s4)
-        self.addLink(s34, s3)
-        self.addLink(s34, s4)
-        self.addLink(s35, s3)
-        self.addLink(s35, s4)
-        self.addLink(s36, s3)
-        self.addLink(s36, s4)
-        self.addLink(s37, s3)
-        self.addLink(s37, s4)
-        self.addLink(s38, s3)
-        self.addLink(s38, s4)
-        self.addLink(s39, s3)
-        self.addLink(s39, s4)
-        self.addLink(s40, s3)
-        self.addLink(s40, s4)
-        self.addLink(s41, s3)
-        self.addLink(s41, s4)
-        self.addLink(s42, s3)
-        self.addLink(s42, s4)
-        self.addLink(s43, s3)
-        self.addLink(s43, s4)
-        self.addLink(s44, s3)
-        self.addLink(s44, s4)
-        self.addLink(s45, s3)
-        self.addLink(s45, s4)
-        self.addLink(s46, s3)
-        self.addLink(s46, s4)
+        # info( '*** Add Spine-2 links\n' )
+        self.addLink( s31, s3 )
+        self.addLink( s31, s4 )
+        self.addLink( s32, s3 )
+        self.addLink( s32, s4 )
+        self.addLink( s33, s3 )
+        self.addLink( s33, s4 )
+        self.addLink( s34, s3 )
+        self.addLink( s34, s4 )
+        self.addLink( s35, s3 )
+        self.addLink( s35, s4 )
+        self.addLink( s36, s3 )
+        self.addLink( s36, s4 )
+        self.addLink( s37, s3 )
+        self.addLink( s37, s4 )
+        self.addLink( s38, s3 )
+        self.addLink( s38, s4 )
+        self.addLink( s39, s3 )
+        self.addLink( s39, s4 )
+        self.addLink( s40, s3 )
+        self.addLink( s40, s4 )
+        self.addLink( s41, s3 )
+        self.addLink( s41, s4 )
+        self.addLink( s42, s3 )
+        self.addLink( s42, s4 )
+        self.addLink( s43, s3 )
+        self.addLink( s43, s4 )
+        self.addLink( s44, s3 )
+        self.addLink( s44, s4 )
+        self.addLink( s45, s3 )
+        self.addLink( s45, s4 )
+        self.addLink( s46, s3 )
+        self.addLink( s46, s4 )
 
-        #info( '*** Add Spine-3 links\n')
-        self.addLink(s47, s5)
-        self.addLink(s47, s6)
-        self.addLink(s48, s5)
-        self.addLink(s48, s6)
-        self.addLink(s49, s5)
-        self.addLink(s49, s6)
-        self.addLink(s50, s5)
-        self.addLink(s50, s6)
-        self.addLink(s51, s5)
-        self.addLink(s51, s6)
-        self.addLink(s52, s5)
-        self.addLink(s52, s6)
-        self.addLink(s53, s5)
-        self.addLink(s53, s6)
-        self.addLink(s54, s5)
-        self.addLink(s54, s6)
-        self.addLink(s55, s5)
-        self.addLink(s55, s6)
-        self.addLink(s56, s5)
-        self.addLink(s56, s6)
-        self.addLink(s57, s5)
-        self.addLink(s57, s6)
-        self.addLink(s58, s5)
-        self.addLink(s58, s6)
-        self.addLink(s59, s5)
-        self.addLink(s59, s6)
-        self.addLink(s60, s5)
-        self.addLink(s60, s6)
-        self.addLink(s61, s5)
-        self.addLink(s61, s6)
-        self.addLink(s62, s5)
-        self.addLink(s62, s6)
+        # info( '*** Add Spine-3 links\n' )
+        self.addLink( s47, s5 )
+        self.addLink( s47, s6 )
+        self.addLink( s48, s5 )
+        self.addLink( s48, s6 )
+        self.addLink( s49, s5 )
+        self.addLink( s49, s6 )
+        self.addLink( s50, s5 )
+        self.addLink( s50, s6 )
+        self.addLink( s51, s5 )
+        self.addLink( s51, s6 )
+        self.addLink( s52, s5 )
+        self.addLink( s52, s6 )
+        self.addLink( s53, s5 )
+        self.addLink( s53, s6 )
+        self.addLink( s54, s5 )
+        self.addLink( s54, s6 )
+        self.addLink( s55, s5 )
+        self.addLink( s55, s6 )
+        self.addLink( s56, s5 )
+        self.addLink( s56, s6 )
+        self.addLink( s57, s5 )
+        self.addLink( s57, s6 )
+        self.addLink( s58, s5 )
+        self.addLink( s58, s6 )
+        self.addLink( s59, s5 )
+        self.addLink( s59, s6 )
+        self.addLink( s60, s5 )
+        self.addLink( s60, s6 )
+        self.addLink( s61, s5 )
+        self.addLink( s61, s6 )
+        self.addLink( s62, s5 )
+        self.addLink( s62, s6 )
 
-        #info( '*** Add Spine-4 links\n')
-        self.addLink(s63, s7)
-        self.addLink(s63, s8)
-        self.addLink(s64, s7)
-        self.addLink(s64, s8)
-        self.addLink(s65, s7)
-        self.addLink(s65, s8)
-        self.addLink(s66, s7)
-        self.addLink(s66, s8)
-        self.addLink(s67, s7)
-        self.addLink(s67, s8)
-        self.addLink(s68, s7)
-        self.addLink(s68, s8)
-        self.addLink(s69, s7)
-        self.addLink(s69, s8)
-        self.addLink(s70, s7)
-        self.addLink(s70, s8)
-        self.addLink(s71, s7)
-        self.addLink(s71, s8)
-        self.addLink(s72, s7)
-        self.addLink(s72, s8)
-        self.addLink(s73, s7)
-        self.addLink(s73, s8)
-        self.addLink(s74, s7)
-        self.addLink(s74, s8)
-        self.addLink(s75, s7)
-        self.addLink(s75, s8)
-        self.addLink(s76, s7)
-        self.addLink(s76, s8)
-        self.addLink(s77, s7)
-        self.addLink(s77, s8)
-        self.addLink(s78, s7)
-        self.addLink(s78, s8)
+        # info( '*** Add Spine-4 links\n' )
+        self.addLink( s63, s7 )
+        self.addLink( s63, s8 )
+        self.addLink( s64, s7 )
+        self.addLink( s64, s8 )
+        self.addLink( s65, s7 )
+        self.addLink( s65, s8 )
+        self.addLink( s66, s7 )
+        self.addLink( s66, s8 )
+        self.addLink( s67, s7 )
+        self.addLink( s67, s8 )
+        self.addLink( s68, s7 )
+        self.addLink( s68, s8 )
+        self.addLink( s69, s7 )
+        self.addLink( s69, s8 )
+        self.addLink( s70, s7 )
+        self.addLink( s70, s8 )
+        self.addLink( s71, s7 )
+        self.addLink( s71, s8 )
+        self.addLink( s72, s7 )
+        self.addLink( s72, s8 )
+        self.addLink( s73, s7 )
+        self.addLink( s73, s8 )
+        self.addLink( s74, s7 )
+        self.addLink( s74, s8 )
+        self.addLink( s75, s7 )
+        self.addLink( s75, s8 )
+        self.addLink( s76, s7 )
+        self.addLink( s76, s8 )
+        self.addLink( s77, s7 )
+        self.addLink( s77, s8 )
+        self.addLink( s78, s7 )
+        self.addLink( s78, s8 )
 
 topos = { 'spine': ( lambda: spineTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = spineTopo()
-    #if controller_ip == '':
-        #controller_ip = '10.0.2.2';
+    # if controller_ip == '':
+    # controller_ip = '10.0.2.2';
     #    controller_ip = '127.0.0.1';
-    network = Mininet(topo=topo, switch=OVSSwitch, link=TCLink, autoSetMacs = True, controller=None)
+    network = Mininet( topo=topo, switch=OVSSwitch, link=TCLink, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoSpineIpv6.py b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoSpineIpv6.py
old mode 100755
new mode 100644
index 5b99455..1b5163e
--- a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoSpineIpv6.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoSpineIpv6.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 from mininet.topo import Topo
 from mininet.net import Mininet
 from mininet.node import Host, RemoteController
@@ -32,13 +31,16 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='1000::1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class spineTopo( Topo ):
 
     def __init__( self, **opts ):
@@ -129,7 +131,6 @@
         s77 = self.addSwitch( 's77' )
         s78 = self.addSwitch( 's78' )
 
-
         # ... and now hosts
         # s1_host = self.addHost( 'h1', ip='10.1.0.1/24', cls=dualStackHost, v6Addr='1000::1/64' )
         # s2_host = self.addHost( 'h2', ip='10.1.0.2/24', cls=dualStackHost, v6Addr='1000::2/64' )
@@ -211,253 +212,254 @@
         s78_host = self.addHost( 'h78', ip='10.1.0.78/24', cls=dualStackHost, v6Addr='1000::78/64' )
 
         # add edges between switch and corresponding host
-        #self.addLink( s1 , s1_host )
-        #self.addLink( s2 , s2_host )
-        #self.addLink( s3 , s3_host )
-        #self.addLink( s4 , s4_host )
-        #self.addLink( s5 , s5_host )
-        #self.addLink( s6 , s6_host )
-        #self.addLink( s7 , s7_host )
-        #self.addLink( s8 , s8_host )
-        #self.addLink( s9 , s9_host )
-        #self.addLink( s10 , s10_host )
-        self.addLink( s11 , s11_host )
-        self.addLink( s12 , s12_host )
-        self.addLink( s13 , s13_host )
-        self.addLink( s14 , s14_host )
-        self.addLink( s15 , s15_host )
-        self.addLink( s16 , s16_host )
-        self.addLink( s17 , s17_host )
-        self.addLink( s18 , s18_host )
-        self.addLink( s19 , s19_host )
-        self.addLink( s20 , s20_host )
-        self.addLink( s21 , s21_host )
-        self.addLink( s22 , s22_host )
-        self.addLink( s23 , s23_host )
-        self.addLink( s24 , s24_host )
-        self.addLink( s25 , s25_host )
-        self.addLink( s26 , s26_host )
-        self.addLink( s27 , s27_host )
-        self.addLink( s28 , s28_host )
-        self.addLink( s29 , s29_host )
-        self.addLink( s30 , s30_host )
-        self.addLink( s31 , s31_host )
-        self.addLink( s32 , s32_host )
-        self.addLink( s33 , s33_host )
-        self.addLink( s34 , s34_host )
-        self.addLink( s35 , s35_host )
-        self.addLink( s36 , s36_host )
-        self.addLink( s37 , s37_host )
-        self.addLink( s38 , s38_host )
-        self.addLink( s39 , s39_host )
-        self.addLink( s40 , s40_host )
-        self.addLink( s41 , s41_host )
-        self.addLink( s42 , s42_host )
-        self.addLink( s43 , s43_host )
-        self.addLink( s44 , s44_host )
-        self.addLink( s45 , s45_host )
-        self.addLink( s46 , s46_host )
-        self.addLink( s47 , s47_host )
-        self.addLink( s48 , s48_host )
-        self.addLink( s49 , s49_host )
-        self.addLink( s50 , s50_host )
-        self.addLink( s51 , s51_host )
-        self.addLink( s52 , s52_host )
-        self.addLink( s53 , s53_host )
-        self.addLink( s54 , s54_host )
-        self.addLink( s55 , s55_host )
-        self.addLink( s56 , s56_host )
-        self.addLink( s57 , s57_host )
-        self.addLink( s58 , s58_host )
-        self.addLink( s59 , s59_host )
-        self.addLink( s60 , s60_host )
-        self.addLink( s61 , s61_host )
-        self.addLink( s62 , s62_host )
-        self.addLink( s63 , s63_host )
-        self.addLink( s64 , s64_host )
-        self.addLink( s65 , s65_host )
-        self.addLink( s66 , s66_host )
-        self.addLink( s67 , s67_host )
-        self.addLink( s68 , s68_host )
-        self.addLink( s69 , s69_host )
-        self.addLink( s70 , s70_host )
-        self.addLink( s71 , s71_host )
-        self.addLink( s72 , s72_host )
-        self.addLink( s73 , s73_host )
-        self.addLink( s74 , s74_host )
-        self.addLink( s75 , s75_host )
-        self.addLink( s76 , s76_host )
-        self.addLink( s77 , s77_host )
-        self.addLink( s78 , s78_host )
+        # self.addLink( s1 , s1_host )
+        # self.addLink( s2 , s2_host )
+        # self.addLink( s3 , s3_host )
+        # self.addLink( s4 , s4_host )
+        # self.addLink( s5 , s5_host )
+        # self.addLink( s6 , s6_host )
+        # self.addLink( s7 , s7_host )
+        # self.addLink( s8 , s8_host )
+        # self.addLink( s9 , s9_host )
+        # self.addLink( s10 , s10_host )
+        self.addLink( s11, s11_host )
+        self.addLink( s12, s12_host )
+        self.addLink( s13, s13_host )
+        self.addLink( s14, s14_host )
+        self.addLink( s15, s15_host )
+        self.addLink( s16, s16_host )
+        self.addLink( s17, s17_host )
+        self.addLink( s18, s18_host )
+        self.addLink( s19, s19_host )
+        self.addLink( s20, s20_host )
+        self.addLink( s21, s21_host )
+        self.addLink( s22, s22_host )
+        self.addLink( s23, s23_host )
+        self.addLink( s24, s24_host )
+        self.addLink( s25, s25_host )
+        self.addLink( s26, s26_host )
+        self.addLink( s27, s27_host )
+        self.addLink( s28, s28_host )
+        self.addLink( s29, s29_host )
+        self.addLink( s30, s30_host )
+        self.addLink( s31, s31_host )
+        self.addLink( s32, s32_host )
+        self.addLink( s33, s33_host )
+        self.addLink( s34, s34_host )
+        self.addLink( s35, s35_host )
+        self.addLink( s36, s36_host )
+        self.addLink( s37, s37_host )
+        self.addLink( s38, s38_host )
+        self.addLink( s39, s39_host )
+        self.addLink( s40, s40_host )
+        self.addLink( s41, s41_host )
+        self.addLink( s42, s42_host )
+        self.addLink( s43, s43_host )
+        self.addLink( s44, s44_host )
+        self.addLink( s45, s45_host )
+        self.addLink( s46, s46_host )
+        self.addLink( s47, s47_host )
+        self.addLink( s48, s48_host )
+        self.addLink( s49, s49_host )
+        self.addLink( s50, s50_host )
+        self.addLink( s51, s51_host )
+        self.addLink( s52, s52_host )
+        self.addLink( s53, s53_host )
+        self.addLink( s54, s54_host )
+        self.addLink( s55, s55_host )
+        self.addLink( s56, s56_host )
+        self.addLink( s57, s57_host )
+        self.addLink( s58, s58_host )
+        self.addLink( s59, s59_host )
+        self.addLink( s60, s60_host )
+        self.addLink( s61, s61_host )
+        self.addLink( s62, s62_host )
+        self.addLink( s63, s63_host )
+        self.addLink( s64, s64_host )
+        self.addLink( s65, s65_host )
+        self.addLink( s66, s66_host )
+        self.addLink( s67, s67_host )
+        self.addLink( s68, s68_host )
+        self.addLink( s69, s69_host )
+        self.addLink( s70, s70_host )
+        self.addLink( s71, s71_host )
+        self.addLink( s72, s72_host )
+        self.addLink( s73, s73_host )
+        self.addLink( s74, s74_host )
+        self.addLink( s75, s75_host )
+        self.addLink( s76, s76_host )
+        self.addLink( s77, s77_host )
+        self.addLink( s78, s78_host )
 
-        #info( '*** Add Leaf links\n')
-        self.addLink(s1, s9)
-        self.addLink(s2, s10)
-        self.addLink(s3, s9)
-        self.addLink(s4, s10)
-        self.addLink(s5, s9)
-        self.addLink(s6, s10)
-        self.addLink(s7, s9)
-        self.addLink(s8, s10)
-        self.addLink(s9, s11)
-        self.addLink(s9, s12)
-        self.addLink(s10, s13)
-        self.addLink(s10, s14)
-        self.addLink(s11, s12)
-        self.addLink(s13, s14)
+        # info( '*** Add Leaf links\n' )
+        self.addLink( s1, s9 )
+        self.addLink( s2, s10 )
+        self.addLink( s3, s9 )
+        self.addLink( s4, s10 )
+        self.addLink( s5, s9 )
+        self.addLink( s6, s10 )
+        self.addLink( s7, s9 )
+        self.addLink( s8, s10 )
+        self.addLink( s9, s11 )
+        self.addLink( s9, s12 )
+        self.addLink( s10, s13 )
+        self.addLink( s10, s14 )
+        self.addLink( s11, s12 )
+        self.addLink( s13, s14 )
 
-        #info( '*** Add Spine-1 links\n')
-        self.addLink(s15, s1)
-        self.addLink(s15, s2)
-        self.addLink(s16, s1)
-        self.addLink(s16, s2)
-        self.addLink(s17, s1)
-        self.addLink(s17, s2)
-        self.addLink(s18, s1)
-        self.addLink(s18, s2)
-        self.addLink(s19, s1)
-        self.addLink(s19, s2)
-        self.addLink(s20, s1)
-        self.addLink(s20, s2)
-        self.addLink(s21, s1)
-        self.addLink(s21, s2)
-        self.addLink(s22, s1)
-        self.addLink(s22, s2)
-        self.addLink(s23, s1)
-        self.addLink(s23, s2)
-        self.addLink(s24, s1)
-        self.addLink(s24, s2)
-        self.addLink(s25, s1)
-        self.addLink(s25, s2)
-        self.addLink(s26, s1)
-        self.addLink(s26, s2)
-        self.addLink(s27, s1)
-        self.addLink(s27, s2)
-        self.addLink(s28, s1)
-        self.addLink(s28, s2)
-        self.addLink(s29, s1)
-        self.addLink(s29, s2)
-        self.addLink(s30, s1)
-        self.addLink(s30, s2)
+        # info( '*** Add Spine-1 links\n' )
+        self.addLink( s15, s1 )
+        self.addLink( s15, s2 )
+        self.addLink( s16, s1 )
+        self.addLink( s16, s2 )
+        self.addLink( s17, s1 )
+        self.addLink( s17, s2 )
+        self.addLink( s18, s1 )
+        self.addLink( s18, s2 )
+        self.addLink( s19, s1 )
+        self.addLink( s19, s2 )
+        self.addLink( s20, s1 )
+        self.addLink( s20, s2 )
+        self.addLink( s21, s1 )
+        self.addLink( s21, s2 )
+        self.addLink( s22, s1 )
+        self.addLink( s22, s2 )
+        self.addLink( s23, s1 )
+        self.addLink( s23, s2 )
+        self.addLink( s24, s1 )
+        self.addLink( s24, s2 )
+        self.addLink( s25, s1 )
+        self.addLink( s25, s2 )
+        self.addLink( s26, s1 )
+        self.addLink( s26, s2 )
+        self.addLink( s27, s1 )
+        self.addLink( s27, s2 )
+        self.addLink( s28, s1 )
+        self.addLink( s28, s2 )
+        self.addLink( s29, s1 )
+        self.addLink( s29, s2 )
+        self.addLink( s30, s1 )
+        self.addLink( s30, s2 )
 
-        #info( '*** Add Spine-2 links\n')
-        self.addLink(s31, s3)
-        self.addLink(s31, s4)
-        self.addLink(s32, s3)
-        self.addLink(s32, s4)
-        self.addLink(s33, s3)
-        self.addLink(s33, s4)
-        self.addLink(s34, s3)
-        self.addLink(s34, s4)
-        self.addLink(s35, s3)
-        self.addLink(s35, s4)
-        self.addLink(s36, s3)
-        self.addLink(s36, s4)
-        self.addLink(s37, s3)
-        self.addLink(s37, s4)
-        self.addLink(s38, s3)
-        self.addLink(s38, s4)
-        self.addLink(s39, s3)
-        self.addLink(s39, s4)
-        self.addLink(s40, s3)
-        self.addLink(s40, s4)
-        self.addLink(s41, s3)
-        self.addLink(s41, s4)
-        self.addLink(s42, s3)
-        self.addLink(s42, s4)
-        self.addLink(s43, s3)
-        self.addLink(s43, s4)
-        self.addLink(s44, s3)
-        self.addLink(s44, s4)
-        self.addLink(s45, s3)
-        self.addLink(s45, s4)
-        self.addLink(s46, s3)
-        self.addLink(s46, s4)
+        # info( '*** Add Spine-2 links\n' )
+        self.addLink( s31, s3 )
+        self.addLink( s31, s4 )
+        self.addLink( s32, s3 )
+        self.addLink( s32, s4 )
+        self.addLink( s33, s3 )
+        self.addLink( s33, s4 )
+        self.addLink( s34, s3 )
+        self.addLink( s34, s4 )
+        self.addLink( s35, s3 )
+        self.addLink( s35, s4 )
+        self.addLink( s36, s3 )
+        self.addLink( s36, s4 )
+        self.addLink( s37, s3 )
+        self.addLink( s37, s4 )
+        self.addLink( s38, s3 )
+        self.addLink( s38, s4 )
+        self.addLink( s39, s3 )
+        self.addLink( s39, s4 )
+        self.addLink( s40, s3 )
+        self.addLink( s40, s4 )
+        self.addLink( s41, s3 )
+        self.addLink( s41, s4 )
+        self.addLink( s42, s3 )
+        self.addLink( s42, s4 )
+        self.addLink( s43, s3 )
+        self.addLink( s43, s4 )
+        self.addLink( s44, s3 )
+        self.addLink( s44, s4 )
+        self.addLink( s45, s3 )
+        self.addLink( s45, s4 )
+        self.addLink( s46, s3 )
+        self.addLink( s46, s4 )
 
-        #info( '*** Add Spine-3 links\n')
-        self.addLink(s47, s5)
-        self.addLink(s47, s6)
-        self.addLink(s48, s5)
-        self.addLink(s48, s6)
-        self.addLink(s49, s5)
-        self.addLink(s49, s6)
-        self.addLink(s50, s5)
-        self.addLink(s50, s6)
-        self.addLink(s51, s5)
-        self.addLink(s51, s6)
-        self.addLink(s52, s5)
-        self.addLink(s52, s6)
-        self.addLink(s53, s5)
-        self.addLink(s53, s6)
-        self.addLink(s54, s5)
-        self.addLink(s54, s6)
-        self.addLink(s55, s5)
-        self.addLink(s55, s6)
-        self.addLink(s56, s5)
-        self.addLink(s56, s6)
-        self.addLink(s57, s5)
-        self.addLink(s57, s6)
-        self.addLink(s58, s5)
-        self.addLink(s58, s6)
-        self.addLink(s59, s5)
-        self.addLink(s59, s6)
-        self.addLink(s60, s5)
-        self.addLink(s60, s6)
-        self.addLink(s61, s5)
-        self.addLink(s61, s6)
-        self.addLink(s62, s5)
-        self.addLink(s62, s6)
+        # info( '*** Add Spine-3 links\n' )
+        self.addLink( s47, s5 )
+        self.addLink( s47, s6 )
+        self.addLink( s48, s5 )
+        self.addLink( s48, s6 )
+        self.addLink( s49, s5 )
+        self.addLink( s49, s6 )
+        self.addLink( s50, s5 )
+        self.addLink( s50, s6 )
+        self.addLink( s51, s5 )
+        self.addLink( s51, s6 )
+        self.addLink( s52, s5 )
+        self.addLink( s52, s6 )
+        self.addLink( s53, s5 )
+        self.addLink( s53, s6 )
+        self.addLink( s54, s5 )
+        self.addLink( s54, s6 )
+        self.addLink( s55, s5 )
+        self.addLink( s55, s6 )
+        self.addLink( s56, s5 )
+        self.addLink( s56, s6 )
+        self.addLink( s57, s5 )
+        self.addLink( s57, s6 )
+        self.addLink( s58, s5 )
+        self.addLink( s58, s6 )
+        self.addLink( s59, s5 )
+        self.addLink( s59, s6 )
+        self.addLink( s60, s5 )
+        self.addLink( s60, s6 )
+        self.addLink( s61, s5 )
+        self.addLink( s61, s6 )
+        self.addLink( s62, s5 )
+        self.addLink( s62, s6 )
 
-        #info( '*** Add Spine-4 links\n')
-        self.addLink(s63, s7)
-        self.addLink(s63, s8)
-        self.addLink(s64, s7)
-        self.addLink(s64, s8)
-        self.addLink(s65, s7)
-        self.addLink(s65, s8)
-        self.addLink(s66, s7)
-        self.addLink(s66, s8)
-        self.addLink(s67, s7)
-        self.addLink(s67, s8)
-        self.addLink(s68, s7)
-        self.addLink(s68, s8)
-        self.addLink(s69, s7)
-        self.addLink(s69, s8)
-        self.addLink(s70, s7)
-        self.addLink(s70, s8)
-        self.addLink(s71, s7)
-        self.addLink(s71, s8)
-        self.addLink(s72, s7)
-        self.addLink(s72, s8)
-        self.addLink(s73, s7)
-        self.addLink(s73, s8)
-        self.addLink(s74, s7)
-        self.addLink(s74, s8)
-        self.addLink(s75, s7)
-        self.addLink(s75, s8)
-        self.addLink(s76, s7)
-        self.addLink(s76, s8)
-        self.addLink(s77, s7)
-        self.addLink(s77, s8)
-        self.addLink(s78, s7)
-        self.addLink(s78, s8)
+        # info( '*** Add Spine-4 links\n' )
+        self.addLink( s63, s7 )
+        self.addLink( s63, s8 )
+        self.addLink( s64, s7 )
+        self.addLink( s64, s8 )
+        self.addLink( s65, s7 )
+        self.addLink( s65, s8 )
+        self.addLink( s66, s7 )
+        self.addLink( s66, s8 )
+        self.addLink( s67, s7 )
+        self.addLink( s67, s8 )
+        self.addLink( s68, s7 )
+        self.addLink( s68, s8 )
+        self.addLink( s69, s7 )
+        self.addLink( s69, s8 )
+        self.addLink( s70, s7 )
+        self.addLink( s70, s8 )
+        self.addLink( s71, s7 )
+        self.addLink( s71, s8 )
+        self.addLink( s72, s7 )
+        self.addLink( s72, s8 )
+        self.addLink( s73, s7 )
+        self.addLink( s73, s8 )
+        self.addLink( s74, s7 )
+        self.addLink( s74, s8 )
+        self.addLink( s75, s7 )
+        self.addLink( s75, s8 )
+        self.addLink( s76, s7 )
+        self.addLink( s76, s8 )
+        self.addLink( s77, s7 )
+        self.addLink( s77, s8 )
+        self.addLink( s78, s7 )
+        self.addLink( s78, s8 )
 
 topos = { 'spine': ( lambda: spineTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = spineTopo()
-    #if controller_ip == '':
-        #controller_ip = '10.0.2.2';
+    # if controller_ip == '':
+    # controller_ip = '10.0.2.2';
     #    controller_ip = '127.0.0.1';
-    network = Mininet(topo=topo, switch=OVSSwitch, link=TCLink, autoSetMacs = True, controller=None)
+    network = Mininet( topo=topo, switch=OVSSwitch, link=TCLink, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoTripleIpv6.py b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoTripleIpv6.py
old mode 100755
new mode 100644
index 9b83391..d74d444
--- a/TestON/tests/CHOTestMonkey/dependencies/topologies/topoTripleIpv6.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/topologies/topoTripleIpv6.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 from mininet.topo import Topo
 from mininet.net import Mininet
 from mininet.node import Host, RemoteController
@@ -32,13 +31,16 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='1000::1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class tripleTopo( Topo ):
 
     def __init__( self, **opts ):
@@ -57,29 +59,30 @@
         s3_host = self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='1000::3/64' )
 
         # add edges between switch and corresponding host
-        self.addLink( s1 , s1_host )
-        self.addLink( s2 , s2_host )
-        self.addLink( s3 , s3_host )
-        self.addLink(s1, s2)
-        self.addLink(s1, s3)
-        self.addLink(s2, s3)
+        self.addLink( s1, s1_host )
+        self.addLink( s2, s2_host )
+        self.addLink( s3, s3_host )
+        self.addLink( s1, s2 )
+        self.addLink( s1, s3 )
+        self.addLink( s2, s3 )
 
 topos = { 'triple': ( lambda: tripleTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = tripleTopo()
-    #if controller_ip == '':
-        #controller_ip = '10.0.2.2';
+    # if controller_ip == '':
+    # controller_ip = '10.0.2.2';
     #    controller_ip = '127.0.0.1';
-    network = Mininet(topo=topo, switch=OVSSwitch, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, switch=OVSSwitch, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/FUNC/FUNCbgpls/FUNCbgpls.py b/TestON/tests/FUNC/FUNCbgpls/FUNCbgpls.py
index f89e57d..bd35266 100644
--- a/TestON/tests/FUNC/FUNCbgpls/FUNCbgpls.py
+++ b/TestON/tests/FUNC/FUNCbgpls/FUNCbgpls.py
@@ -1,6 +1,5 @@
 """
-
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -9,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -68,11 +67,11 @@
             main.cleanAndExit()
         main.testSetUp.envSetupDescription()
         try:
-            main.cellName = main.params['ENV']['cellName']
-            main.ipList = os.getenv(main.params['CTRL']['ip1'])
-            main.scapy_ip = os.getenv(main.params['SCAPY']['HOSTNAMES'])
+            main.cellName = main.params[ 'ENV' ][ 'cellName' ]
+            main.ipList = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
+            main.scapy_ip = os.getenv( main.params[ 'SCAPY' ][ 'HOSTNAMES' ] )
 
-            main.apps = main.params['ENV']['cellApps']
+            main.apps = main.params[ 'ENV' ][ 'cellApps' ]
             stepResult = main.testSetUp.envSetup()
         except Exception as e:
             main.testSetUp.envSetupException( e )
diff --git a/TestON/tests/FUNC/FUNCbgpls/dependencies/Nbdata.py b/TestON/tests/FUNC/FUNCbgpls/dependencies/Nbdata.py
index b1f44e1..17d4df8 100644
--- a/TestON/tests/FUNC/FUNCbgpls/dependencies/Nbdata.py
+++ b/TestON/tests/FUNC/FUNCbgpls/dependencies/Nbdata.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 "**** Scripted by Antony Silvester ****** "
 import json
 from urllib import addbase
diff --git a/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Deletion_Node.py b/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Deletion_Node.py
old mode 100755
new mode 100644
index d747a5a..37adcf8
--- a/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Deletion_Node.py
+++ b/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Deletion_Node.py
@@ -1,5 +1,6 @@
+# !/usr/bin/python           # This is server.py file
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,8 +19,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-#!/usr/bin/python           # This is server.py file
 from scapy.all import *
 import socket               # Import socket module
 import time                 # Import Time module
@@ -27,47 +26,46 @@
 import os
 
 path = os.getcwd()
-sys.path.append('OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies')   #Setting the path for BgpLS
+sys.path.append( 'OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies' )  # Setting the path for BgpLS
 from Nbdata import BgpLs
 
 obj = BgpLs()
 returnlist = obj.Constants()
-peerIp = returnlist[0][0]
+peerIp = returnlist[ 0 ][ 0 ]
 
-load_contrib('bgp')
+load_contrib( 'bgp' )
 s = socket.socket()         # Create a socket object
-host = peerIp # Get local machine name
+host = peerIp  # Get local machine name
 port = 179                # Reserve a port for your service.
-s.bind((host, port))        # Bind to the port
-pkts = rdpcap(path + "/OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies/Bgpls_packets/bgpls.pcap")
-time.sleep(15)
-pkts[759][BGPOpen].bgp_id = peerIp
+s.bind( ( host, port ) )        # Bind to the port
+pkts = rdpcap( path + "/OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies/Bgpls_packets/bgpls.pcap" )
+time.sleep( 15 )
+pkts[ 759 ][ BGPOpen ].bgp_id = peerIp
 
-s.listen(5)                   # Now wait for client connection.
+s.listen( 5 )                   # Now wait for client connection.
 
-print("starting Connecting to ONOS peer")
+print( "starting Connecting to ONOS peer" )
 c, addr = s.accept()     # Establish connection with client.
 print 'Got connection from ONOS :', addr
-c.send(str(pkts[759][BGPHeader])) # OPEN MESSAGE
-c.recv(4096)
-c.send(str(pkts[765][BGPHeader]))# KEEPALIVE MESSAGE
-c.recv(4096)
-c.send(str(pkts[768][BGPHeader]))   # UPDATE MESSAGES
-c.send(str(pkts[771][BGPHeader]))
-c.send(str(pkts[773][BGPHeader]))
-c.send(str(pkts[775][BGPHeader]))
-c.send(str(pkts[778][BGPHeader]))
-c.send(str(pkts[765][BGPHeader]))
+c.send( str( pkts[ 759 ][ BGPHeader ] ) )  # OPEN MESSAGE
+c.recv( 4096 )
+c.send( str( pkts[ 765 ][ BGPHeader ] ) )  # KEEPALIVE MESSAGE
+c.recv( 4096 )
+c.send( str( pkts[ 768 ][ BGPHeader ] ) )   # UPDATE MESSAGES
+c.send( str( pkts[ 771 ][ BGPHeader ] ) )
+c.send( str( pkts[ 773 ][ BGPHeader ] ) )
+c.send( str( pkts[ 775 ][ BGPHeader ] ) )
+c.send( str( pkts[ 778 ][ BGPHeader ] ) )
+c.send( str( pkts[ 765 ][ BGPHeader ] ) )
 
-time.sleep(15)
-c.send(str(pkts[1168][BGPHeader]))
-c.send(str(pkts[1250][BGPHeader]))
-c.send(str(pkts[1354][BGPHeader]))
-print ("Node Delete msg sent")
+time.sleep( 15 )
+c.send( str( pkts[ 1168 ][ BGPHeader ] ) )
+c.send( str( pkts[ 1250 ][ BGPHeader ] ) )
+c.send( str( pkts[ 1354 ][ BGPHeader ] ) )
+print ( "Node Delete msg sent" )
 
 
 while True:
-    c.recv(4096)
-    c.send(str(pkts[765][BGPHeader]))
-
-  # c.close()                # Close the connection
+    c.recv( 4096 )
+    c.send( str( pkts[ 765 ][ BGPHeader ] ) )
+    # c.close()   # Close the connection
diff --git a/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Link_Update_Node.py b/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Link_Update_Node.py
old mode 100755
new mode 100644
index 15c5757..4bf1187
--- a/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Link_Update_Node.py
+++ b/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Link_Update_Node.py
@@ -1,5 +1,6 @@
+# !/usr/bin/python           # This is server.py file
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,8 +19,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-#!/usr/bin/python           # This is server.py file
 from scapy.all import *
 import socket               # Import socket module
 import time                 # Import Time module
@@ -27,40 +26,39 @@
 import os
 
 path = os.getcwd()
-sys.path.append('OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies')   #Setting the path for BgpLS
+sys.path.append( 'OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies' )  # Setting the path for BgpLS
 from Nbdata import BgpLs
 
 obj = BgpLs()
 returnlist = obj.Constants()
-peerIp = returnlist[0][0]
+peerIp = returnlist[ 0 ][ 0 ]
 
-load_contrib('bgp')
+load_contrib( 'bgp' )
 s = socket.socket()         # Create a socket object
-host = peerIp # Get local machine name
+host = peerIp  # Get local machine name
 port = 179                # Reserve a port for your service.
-s.bind((host, port))        # Bind to the port
-pkts = rdpcap(path + "/OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies/Bgpls_packets/bgpls.pcap")
-time.sleep(15)
-pkts[759][BGPOpen].bgp_id = peerIp
+s.bind( ( host, port ) )        # Bind to the port
+pkts = rdpcap( path + "/OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies/Bgpls_packets/bgpls.pcap" )
+time.sleep( 15 )
+pkts[ 759 ][ BGPOpen ].bgp_id = peerIp
 
-s.listen(5)                   # Now wait for client connection.
+s.listen( 5 )                   # Now wait for client connection.
 
-print("starting Connecting to ONOS peer")
+print( "starting Connecting to ONOS peer" )
 c, addr = s.accept()     # Establish connection with client.
 print 'Got connection from ONOS :', addr
-c.send(str(pkts[759][BGPHeader])) # OPEN MESSAGE
-c.recv(4096)
-c.send(str(pkts[765][BGPHeader]))# KEEPALIVE MESSAGE
-c.recv(4096)
-c.send(str(pkts[768][BGPHeader]))   # UPDATE MESSAGES
-c.send(str(pkts[771][BGPHeader]))
-c.send(str(pkts[773][BGPHeader]))
-c.send(str(pkts[775][BGPHeader]))
-c.send(str(pkts[778][BGPHeader]))
-c.send(str(pkts[765][BGPHeader]))
+c.send( str( pkts[ 759 ][ BGPHeader ] ) )  # OPEN MESSAGE
+c.recv( 4096 )
+c.send( str( pkts[ 765 ][ BGPHeader ] ) )  # KEEPALIVE MESSAGE
+c.recv( 4096 )
+c.send( str( pkts[ 768 ][ BGPHeader ] ) )   # UPDATE MESSAGES
+c.send( str( pkts[ 771 ][ BGPHeader ] ) )
+c.send( str( pkts[ 773 ][ BGPHeader ] ) )
+c.send( str( pkts[ 775 ][ BGPHeader ] ) )
+c.send( str( pkts[ 778 ][ BGPHeader ] ) )
+c.send( str( pkts[ 765 ][ BGPHeader ] ) )
 
 while True:
-    c.recv(4096)
-    c.send(str(pkts[765][BGPHeader]))
-
-  # c.close()                # Close the connection
+    c.recv( 4096 )
+    c.send( str( pkts[ 765 ][ BGPHeader ] ) )
+    # c.close()                # Close the connection
diff --git a/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Topo_discovery.py b/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Topo_discovery.py
old mode 100755
new mode 100644
index 332a0ef..183388f
--- a/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Topo_discovery.py
+++ b/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Topo_discovery.py
@@ -1,5 +1,6 @@
+#!/usr/bin/python           # This is server.py file
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,8 +19,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-#!/usr/bin/python           # This is server.py file
 from scapy.all import *
 import socket               # Import socket module
 import time                 # Import Time module
@@ -27,36 +26,35 @@
 import os
 
 path = os.getcwd()
-sys.path.append('OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies')   #Setting the path for BgpLS
+sys.path.append( 'OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies' )  # Setting the path for BgpLS
 from Nbdata import BgpLs
 
 obj = BgpLs()
 returnlist = obj.Constants()
-peerIp = returnlist[0][0]
+peerIp = returnlist[ 0 ][ 0 ]
 
-load_contrib('bgp')
+load_contrib( 'bgp' )
 s = socket.socket()         # Create a socket object
-host = peerIp # Get local machine name
+host = peerIp  # Get local machine name
 port = 179                # Reserve a port for your service.
-s.bind((host, port))        # Bind to the port
-pkts = rdpcap(path + "/OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies/Bgpls_packets/bgpls_all.pcap")
-pkts[69][BGPOpen].bgp_id = peerIp
+s.bind( ( host, port ) )        # Bind to the port
+pkts = rdpcap( path + "/OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies/Bgpls_packets/bgpls_all.pcap" )
+pkts[ 69 ][ BGPOpen ].bgp_id = peerIp
 
-s.listen(5)                 # Now wait for client connection.
+s.listen( 5 )                 # Now wait for client connection.
 
-print("starting Connecting to ONOS peer")
+print( "starting Connecting to ONOS peer" )
 c, addr = s.accept()     # Establish connection with client.
 print 'Got connection from ONOS :', addr
-c.send(str(pkts[69][BGPHeader])) # OPEN MESSAGE
-c.recv(4096)
-c.send(str(pkts[71][BGPHeader]))# KEEPALIVE MESSAGE
-c.recv(4096)
-c.send(str(pkts[72][BGPHeader]))   # UPDATE MESSAGES
-c.send(str(pkts[74][BGPHeader]))
-c.send(str(pkts[71][BGPHeader]))
+c.send( str( pkts[ 69 ][ BGPHeader ] ) )  # OPEN MESSAGE
+c.recv( 4096 )
+c.send( str( pkts[ 71 ][ BGPHeader ] ) )  # KEEPALIVE MESSAGE
+c.recv( 4096 )
+c.send( str( pkts[ 72 ][ BGPHeader ] ) )   # UPDATE MESSAGES
+c.send( str( pkts[ 74 ][ BGPHeader ] ) )
+c.send( str( pkts[ 71 ][ BGPHeader ] ) )
 
 while True:
-    c.recv(4096)
-    c.send(str(pkts[71][BGPHeader]))
-
-  # c.close()                # Close the connection
+    c.recv( 4096 )
+    c.send( str( pkts[ 71 ][ BGPHeader ] ) )
+    # c.close()                # Close the connection
diff --git a/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Update_Node.py b/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Update_Node.py
old mode 100755
new mode 100644
index 7feed1b..919898d
--- a/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Update_Node.py
+++ b/TestON/tests/FUNC/FUNCbgpls/dependencies/Scapyfiles/Update_Node.py
@@ -1,5 +1,6 @@
+#!/usr/bin/python           # This is server.py file
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,8 +19,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-#!/usr/bin/python           # This is server.py file
 from scapy.all import *
 import socket               # Import socket module
 import time                 # Import Time module
@@ -27,43 +26,42 @@
 import os
 
 path = os.getcwd()
-sys.path.append('OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies')   #Setting the path for BgpLS
+sys.path.append( 'OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies' )  # Setting the path for BgpLS
 from Nbdata import BgpLs
 
 obj = BgpLs()
 returnlist = obj.Constants()
-peerIp = returnlist[0][0]
+peerIp = returnlist[ 0 ][ 0 ]
 
-load_contrib('bgp')
+load_contrib( 'bgp' )
 s = socket.socket()         # Create a socket object
-host = peerIp # Get local machine name
+host = peerIp  # Get local machine name
 port = 179                # Reserve a port for your service.
-s.bind((host, port))        # Bind to the port
-pkts = rdpcap(path + "/OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies/Bgpls_packets/bgpls_all.pcap")
-pkts[69][BGPOpen].bgp_id = peerIp
+s.bind( ( host, port ) )        # Bind to the port
+pkts = rdpcap( path + "/OnosSystemTest/TestON/tests/FUNC/FUNCbgpls/dependencies/Bgpls_packets/bgpls_all.pcap" )
+pkts[ 69 ][ BGPOpen ].bgp_id = peerIp
 
-s.listen(5)                 # Now wait for client connection.
+s.listen( 5 )                 # Now wait for client connection.
 
-print("starting Connecting to ONOS peer")
+print( "starting Connecting to ONOS peer" )
 c, addr = s.accept()     # Establish connection with client.
 print 'Got connection from ONOS :', addr
-c.send(str(pkts[69][BGPHeader])) # OPEN MESSAGE
-c.recv(4096)
-c.send(str(pkts[71][BGPHeader]))# KEEPALIVE MESSAGE
-c.recv(4096)
-c.send(str(pkts[72][BGPHeader]))   # UPDATE MESSAGES
-c.send(str(pkts[74][BGPHeader]))
-c.send(str(pkts[71][BGPHeader]))
+c.send( str( pkts[ 69 ][ BGPHeader ] ) )  # OPEN MESSAGE
+c.recv( 4096 )
+c.send( str( pkts[ 71 ][ BGPHeader ] ) )  # KEEPALIVE MESSAGE
+c.recv( 4096 )
+c.send( str( pkts[ 72 ][ BGPHeader ] ) )   # UPDATE MESSAGES
+c.send( str( pkts[ 74 ][ BGPHeader ] ) )
+c.send( str( pkts[ 71 ][ BGPHeader ] ) )
 
-time.sleep(10)               # Waiting for 120 seconds for update message.
+time.sleep( 10 )               # Waiting for 120 seconds for update message.
 
-c.send(str(pkts[298][BGPHeader]))
-c.send(str(pkts[860][BGPHeader]))   # UPDATE MESSAGES with new node
-c.send(str(pkts[865][BGPHeader]))
-print ("New Node update msg sent")
+c.send( str( pkts[ 298 ][ BGPHeader ] ) )
+c.send( str( pkts[ 860 ][ BGPHeader ] ) )   # UPDATE MESSAGES with new node
+c.send( str( pkts[ 865 ][ BGPHeader ] ) )
+print ( "New Node update msg sent" )
 
 while True:
-    c.recv(4096)
-    c.send(str(pkts[71][BGPHeader]))
-
-  # c.close()                # Close the connection
+    c.recv( 4096 )
+    c.send( str( pkts[ 71 ][ BGPHeader ] ) )
+    # c.close()                # Close the connection
diff --git a/TestON/tests/FUNC/FUNCflow/FUNCflow.py b/TestON/tests/FUNC/FUNCflow/FUNCflow.py
index 9b504ba..e900648 100644
--- a/TestON/tests/FUNC/FUNCflow/FUNCflow.py
+++ b/TestON/tests/FUNC/FUNCflow/FUNCflow.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 class FUNCflow:
 
     def __init__( self ):
@@ -42,7 +41,6 @@
             - Checkout ONOS master branch
             - Pull latest ONOS code
         """
-
         main.testSetUp.envSetupDescription()
         stepResult = main.FALSE
         try:
@@ -71,7 +69,7 @@
                 main.checkingFlow = CheckingFlow()
             except ImportError as e:
                 print e
-                main.log.error("CheckingFlow not found exiting the test")
+                main.log.error( "CheckingFlow not found exiting the test" )
                 main.cleanAndExit()
             copyResult = main.ONOSbench.scp( main.Mininet1,
                                              main.dependencyPath + main.topology,
@@ -89,7 +87,6 @@
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
 
-
     def CASE2( self, main ):
         """
         - Set up cell
@@ -788,7 +785,7 @@
         udpDst = main.params[ 'TEST' ][ 'udpDst' ]
 
         main.log.info( "Add a flow that connects host1 on port1 to host2 on port2" )
-        stepResult =ctrl.REST.addFlow( deviceId=main.swDPID,
+        stepResult = ctrl.REST.addFlow( deviceId=main.swDPID,
                                             egressPort=egress,
                                             ingressPort=ingress,
                                             ethType=ethType,
diff --git a/TestON/tests/FUNC/FUNCflow/dependencies/checkingFlow.py b/TestON/tests/FUNC/FUNCflow/dependencies/checkingFlow.py
index 4209947..37ae8b6 100644
--- a/TestON/tests/FUNC/FUNCflow/dependencies/checkingFlow.py
+++ b/TestON/tests/FUNC/FUNCflow/dependencies/checkingFlow.py
@@ -1,12 +1,14 @@
 import json
 import time
+
+
 class CheckingFlow:
 
     def __init__( self ):
         self.default = ''
 
     def checkFlow( self ):
-        main.step("Check flow is in the ADDED state")
+        main.step( "Check flow is in the ADDED state" )
         main.log.info( "Get the flows from ONOS" )
         try:
             flows = json.loads( main.Cluster.active( 0 ).REST.flows() )
diff --git a/TestON/tests/FUNC/FUNCflow/dependencies/mplsClass.py b/TestON/tests/FUNC/FUNCflow/dependencies/mplsClass.py
index 66d4664..ec9ebaa 100644
--- a/TestON/tests/FUNC/FUNCflow/dependencies/mplsClass.py
+++ b/TestON/tests/FUNC/FUNCflow/dependencies/mplsClass.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,14 +18,14 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 import scapy
 
-class MPLS(Packet):
-        name = "MPLS"
-        fields_desc =  [
-                BitField("label", 3, 20),
-                BitField("experimental_bits", 0, 3),
-                BitField("bottom_of_label_stack", 1, 1), # Now we're at the bottom
-                ByteField("TTL", 255)
-        ]
+
+class MPLS( Packet ):
+    name = "MPLS"
+    fields_desc = [
+            BitField( "label", 3, 20 ),
+            BitField( "experimental_bits", 0, 3 ),
+            BitField( "bottom_of_label_stack", 1, 1 ),  # Now we're at the bottom
+            ByteField( "TTL", 255 )
+    ]
diff --git a/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py b/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py
old mode 100755
new mode 100644
index 8a5e402..0dbaa80
--- a/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py
+++ b/TestON/tests/FUNC/FUNCflow/dependencies/topo-flow.py
@@ -1,5 +1,6 @@
+# !/usr/bin/python
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,8 +20,6 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
 
-#!/usr/bin/python
-
 """
 Custom topology for Mininet
 """
@@ -35,19 +34,23 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class VLANHost( Host ):
+
     def config( self, vlan=100, **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ifconfig %s inet 0' % intf )
         self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
-        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params[ 'ip' ] ) )
         newName = '%s.%d' % ( intf, vlan )
         intf.name = newName
         self.nameToIntf[ newName ] = intf
         return r
 
+
 class IPv6Host( Host ):
+
     def config( self, v6Addr='1000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
@@ -55,45 +58,46 @@
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class MyTopo( Topo ):
 
     def __init__( self, **opts ):
         # Initialize topology
-        Topo.__init__( self, **opts)
+        Topo.__init__( self, **opts )
 
         # IPv4 hosts
-        host1=self.addHost( 'h1', ip='10.0.0.1/24' )
-        host2=self.addHost( 'h2', ip='10.0.0.2/24' )
+        host1 = self.addHost( 'h1', ip='10.0.0.1/24' )
+        host2 = self.addHost( 'h2', ip='10.0.0.2/24' )
 
         # VLAN hosts
-        host3=self.addHost( 'h3', ip='10.0.0.3/24', cls=VLANHost, vlan=10 )
-        host4=self.addHost( 'h4', ip='10.0.0.4/24', cls=VLANHost, vlan=10 )
+        host3 = self.addHost( 'h3', ip='10.0.0.3/24', cls=VLANHost, vlan=10 )
+        host4 = self.addHost( 'h4', ip='10.0.0.4/24', cls=VLANHost, vlan=10 )
 
-        #IPv6 hosts
-        host5=self.addHost( 'h5', ip='10.0.0.5/24', cls=IPv6Host, v6Addr='1000::5/64')
-        host6=self.addHost( 'h6', ip='10.0.0.6/24', cls=IPv6Host, v6Addr='1000::6/64')
+        # IPv6 hosts
+        host5 = self.addHost( 'h5', ip='10.0.0.5/24', cls=IPv6Host, v6Addr='1000::5/64' )
+        host6 = self.addHost( 'h6', ip='10.0.0.6/24', cls=IPv6Host, v6Addr='1000::6/64' )
 
         s1 = self.addSwitch( 's1' )
 
-        self.addLink(s1, host1)
-        self.addLink(s1, host2)
-        self.addLink(s1, host3)
-        self.addLink(s1, host4)
-        self.addLink(s1, host5)
-        self.addLink(s1, host6)
-
+        self.addLink( s1, host1 )
+        self.addLink( s1, host2 )
+        self.addLink( s1, host3 )
+        self.addLink( s1, host4 )
+        self.addLink( s1, host5 )
+        self.addLink( s1, host6 )
 
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, autoStaticArp=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, autoStaticArp=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/FUNC/FUNCgroup/FUNCgroup.py b/TestON/tests/FUNC/FUNCgroup/FUNCgroup.py
index de50155..8e06747 100644
--- a/TestON/tests/FUNC/FUNCgroup/FUNCgroup.py
+++ b/TestON/tests/FUNC/FUNCgroup/FUNCgroup.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 class FUNCgroup:
 
     def __init__( self ):
@@ -47,51 +46,51 @@
 
         try:
             # Test variables
-            main.cellName = main.params['ENV']['cellName']
-            main.apps = main.params['ENV']['cellApps']
-            main.ONOSport = main.params['CTRL']['port']
+            main.cellName = main.params[ 'ENV' ][ 'cellName' ]
+            main.apps = main.params[ 'ENV' ][ 'cellApps' ]
+            main.ONOSport = main.params[ 'CTRL' ][ 'port' ]
             main.dependencyPath = main.testOnDirectory + \
-                                  main.params['DEPENDENCY']['path']
-            wrapperFile1 = main.params['DEPENDENCY']['wrapper1']
-            wrapperFile2 = main.params['DEPENDENCY']['wrapper2']
-            main.topology = main.params['DEPENDENCY']['topology']
-            bucket = main.params['DEPENDENCY']['bucket']
-            main.startUpSleep = int(main.params['SLEEP']['startup'])
-            main.startMNSleep = int(main.params['SLEEP']['startMN'])
-            main.addFlowSleep = int(main.params['SLEEP']['addFlow'])
-            main.delFlowSleep = int(main.params['SLEEP']['delFlow'])
-            main.addGroupSleep = int(main.params['SLEEP']['addGroup'])
-            main.delGroupSleep = int(main.params['SLEEP']['delGroup'])
-            main.debug = main.params['DEBUG']
-            main.swDPID = main.params['TEST']['swDPID']
-            egressPort1 = main.params['TEST']['egressPort1']
-            egressPort2 = main.params['TEST']['egressPort2']
-            egressPort3 = main.params['TEST']['egressPort3']
-            ingressPort = main.params['TEST']['ingressPort']
-            appCookie = main.params['TEST']['appCookie']
-            type1 = main.params['TEST']['type1']
-            type2 = main.params['TEST']['type2']
-            groupId = main.params['TEST']['groupId']
-            priority = main.params['TEST']['priority']
-            deviceId = main.params['TEST']['swDPID']
+                                  main.params[ 'DEPENDENCY' ][ 'path' ]
+            wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
+            wrapperFile2 = main.params[ 'DEPENDENCY' ][ 'wrapper2' ]
+            main.topology = main.params[ 'DEPENDENCY' ][ 'topology' ]
+            bucket = main.params[ 'DEPENDENCY' ][ 'bucket' ]
+            main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+            main.startMNSleep = int( main.params[ 'SLEEP' ][ 'startMN' ] )
+            main.addFlowSleep = int( main.params[ 'SLEEP' ][ 'addFlow' ] )
+            main.delFlowSleep = int( main.params[ 'SLEEP' ][ 'delFlow' ] )
+            main.addGroupSleep = int( main.params[ 'SLEEP' ][ 'addGroup' ] )
+            main.delGroupSleep = int( main.params[ 'SLEEP' ][ 'delGroup' ] )
+            main.debug = main.params[ 'DEBUG' ]
+            main.swDPID = main.params[ 'TEST' ][ 'swDPID' ]
+            egressPort1 = main.params[ 'TEST' ][ 'egressPort1' ]
+            egressPort2 = main.params[ 'TEST' ][ 'egressPort2' ]
+            egressPort3 = main.params[ 'TEST' ][ 'egressPort3' ]
+            ingressPort = main.params[ 'TEST' ][ 'ingressPort' ]
+            appCookie = main.params[ 'TEST' ][ 'appCookie' ]
+            type1 = main.params[ 'TEST' ][ 'type1' ]
+            type2 = main.params[ 'TEST' ][ 'type2' ]
+            groupId = main.params[ 'TEST' ][ 'groupId' ]
+            priority = main.params[ 'TEST' ][ 'priority' ]
+            deviceId = main.params[ 'TEST' ][ 'swDPID' ]
 
             main.debug = True if "on" in main.debug else False
             # -- INIT SECTION, ONLY RUNS ONCE -- #
 
-            main.buckets = imp.load_source(bucket,
-                                           main.dependencyPath +
-                                           bucket +
-                                           ".py")
+            main.buckets = imp.load_source( bucket,
+                                            main.dependencyPath +
+                                            bucket +
+                                            ".py" )
 
-            copyResult = main.ONOSbench.scp(main.Mininet1,
-                                            main.dependencyPath + main.topology,
-                                            main.Mininet1.home + '/custom/',
-                                            direction="to")
+            copyResult = main.ONOSbench.scp( main.Mininet1,
+                                             main.dependencyPath + main.topology,
+                                             main.Mininet1.home + '/custom/',
+                                             direction="to" )
 
-            utilities.assert_equals(expect=main.TRUE,
-                                    actual=copyResult,
-                                    onpass="Successfully copy " + "test variables ",
-                                    onfail="Failed to copy test variables")
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=copyResult,
+                                     onpass="Successfully copy " + "test variables ",
+                                     onfail="Failed to copy test variables" )
             stepResult = main.testSetUp.envSetup()
 
         except Exception as e:
@@ -99,8 +98,6 @@
 
         main.testSetUp.evnSetupConclusion( stepResult )
 
-
-
     def CASE2( self, main ):
         """
         - Set up cell
@@ -381,7 +378,7 @@
         main.case( "Delete the Group and Flow added through Rest api " )
         main.step( "Deleting Group and Flows" )
         ctrl = main.Cluster.active( 0 )
-        #Get Flow ID
+        # Get Flow ID
         response = ctrl.REST.getFlows( deviceId=deviceId )
         responsejson = json.loads( response )
         for item in responsejson:
diff --git a/TestON/tests/FUNC/FUNCgroup/dependencies/group-bucket.py b/TestON/tests/FUNC/FUNCgroup/dependencies/group-bucket.py
index 7b8ded6..394d2df 100644
--- a/TestON/tests/FUNC/FUNCgroup/dependencies/group-bucket.py
+++ b/TestON/tests/FUNC/FUNCgroup/dependencies/group-bucket.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 def addBucket( main, egressPort="" ):
     """
     Description:
diff --git a/TestON/tests/FUNC/FUNCgroup/dependencies/topo-group.py b/TestON/tests/FUNC/FUNCgroup/dependencies/topo-group.py
index 16a0a84..5e9f750 100644
--- a/TestON/tests/FUNC/FUNCgroup/dependencies/topo-group.py
+++ b/TestON/tests/FUNC/FUNCgroup/dependencies/topo-group.py
@@ -1,5 +1,6 @@
+# !/usr/bin/python
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,8 +20,6 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
 
-#!/usr/bin/python
-
 """
 Custom topology for Mininet
 """
@@ -35,36 +34,38 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class MyTopo( Topo ):
 
     def __init__( self, **opts ):
         # Initialize topology
-        Topo.__init__( self, **opts)
+        Topo.__init__( self, **opts )
 
         # IPv4 hosts
-        host1=self.addHost( 'h1', ip='10.0.0.1/24' )
-        host2=self.addHost( 'h2', ip='10.0.0.2/24' )
-        host3=self.addHost( 'h3', ip='10.0.0.3/24' )
-        host4=self.addHost( 'h4', ip='10.0.0.4/24' )
+        host1 = self.addHost( 'h1', ip='10.0.0.1/24' )
+        host2 = self.addHost( 'h2', ip='10.0.0.2/24' )
+        host3 = self.addHost( 'h3', ip='10.0.0.3/24' )
+        host4 = self.addHost( 'h4', ip='10.0.0.4/24' )
 
         s1 = self.addSwitch( 's1' )
 
-        self.addLink(s1, host1)
-        self.addLink(s1, host2)
-        self.addLink(s1, host3)
-        self.addLink(s1, host4)
+        self.addLink( s1, host1 )
+        self.addLink( s1, host2 )
+        self.addLink( s1, host3 )
+        self.addLink( s1, host4 )
 
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, autoStaticArp=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, autoStaticArp=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/FUNC/FUNCintent/FUNCintent.py b/TestON/tests/FUNC/FUNCintent/FUNCintent.py
index c0374f8..24d2f75 100644
--- a/TestON/tests/FUNC/FUNCintent/FUNCintent.py
+++ b/TestON/tests/FUNC/FUNCintent/FUNCintent.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # Testing the basic intent functionality of ONOS
 
 
@@ -39,7 +38,6 @@
             - Install ONOS package
             - Build ONOS package
         """
-
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -114,7 +112,6 @@
         - Install ONOS cluster
         - Connect to cli
         """
-
         main.flowCompiler = "Flow Rules"
         main.initialized = main.testSetUp.ONOSSetUp( main.Mininet1, main.Cluster, True )
         main.intents.report( main )
@@ -134,6 +131,7 @@
         except ( NameError, AttributeError ):
             main.topoRelated = Topology()
         main.topoRelated.compareTopos( main.Mininet1, main.checkTopoAttempts )
+
     def CASE10( self, main ):
         """
             Start Mininet topology with OF 1.0 switches
@@ -372,10 +370,10 @@
         cmd = "org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator"
 
         stepResult = main.Cluster.active( 0 ).CLI.setCfg( component=cmd,
-                                            propName="useFlowObjectives", value="true" )
+                                                          propName="useFlowObjectives", value="true" )
         stepResult &= main.Cluster.active( 0 ).CLI.setCfg( component=cmd,
-                                             propName="defaultFlowObjectiveCompiler",
-                                             value='org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler' )
+                                                           propName="defaultFlowObjectiveCompiler",
+                                                           value='org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler' )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -438,6 +436,7 @@
         except ( NameError, AttributeError ):
             main.Utils = Utils()
         main.Utils.copyKarafLog( "cycle" + str( main.cycle ) )
+
     def CASE1000( self, main ):
         """
             Add host intents between 2 host:
@@ -924,11 +923,11 @@
         main.assertReturnString = "Assertion Result for SDNIP-ICMP IPV4 using TCP point intents\n"
         senders = [
             { "name": "h1", "device": "of:0000000000000005/1", "mac": "00:00:00:00:00:01",
-              "ip":( main.h1.hostIp + "/24" ) }
+              "ip": ( main.h1.hostIp + "/24" ) }
         ]
         recipients = [
             { "name": "h9", "device": "of:0000000000000006/1", "mac": "00:00:00:00:00:09",
-              "ip":( main.h9.hostIp + "/24" ) }
+              "ip": ( main.h9.hostIp + "/24" ) }
         ]
         ipProto = main.params[ 'SDNIP' ][ 'ipPrototype' ]
         # Uneccessary, not including this in the selectors
@@ -1820,48 +1819,49 @@
                                  actual=testResult,
                                  onpass=main.assertReturnString,
                                  onfail=main.assertReturnString )
+        """
+        Testing MPLS would require kernel version of 4.1 or higher ( Current version is 3.13 )
+        main.step( "ENCAPSULATION: Add multi point to single point intents" )
+        main.assertReturnString = "Assertion results for MPLS Encapsulation multi to single point intent\n"
+        senders = [
+           { "name": "h16", "device": "of:0000000000000006/8" },
+           { "name": "h24", "device": "of:0000000000000007/8" }
+        ]
+        recipients = [
+           { "name": "h8", "device": "of:0000000000000005/8" }
+        ]
+        badSenders = [ { "name": "h17" } ]  # Senders that are not in the intent
+        badRecipients = [ { "name": "h9" } ]  # Recipients that are not in the intent
+        testResult = main.FALSE
+        installResult = main.intents.installMultiToSingleIntent(
+           main,
+           name="ENCAPSULATION",
+           senders=senders,
+           recipients=recipients,
+           sw1="s5",
+           sw2="s2",
+           encap="MPLS" )
 
-        #Testing MPLS would require kernel version of 4.1 or higher ( Current version is 3.13 )
-        #main.step( "ENCAPSULATION: Add multi point to single point intents" )
-        #main.assertReturnString = "Assertion results for MPLS Encapsulation multi to single point intent\n"
-        #senders = [
-        #    { "name": "h16", "device": "of:0000000000000006/8" },
-        #    { "name": "h24", "device": "of:0000000000000007/8" }
-        # ]
-        #recipients = [
-        #    { "name": "h8", "device": "of:0000000000000005/8" }
-        # ]
-        #badSenders = [ { "name": "h17" } ]  # Senders that are not in the intent
-        #badRecipients = [ { "name": "h9" } ]  # Recipients that are not in the intent
-        #testResult = main.FALSE
-        #installResult = main.intents.installMultiToSingleIntent(
-        #    main,
-        #    name="ENCAPSULATION",
-        #    senders=senders,
-        #    recipients=recipients,
-        #    sw1="s5",
-        #    sw2="s2",
-        #    encap="MPLS" )
-        #
-        #if installResult:
-        #    testResult = main.intents.testPointIntent(
-        #        main,
-        #        intentId=installResult,
-        #        name="ENCAPSULATION",
-        #        senders=senders,
-        #        recipients=recipients,
-        #        badSenders=badSenders,
-        #        badRecipients=badRecipients,
-        #        sw1="s5",
-        #        sw2="s2",
-        #        expectedLink=18 )
-        #else:
-        #    main.Cluster.active( 0 ).CLI.removeAllIntents( purge=True )
-        #
-        #utilities.assert_equals( expect=main.TRUE,
-        #                         actual=testResult,
-        #                         onpass=main.assertReturnString,
-        #                         onfail=main.assertReturnString )
+        if installResult:
+           testResult = main.intents.testPointIntent(
+               main,
+               intentId=installResult,
+               name="ENCAPSULATION",
+               senders=senders,
+               recipients=recipients,
+               badSenders=badSenders,
+               badRecipients=badRecipients,
+               sw1="s5",
+               sw2="s2",
+               expectedLink=18 )
+        else:
+           main.Cluster.active( 0 ).CLI.removeAllIntents( purge=True )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                actual=testResult,
+                                onpass=main.assertReturnString,
+                                onfail=main.assertReturnString )
+        """
 
         main.intents.report( main )
 
diff --git a/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py b/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
index bdd0e74..1a7002b 100644
--- a/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
+++ b/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -2077,8 +2077,8 @@
     """
     intentResult = main.TRUE
     stateCheckResults = main.Cluster.command( "checkIntentState",
-                                         kwargs={ "intentsId":intentsId },
-                                         returnBool=True, specificDriver=2 )
+                                              kwargs={ "intentsId": intentsId },
+                                              returnBool=True, specificDriver=2 )
     if stateCheckResults:
         main.log.info( itemName + ": Intents state check passed" )
     else:
@@ -2093,8 +2093,8 @@
         Returns main.TRUE or main.FALSE
     """
     stateCheckResults = main.Cluster.command( "compareBandwidthAllocations",
-                                         args=[ bandwidth ],
-                                         returnBool=True, specificDriver=2 )
+                                              args=[ bandwidth ],
+                                              returnBool=True, specificDriver=2 )
     if stateCheckResults:
         main.log.info( itemName + ": bandwidth check passed" )
         bandwidthResult = main.TRUE
@@ -2396,7 +2396,7 @@
         else failed
 
     """
-    main.log.info( "Checking encapsulated intent for " + tag + ".")
+    main.log.info( "Checking encapsulated intent for " + tag + "." )
     HostJson = []
     Jflows = main.Cluster.active( 0 ).CLI.flows( noCore=True )
     try:
@@ -2435,6 +2435,7 @@
         main.log.error( "Total " + PopTag + str( pop ) )
         return main.FALSE
 
+
 def ProtectedIntentCheck( main ):
     intent = main.Cluster.active( 0 ).CLI.intents( jsonFormat=False )
     if "Protection" in intent:
diff --git a/TestON/tests/FUNC/FUNCintent/dependencies/newFuncTopo.py b/TestON/tests/FUNC/FUNCintent/dependencies/newFuncTopo.py
old mode 100755
new mode 100644
index 6170025..9897d9c
--- a/TestON/tests/FUNC/FUNCintent/dependencies/newFuncTopo.py
+++ b/TestON/tests/FUNC/FUNCintent/dependencies/newFuncTopo.py
@@ -1,5 +1,6 @@
+# !/usr/bin/python
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,8 +20,6 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
 
-#!/usr/bin/python
-
 """
 Custom topology for Mininet
 """
@@ -35,20 +34,24 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class VLANHost( Host ):
+
     def config( self, vlan=100, v6Addr='3000::1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ifconfig %s inet 0' % intf )
         self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
-        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params[ 'ip' ] ) )
         self.cmd( 'ip -6 addr add %s dev %s.%d' % ( v6Addr, intf, vlan ) )
         newName = '%s.%d' % ( intf, vlan )
         intf.name = newName
         self.nameToIntf[ newName ] = intf
         return r
 
+
 class IPv6Host( Host ):
+
     def config( self, v6Addr='1000::1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
@@ -56,13 +59,16 @@
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='2000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class MyTopo( Topo ):
 
     def __init__( self ):
@@ -70,51 +76,51 @@
         Topo.__init__( self )
         # Switch S5 Hosts
         # IPv4 only Host
-        host1=self.addHost( 'h1', ip='10.1.0.2/24' )
+        host1 = self.addHost( 'h1', ip='10.1.0.2/24' )
         # IPv6 only Host
-        host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+        host2 = self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
         # Dual Stack Host
-        host3=self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
+        host3 = self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
         # VLAN hosts
-        host4=self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100, v6Addr='3000::2/64' )
-        host5=self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200, v6Addr='4000::2/64' )
+        host4 = self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100, v6Addr='3000::2/64' )
+        host5 = self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200, v6Addr='4000::2/64' )
         # VPN-1 and VPN-2 Hosts
-        host6=self.addHost( 'h6', ip='11.1.0.2/24' )
-        host7=self.addHost( 'h7', ip='12.1.0.2/24' )
+        host6 = self.addHost( 'h6', ip='11.1.0.2/24' )
+        host7 = self.addHost( 'h7', ip='12.1.0.2/24' )
         # Multicast Sender
-        host8=self.addHost( 'h8', ip='10.1.0.4/24' )
+        host8 = self.addHost( 'h8', ip='10.1.0.4/24' )
 
         # Switch S6 Hosts
         # IPv4 only Host
-        host9=self.addHost( 'h9', ip='10.1.0.5/24' )
+        host9 = self.addHost( 'h9', ip='10.1.0.5/24' )
         # IPv6 only Host
-        host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+        host10 = self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
         # Dual Stack Host
-        host11=self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
+        host11 = self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
         # VLAN hosts
-        host12=self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100, v6Addr='3000::3/64' )
-        host13=self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200, v6Addr='4000::3/64' )
+        host12 = self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100, v6Addr='3000::3/64' )
+        host13 = self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200, v6Addr='4000::3/64' )
         # VPN-1 and VPN-2 Hosts
-        host14=self.addHost( 'h14', ip='11.1.0.3/24' )
-        host15=self.addHost( 'h15', ip='12.1.0.3/24' )
+        host14 = self.addHost( 'h14', ip='11.1.0.3/24' )
+        host15 = self.addHost( 'h15', ip='12.1.0.3/24' )
         # Multicast Receiver
-        host16=self.addHost( 'h16', ip='10.1.0.7/24' )
+        host16 = self.addHost( 'h16', ip='10.1.0.7/24' )
 
         # Switch S7 Hosts
         # IPv4 only Host
-        host17=self.addHost( 'h17', ip='10.1.0.8/24' )
+        host17 = self.addHost( 'h17', ip='10.1.0.8/24' )
         # IPv6 only Host
-        host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+        host18 = self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
         # Dual Stack Host
-        host19=self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
+        host19 = self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
         # VLAN hosts
-        host20=self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100, v6Addr='3000::4/64' )
-        host21=self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200, v6Addr='4000::4/64' )
+        host20 = self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100, v6Addr='3000::4/64' )
+        host21 = self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200, v6Addr='4000::4/64' )
         # VPN-1 and VPN-2 Hosts
-        host22=self.addHost( 'h22', ip='11.1.0.4/24' )
-        host23=self.addHost( 'h23', ip='12.1.0.4/24' )
+        host22 = self.addHost( 'h22', ip='11.1.0.4/24' )
+        host23 = self.addHost( 'h23', ip='12.1.0.4/24' )
         # Multicast Receiver
-        host24=self.addHost( 'h24', ip='10.1.0.10/24' )
+        host24 = self.addHost( 'h24', ip='10.1.0.10/24' )
 
         s1 = self.addSwitch( 's1' )
         s2 = self.addSwitch( 's2' )
@@ -124,56 +130,57 @@
         s6 = self.addSwitch( 's6' )
         s7 = self.addSwitch( 's7' )
 
-        self.addLink(s5,host1)
-        self.addLink(s5,host2)
-        self.addLink(s5,host3)
-        self.addLink(s5,host4)
-        self.addLink(s5,host5)
-        self.addLink(s5,host6)
-        self.addLink(s5,host7)
-        self.addLink(s5,host8)
+        self.addLink( s5, host1 )
+        self.addLink( s5, host2 )
+        self.addLink( s5, host3 )
+        self.addLink( s5, host4 )
+        self.addLink( s5, host5 )
+        self.addLink( s5, host6 )
+        self.addLink( s5, host7 )
+        self.addLink( s5, host8 )
 
-        self.addLink(s6,host9)
-        self.addLink(s6,host10)
-        self.addLink(s6,host11)
-        self.addLink(s6,host12)
-        self.addLink(s6,host13)
-        self.addLink(s6,host14)
-        self.addLink(s6,host15)
-        self.addLink(s6,host16)
+        self.addLink( s6, host9 )
+        self.addLink( s6, host10 )
+        self.addLink( s6, host11 )
+        self.addLink( s6, host12 )
+        self.addLink( s6, host13 )
+        self.addLink( s6, host14 )
+        self.addLink( s6, host15 )
+        self.addLink( s6, host16 )
 
-        self.addLink(s7,host17)
-        self.addLink(s7,host18)
-        self.addLink(s7,host19)
-        self.addLink(s7,host20)
-        self.addLink(s7,host21)
-        self.addLink(s7,host22)
-        self.addLink(s7,host23)
-        self.addLink(s7,host24)
+        self.addLink( s7, host17 )
+        self.addLink( s7, host18 )
+        self.addLink( s7, host19 )
+        self.addLink( s7, host20 )
+        self.addLink( s7, host21 )
+        self.addLink( s7, host22 )
+        self.addLink( s7, host23 )
+        self.addLink( s7, host24 )
 
-        self.addLink(s1,s2)
-        self.addLink(s1,s3)
-        self.addLink(s1,s4)
-        self.addLink(s1,s5)
-        self.addLink(s2,s3)
-        self.addLink(s2,s5)
-        self.addLink(s2,s6)
-        self.addLink(s3,s4)
-        self.addLink(s3,s6)
-        self.addLink(s4,s7)
+        self.addLink( s1, s2 )
+        self.addLink( s1, s3 )
+        self.addLink( s1, s4 )
+        self.addLink( s1, s5 )
+        self.addLink( s2, s3 )
+        self.addLink( s2, s5 )
+        self.addLink( s2, s6 )
+        self.addLink( s3, s4 )
+        self.addLink( s3, s6 )
+        self.addLink( s4, s7 )
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.py b/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.py
index 1872846..cbf1fea 100644
--- a/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.py
+++ b/TestON/tests/FUNC/FUNCintentRest/FUNCintentRest.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # Testing the basic intent functionality of ONOS
 # TODO: Replace the CLI calls with REST API equivalents as they become available.
 #           - May need to write functions in the onosrestdriver.py file to do this
@@ -97,7 +96,7 @@
                                               direction="to" )
             stepResult = main.testSetUp.envSetup()
         except Exception as e:
-            main.testSetUp.envSetupException(e)
+            main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
 
     def CASE2( self, main ):
@@ -136,7 +135,7 @@
         main.ONOSbench.logReport( main.Cluster.active( 0 ).ipAddress,
                                   [ "INFO", "FOLLOWER", "WARN", "flow", "ERROR", "Except" ],
                                   "s" )
-        #main.ONOSbench.logReport( globalONOSip[ 1 ], [ "INFO" ], "d" )
+        # main.ONOSbench.logReport( globalONOSip[ 1 ], [ "INFO" ], "d" )
 
     def CASE10( self, main ):
         """
@@ -381,10 +380,10 @@
         cmd = "org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator"
 
         stepResult = main.Cluster.active( 0 ).CLI.setCfg( component=cmd,
-                                            propName="useFlowObjectives", value="true" )
+                                                          propName="useFlowObjectives", value="true" )
         stepResult &= main.Cluster.active( 0 ).CLI.setCfg( component=cmd,
-                                             propName="defaultFlowObjectiveCompiler",
-                                             value='org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler' )
+                                                           propName="defaultFlowObjectiveCompiler",
+                                                           value='org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler' )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -448,6 +447,7 @@
         except ( NameError, AttributeError ):
             main.Utils = Utils()
         main.Utils.copyKarafLog( "cycle" + str( main.cycle ) )
+
     def CASE1000( self, main ):
         """
             Add host intents between 2 host:
@@ -1246,7 +1246,7 @@
             recipients=recipients,
             sw1="s5",
             sw2="s2" )
-        #setVlan=100 )
+        # setVlan=100 )
 
         if installResult:
             testResult = main.intentFunction.testPointIntent(
diff --git a/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py b/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py
index f4743ee..6b4346c 100644
--- a/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py
+++ b/TestON/tests/FUNC/FUNCintentRest/dependencies/FuncIntentFunction.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -1047,7 +1047,7 @@
                                                                 portEgressList=portEgressList,
                                                                 ethType=ethType,
                                                                 ethSrc=srcMac,
-                                                                #ethDst=dstMac, #Isn't working because of ONOS itself
+                                                                # ethDst=dstMac, #Isn't working because of ONOS itself
                                                                 bandwidth=bandwidth,
                                                                 lambdaAlloc=lambdaAlloc,
                                                                 ipProto=ipProto,
@@ -1159,15 +1159,15 @@
     if hostNames and devices:
         if len( hostNames ) != len( devices ):
             main.log.debug( "hosts and devices does not have the same length" )
-            #print "len hostNames = ", len( hostNames )
-            #print "len devices = ", len( devices )
+            # print "len hostNames = ", len( hostNames )
+            # print "len devices = ", len( devices )
             return main.FALSE
         if ports:
             if len( ports ) != len( devices ):
                 main.log.error( "Ports and devices does " +
                                 "not have the same length" )
-                #print "len devices = ", len( devices )
-                #print "len ports = ", len( ports )
+                # print "len devices = ", len( devices )
+                # print "len ports = ", len( ports )
                 return main.FALSE
         else:
             main.log.info( "Device Ports are not specified" )
@@ -1183,11 +1183,11 @@
                         main.hostsData.get( host ).get( 'mac' )
             ipDict[ main.hostsData.get( host ).get( 'location' ) ] = \
                         main.hostsData.get( host ).get( 'ipAddresses' )
-        #print main.hostsData
+        # print main.hostsData
 
-    #print 'host names = ', hostNames
-    #print 'devices = ', devices
-    #print "macsDict = ", macsDict
+    # print 'host names = ', hostNames
+    # print 'devices = ', devices
+    # print "macsDict = ", macsDict
 
     pingResult = main.TRUE
     intentResult = main.TRUE
@@ -1399,8 +1399,8 @@
     main.log.info( itemName + ": Checking intents state" )
     # First check of intents
     stateCheckResults = main.Cluster.command( "checkIntentState",
-                                         kwargs={ "intentsId":intentsId },
-                                         returnBool=True, specificDriver=3 )
+                                              kwargs={ "intentsId": intentsId },
+                                              returnBool=True, specificDriver=3 )
 
     expectedState = [ 'INSTALLED', 'INSTALLING' ]
 
@@ -1414,8 +1414,8 @@
         # Second check of intents since some of the intents may be in
         # INSTALLING state, they should be in INSTALLED at this time
         stateCheckResults = main.Cluster.command( "checkIntentState",
-                                         kwargs={ "intentsId":intentsId },
-                                         returnBool=True, specificDriver=3 )
+                                                  kwargs={ "intentsId": intentsId },
+                                                  returnBool=True, specificDriver=3 )
         if stateCheckResults:
             main.log.info( itemName + ": Intents are installed correctly" )
             intentResult = main.TRUE
@@ -1467,7 +1467,6 @@
     for ctrl in main.Cluster.active():
         flowsCount.append( len( json.loads( ctrl.REST.flows() ) ) )
 
-
     if flowsCount:
         if all( flows == flowsCount[ 0 ] for flows in flowsCount ):
             main.log.info( itemName + ": There are " + str( flowsCount[ 0 ] ) +
diff --git a/TestON/tests/FUNC/FUNCintentRest/dependencies/newFuncTopo.py b/TestON/tests/FUNC/FUNCintentRest/dependencies/newFuncTopo.py
old mode 100755
new mode 100644
index 870bc32..951e15c
--- a/TestON/tests/FUNC/FUNCintentRest/dependencies/newFuncTopo.py
+++ b/TestON/tests/FUNC/FUNCintentRest/dependencies/newFuncTopo.py
@@ -1,5 +1,6 @@
+#!/usr/bin/python
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,8 +20,6 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
 
-#!/usr/bin/python
-
 """
 Custom topology for Mininet
 """
@@ -35,19 +34,23 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class VLANHost( Host ):
+
     def config( self, vlan=100, **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ifconfig %s inet 0' % intf )
         self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
-        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params[ 'ip' ] ) )
         newName = '%s.%d' % ( intf, vlan )
         intf.name = newName
         self.nameToIntf[ newName ] = intf
         return r
 
+
 class IPv6Host( Host ):
+
     def config( self, v6Addr='1000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
@@ -55,56 +58,59 @@
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='2000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class MyTopo( Topo ):
 
     def __init__( self ):
         # Initialize topology
         Topo.__init__( self )
         # Switch S5 Hosts
-        host1=self.addHost( 'h1', ip='10.1.0.2/24' )
-        host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
-        host3=self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
-        #VLAN hosts
-        host4=self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
-        host5=self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host6=self.addHost( 'h6', ip='11.1.0.2/24' )
-        host7=self.addHost( 'h7', ip='12.1.0.2/24' )
-        #Multicast Sender
-        host8=self.addHost( 'h8', ip='10.1.0.4/24' )
+        host1 = self.addHost( 'h1', ip='10.1.0.2/24' )
+        host2 = self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+        host3 = self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
+        # VLAN hosts
+        host4 = self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
+        host5 = self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host6 = self.addHost( 'h6', ip='11.1.0.2/24' )
+        host7 = self.addHost( 'h7', ip='12.1.0.2/24' )
+        # Multicast Sender
+        host8 = self.addHost( 'h8', ip='10.1.0.4/24' )
 
         # Switch S6 Hosts
-        host9=self.addHost( 'h9', ip='10.1.0.5/24' )
-        host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
-        host11=self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
-        #VLAN hosts
-        host12=self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
-        host13=self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host14=self.addHost( 'h14', ip='11.1.0.3/24' )
-        host15=self.addHost( 'h15', ip='12.1.0.3/24' )
-        #Multicast Receiver
-        host16=self.addHost( 'h16', ip='10.1.0.7/24' )
+        host9 = self.addHost( 'h9', ip='10.1.0.5/24' )
+        host10 = self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+        host11 = self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
+        # VLAN hosts
+        host12 = self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
+        host13 = self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host14 = self.addHost( 'h14', ip='11.1.0.3/24' )
+        host15 = self.addHost( 'h15', ip='12.1.0.3/24' )
+        # Multicast Receiver
+        host16 = self.addHost( 'h16', ip='10.1.0.7/24' )
 
         # Switch S7 Hosts
-        host17=self.addHost( 'h17', ip='10.1.0.8/24' )
-        host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
-        host19=self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
-        #VLAN hosts
-        host20=self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
-        host21=self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host22=self.addHost( 'h22', ip='11.1.0.4/24' )
-        host23=self.addHost( 'h23', ip='12.1.0.4/24' )
-        #Multicast Receiver
-        host24=self.addHost( 'h24', ip='10.1.0.10/24' )
+        host17 = self.addHost( 'h17', ip='10.1.0.8/24' )
+        host18 = self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+        host19 = self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
+        # VLAN hosts
+        host20 = self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
+        host21 = self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host22 = self.addHost( 'h22', ip='11.1.0.4/24' )
+        host23 = self.addHost( 'h23', ip='12.1.0.4/24' )
+        # Multicast Receiver
+        host24 = self.addHost( 'h24', ip='10.1.0.10/24' )
 
         s1 = self.addSwitch( 's1' )
         s2 = self.addSwitch( 's2' )
@@ -114,56 +120,57 @@
         s6 = self.addSwitch( 's6' )
         s7 = self.addSwitch( 's7' )
 
-        self.addLink(s5,host1)
-        self.addLink(s5,host2)
-        self.addLink(s5,host3)
-        self.addLink(s5,host4)
-        self.addLink(s5,host5)
-        self.addLink(s5,host6)
-        self.addLink(s5,host7)
-        self.addLink(s5,host8)
+        self.addLink( s5, host1 )
+        self.addLink( s5, host2 )
+        self.addLink( s5, host3 )
+        self.addLink( s5, host4 )
+        self.addLink( s5, host5 )
+        self.addLink( s5, host6 )
+        self.addLink( s5, host7 )
+        self.addLink( s5, host8 )
 
-        self.addLink(s6,host9)
-        self.addLink(s6,host10)
-        self.addLink(s6,host11)
-        self.addLink(s6,host12)
-        self.addLink(s6,host13)
-        self.addLink(s6,host14)
-        self.addLink(s6,host15)
-        self.addLink(s6,host16)
+        self.addLink( s6, host9 )
+        self.addLink( s6, host10 )
+        self.addLink( s6, host11 )
+        self.addLink( s6, host12 )
+        self.addLink( s6, host13 )
+        self.addLink( s6, host14 )
+        self.addLink( s6, host15 )
+        self.addLink( s6, host16 )
 
-        self.addLink(s7,host17)
-        self.addLink(s7,host18)
-        self.addLink(s7,host19)
-        self.addLink(s7,host20)
-        self.addLink(s7,host21)
-        self.addLink(s7,host22)
-        self.addLink(s7,host23)
-        self.addLink(s7,host24)
+        self.addLink( s7, host17 )
+        self.addLink( s7, host18 )
+        self.addLink( s7, host19 )
+        self.addLink( s7, host20 )
+        self.addLink( s7, host21 )
+        self.addLink( s7, host22 )
+        self.addLink( s7, host23 )
+        self.addLink( s7, host24 )
 
-        self.addLink(s1,s2)
-        self.addLink(s1,s3)
-        self.addLink(s1,s4)
-        self.addLink(s1,s5)
-        self.addLink(s2,s3)
-        self.addLink(s2,s5)
-        self.addLink(s2,s6)
-        self.addLink(s3,s4)
-        self.addLink(s3,s6)
-        self.addLink(s4,s7)
+        self.addLink( s1, s2 )
+        self.addLink( s1, s3 )
+        self.addLink( s1, s4 )
+        self.addLink( s1, s5 )
+        self.addLink( s2, s3 )
+        self.addLink( s2, s5 )
+        self.addLink( s2, s6 )
+        self.addLink( s3, s4 )
+        self.addLink( s3, s6 )
+        self.addLink( s4, s7 )
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.py b/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.py
index 2d0e86d..4488458 100644
--- a/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.py
+++ b/TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # Testing the basic intent for ipv6 functionality of ONOS
 
 
@@ -103,9 +102,9 @@
 
         main.step( "Checking that ONOS is ready" )
 
-        ready =  utilities.retry( main.Cluster.command,
+        ready = utilities.retry( main.Cluster.command,
                                   False,
-                                  kwargs={ "function":"summary", "contentCheck":True },
+                                  kwargs={ "function": "summary", "contentCheck": True },
                                   sleep=30,
                                   attempts=3 )
         utilities.assert_equals( expect=True, actual=ready,
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/dependencies/FUNCIpv6IntentFunction.py b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/FUNCIpv6IntentFunction.py
index b45704e..afe8829 100644
--- a/TestON/tests/FUNC/FUNCipv6Intent/dependencies/FUNCIpv6IntentFunction.py
+++ b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/FUNCIpv6IntentFunction.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -1884,7 +1884,7 @@
     main.log.info( itemName + ": Checking intents state" )
     # First check of intents
     stateResult = main.Cluster.command( "checkIntentState",
-                                         kwargs={ "intentsId":intentsId },
+                                         kwargs={ "intentsId": intentsId },
                                          returnBool=True, specificDriver=2 )
 
     expectedState = [ 'INSTALLED', 'INSTALLING' ]
@@ -1899,8 +1899,8 @@
         # Second check of intents since some of the intents may be in
         # INSTALLING state, they should be in INSTALLED at this time
         stateResult = main.Cluster.command( "checkIntentState",
-                                     kwargs={ "intentsId":intentsId },
-                                     returnBool=True, specificDriver=2 )
+                                            kwargs={ "intentsId": intentsId },
+                                            returnBool=True, specificDriver=2 )
         if stateResult:
             main.log.info( itemName + ": Intents are installed correctly" )
             intentResult = main.TRUE
diff --git a/TestON/tests/FUNC/FUNCipv6Intent/dependencies/newFuncTopo.py b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/newFuncTopo.py
old mode 100755
new mode 100644
index 91b2fc5..03d2eae
--- a/TestON/tests/FUNC/FUNCipv6Intent/dependencies/newFuncTopo.py
+++ b/TestON/tests/FUNC/FUNCipv6Intent/dependencies/newFuncTopo.py
@@ -1,5 +1,6 @@
+# !/usr/bin/python
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,8 +20,6 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
 
-#!/usr/bin/python
-
 """
 Custom topology for Mininet
 """
@@ -35,20 +34,24 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class VLANHost( Host ):
+
     def config( self, vlan=100, v6Addr='3000::1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ifconfig %s inet 0' % intf )
         self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
-        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params[ 'ip' ] ) )
         self.cmd( 'ip -6 addr add %s dev %s.%d' % ( v6Addr, intf, vlan ) )
         newName = '%s.%d' % ( intf, vlan )
         intf.name = newName
         self.nameToIntf[ newName ] = intf
         return r
 
+
 class IPv6Host( Host ):
+
     def config( self, v6Addr='1000::1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
@@ -56,51 +59,54 @@
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='2000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class MyTopo( Topo ):
 
     def __init__( self ):
         # Initialize topology
         Topo.__init__( self )
         # Switch S5 Hosts
-        host1=self.addHost( 'h1', cls=IPv6Host, v6Addr='10:1:0::1/64' )
-        host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+        host1 = self.addHost( 'h1', cls=IPv6Host, v6Addr='10:1:0::1/64' )
+        host2 = self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
         # Dual Stack Host
-        host3=self.addHost( 'h3', cls=dualStackHost, v6Addr='2000::2/64' )
-        host4=self.addHost( 'h4', cls=IPv6Host, v6Addr='3000::2/64' )
-        #VLAN
-        host5=self.addHost( 'h5', cls=VLANHost,v6Addr='4000::2/64' )
-        host6=self.addHost( 'h6', cls=IPv6Host, v6Addr='11:1:0::2/64' )
-        host7=self.addHost( 'h7', cls=IPv6Host, v6Addr='12:1:0::2/64' )
-        host8=self.addHost( 'h8', cls=IPv6Host, v6Addr='10:1:0::4/64' )
+        host3 = self.addHost( 'h3', cls=dualStackHost, v6Addr='2000::2/64' )
+        host4 = self.addHost( 'h4', cls=IPv6Host, v6Addr='3000::2/64' )
+        # VLAN
+        host5 = self.addHost( 'h5', cls=VLANHost, v6Addr='4000::2/64' )
+        host6 = self.addHost( 'h6', cls=IPv6Host, v6Addr='11:1:0::2/64' )
+        host7 = self.addHost( 'h7', cls=IPv6Host, v6Addr='12:1:0::2/64' )
+        host8 = self.addHost( 'h8', cls=IPv6Host, v6Addr='10:1:0::4/64' )
 
         # Switch S6 Hosts
-        host9=self.addHost( 'h9', cls=IPv6Host, v6Addr='10:1:0::5/64' )
-        host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+        host9 = self.addHost( 'h9', cls=IPv6Host, v6Addr='10:1:0::5/64' )
+        host10 = self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
         # Dual Stack Host
-        host11=self.addHost( 'h11', cls=dualStackHost, v6Addr='2000::3/64' )
-        host12=self.addHost( 'h12', cls=IPv6Host, v6Addr='3000::3/64' )
-        host13=self.addHost( 'h13', cls=IPv6Host, v6Addr='4000::3/64' )
-        host14=self.addHost( 'h14', cls=IPv6Host, v6Addr='11:1:0::3/64' )
-        host15=self.addHost( 'h15', cls=IPv6Host, v6Addr='12:1:0::3/64' )
-        host16=self.addHost( 'h16', cls=IPv6Host, v6Addr='10:1:0::7/64' )
+        host11 = self.addHost( 'h11', cls=dualStackHost, v6Addr='2000::3/64' )
+        host12 = self.addHost( 'h12', cls=IPv6Host, v6Addr='3000::3/64' )
+        host13 = self.addHost( 'h13', cls=IPv6Host, v6Addr='4000::3/64' )
+        host14 = self.addHost( 'h14', cls=IPv6Host, v6Addr='11:1:0::3/64' )
+        host15 = self.addHost( 'h15', cls=IPv6Host, v6Addr='12:1:0::3/64' )
+        host16 = self.addHost( 'h16', cls=IPv6Host, v6Addr='10:1:0::7/64' )
 
         # Switch S7 Hosts
-        host17=self.addHost( 'h17', cls=IPv6Host, v6Addr='10:1:0::8/64' )
-        host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
-        host19=self.addHost( 'h19', cls=IPv6Host, v6Addr='10:1:0::9/64' )
-        host20=self.addHost( 'h20', cls=IPv6Host, v6Addr='100:1:0::4/64' )
-        host21=self.addHost( 'h21', cls=IPv6Host, v6Addr='200:1:0::4/64' )
-        host22=self.addHost( 'h22', cls=IPv6Host, v6Addr='11:1:0::4/64' )
-        host23=self.addHost( 'h23', cls=IPv6Host, v6Addr='12:1:0::4/64' )
-        # VLAN 
-        host24=self.addHost( 'h24', cls=VLANHost, v6Addr='4000::5/64' )
+        host17 = self.addHost( 'h17', cls=IPv6Host, v6Addr='10:1:0::8/64' )
+        host18 = self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+        host19 = self.addHost( 'h19', cls=IPv6Host, v6Addr='10:1:0::9/64' )
+        host20 = self.addHost( 'h20', cls=IPv6Host, v6Addr='100:1:0::4/64' )
+        host21 = self.addHost( 'h21', cls=IPv6Host, v6Addr='200:1:0::4/64' )
+        host22 = self.addHost( 'h22', cls=IPv6Host, v6Addr='11:1:0::4/64' )
+        host23 = self.addHost( 'h23', cls=IPv6Host, v6Addr='12:1:0::4/64' )
+        # VLAN
+        host24 = self.addHost( 'h24', cls=VLANHost, v6Addr='4000::5/64' )
 
         s1 = self.addSwitch( 's1' )
         s2 = self.addSwitch( 's2' )
@@ -110,56 +116,57 @@
         s6 = self.addSwitch( 's6' )
         s7 = self.addSwitch( 's7' )
 
-        self.addLink(s5,host1)
-        self.addLink(s5,host2)
-        self.addLink(s5,host3)
-        self.addLink(s5,host4)
-        self.addLink(s5,host5)
-        self.addLink(s5,host6)
-        self.addLink(s5,host7)
-        self.addLink(s5,host8)
+        self.addLink( s5, host1 )
+        self.addLink( s5, host2 )
+        self.addLink( s5, host3 )
+        self.addLink( s5, host4 )
+        self.addLink( s5, host5 )
+        self.addLink( s5, host6 )
+        self.addLink( s5, host7 )
+        self.addLink( s5, host8 )
 
-        self.addLink(s6,host9)
-        self.addLink(s6,host10)
-        self.addLink(s6,host11)
-        self.addLink(s6,host12)
-        self.addLink(s6,host13)
-        self.addLink(s6,host14)
-        self.addLink(s6,host15)
-        self.addLink(s6,host16)
+        self.addLink( s6, host9 )
+        self.addLink( s6, host10 )
+        self.addLink( s6, host11 )
+        self.addLink( s6, host12 )
+        self.addLink( s6, host13 )
+        self.addLink( s6, host14 )
+        self.addLink( s6, host15 )
+        self.addLink( s6, host16 )
 
-        self.addLink(s7,host17)
-        self.addLink(s7,host18)
-        self.addLink(s7,host19)
-        self.addLink(s7,host20)
-        self.addLink(s7,host21)
-        self.addLink(s7,host22)
-        self.addLink(s7,host23)
-        self.addLink(s7,host24)
+        self.addLink( s7, host17 )
+        self.addLink( s7, host18 )
+        self.addLink( s7, host19 )
+        self.addLink( s7, host20 )
+        self.addLink( s7, host21 )
+        self.addLink( s7, host22 )
+        self.addLink( s7, host23 )
+        self.addLink( s7, host24 )
 
-        self.addLink(s1,s2)
-        self.addLink(s1,s3)
-        self.addLink(s1,s4)
-        self.addLink(s1,s5)
-        self.addLink(s2,s3)
-        self.addLink(s2,s5)
-        self.addLink(s2,s6)
-        self.addLink(s3,s4)
-        self.addLink(s3,s6)
-        self.addLink(s4,s7)
+        self.addLink( s1, s2 )
+        self.addLink( s1, s3 )
+        self.addLink( s1, s4 )
+        self.addLink( s1, s5 )
+        self.addLink( s2, s3 )
+        self.addLink( s2, s5 )
+        self.addLink( s2, s6 )
+        self.addLink( s3, s4 )
+        self.addLink( s3, s6 )
+        self.addLink( s4, s7 )
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.py b/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.py
index ef5eb99..cb80126 100644
--- a/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.py
+++ b/TestON/tests/FUNC/FUNCnetCfg/FUNCnetCfg.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # Testing the basic intent functionality of ONOS
 
 
@@ -36,7 +35,6 @@
             - Checkout ONOS master branch
             - Pull latest ONOS code
         """
-
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -222,7 +220,6 @@
                                " not discovered yet. One device is allowed" +\
                                ", the other disallowed."
 
-
         pprint = main.Cluster.active( 0 ).REST.pprint
 
         main.step( "Add Net Cfg for switch1" )
@@ -241,14 +238,14 @@
                                                               subjectKey="of:0000000000000001",
                                                               configKey="basic" )
         s1Result = False
-        #Wait 5 secs after set up netCfg
+        # Wait 5 secs after set up netCfg
         time.sleep( main.SetNetCfgSleep )
         if setS1Allow:
             getS1 = utilities.retry( f=main.Cluster.active( 0 ).REST.getNetCfg,
                                      retValue=False,
-                                     kwargs={"subjectClass":"devices",
-                                             "subjectKey" : "of:0000000000000001",
-                                             "configKey" : "basic"},
+                                     kwargs={ "subjectClass": "devices",
+                                              "subjectKey": "of:0000000000000001",
+                                              "configKey": "basic" },
                                      attempts=main.retrytimes,
                                      sleep=main.retrysleep )
             onosCfg = pprint( getS1 )
@@ -290,9 +287,9 @@
             # Check what we set is what is in ONOS
             getS3 = utilities.retry( f=main.Cluster.active( 0 ).REST.getNetCfg,
                                      retValue=False,
-                                     kwargs={"subjectClass": "devices",
-                                            "subjectKey": "of:0000000000000003",
-                                            "configKey": "basic"},
+                                     kwargs={ "subjectClass": "devices",
+                                              "subjectKey": "of:0000000000000003",
+                                              "configKey": "basic" },
                                      attempts=main.retrytimes,
                                      sleep=main.retrysleep )
             onosCfg = pprint( getS3 )
@@ -400,9 +397,9 @@
             # Check what we set is what is in ONOS
             getS2 = utilities.retry( f=main.Cluster.active( 1 ).REST.getNetCfg,
                                      retValue=False,
-                                     kwargs={"subjectClass": "devices",
-                                            "subjectKey": "of:0000000000000002",
-                                            "configKey": "basic"},
+                                     kwargs={ "subjectClass": "devices",
+                                              "subjectKey": "of:0000000000000002",
+                                              "configKey": "basic" },
                                      attempts=main.retrytimes,
                                      sleep=main.retrysleep )
             onosCfg = pprint( getS2 )
@@ -432,17 +429,17 @@
         main.log.info( "s4Json:" + str( s4Json ) )
         main.s4Json = s4Json
         setS4Disallow = main.Cluster.active( 2 ).REST.setNetCfg( s4Json,
-                                                  subjectClass="devices",
-                                                  subjectKey="of:0000000000000004",
-                                                  configKey="basic" )
+                                                                 subjectClass="devices",
+                                                                 subjectKey="of:0000000000000004",
+                                                                 configKey="basic" )
         s4Result = False
         if setS4Disallow:
             # Check what we set is what is in ONOS
             getS4 = utilities.retry( f=main.Cluster.active( 2 ).REST.getNetCfg,
                                      retValue=False,
-                                     kwargs={"subjectClass": "devices",
-                                            "subjectKey": "of:0000000000000004",
-                                            "configKey": "basic"},
+                                     kwargs={ "subjectClass": "devices",
+                                              "subjectKey": "of:0000000000000004",
+                                              "configKey": "basic" },
                                      attempts=main.retrytimes,
                                      sleep=main.retrysleep )
 
@@ -511,8 +508,6 @@
                                  onpass="Configured devices' annotations are correct",
                                  onfail="Incorrect annotations for configured devices." )
 
-
-
     def CASE24( self, main ):
         """
         Testing removal of configurations
@@ -616,8 +611,8 @@
         main.step( "Assert the net config for devices is empty" )
 
         get = utilities.retry( f=main.Cluster.active( 2 ).REST.getNetCfg,
-                               retValue = False,
-                               kwargs={"subjectClass":"devices"},
+                               retValue=False,
+                               kwargs={ "subjectClass": "devices" },
                                sleep=main.retrysleep,
                                attempts=main.retrytimes )
 
@@ -746,9 +741,9 @@
         if setS6Disallow:
             getS6 = utilities.retry( f=main.Cluster.active( 0 ).REST.getNetCfg,
                                      retValue=False,
-                                     kwargs={"subjectClass":"devices",
-                                            "subjectKey" : "of:0000000000000006",
-                                            "configKey" : "basic"},
+                                     kwargs={ "subjectClass": "devices",
+                                              "subjectKey": "of:0000000000000006",
+                                              "configKey": "basic" },
                                      sleep=main.retrysleep,
                                      attempts=main.retrytimes )
             onosCfg = pprint( getS6 )
diff --git a/TestON/tests/FUNC/FUNCnetCfg/dependencies/netCfg.py b/TestON/tests/FUNC/FUNCnetCfg/dependencies/netCfg.py
index 0cc46e8..9523e81 100644
--- a/TestON/tests/FUNC/FUNCnetCfg/dependencies/netCfg.py
+++ b/TestON/tests/FUNC/FUNCnetCfg/dependencies/netCfg.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -35,19 +35,19 @@
     responses = []
     result = utilities.retry( f=checkNodeResponses,
                               retValue=False,
-                              kwargs={'main' : main,'responses' : responses},
-                              sleep = main.retrysleep,
-                              attempts = main.retrytimes )
+                              kwargs={ 'main': main, 'responses': responses },
+                              sleep=main.retrysleep,
+                              attempts=main.retrytimes )
     utilities.assert_equals( expect=True,
                              actual=result,
                              onpass="Net Cfg is the same on all nodes",
                              onfail="Check Net Cfg failed. Check above messages." )
 
 
-def checkNodeResponses ( main, responses ):
+def checkNodeResponses( main, responses ):
     numberOfFailedNodes = 0  # Tracks the number of nodes that failed to get net configuration
     for ctrl in main.Cluster.active():
-        response = ctrl.REST.getNetCfg( )
+        response = ctrl.REST.getNetCfg()
         responses.append( ctrl.REST.pprint( response ) )
         if response == main.FALSE:
             numberOfFailedNodes += 1
@@ -65,24 +65,25 @@
             main.log.debug( i )
     return False
 
+
 def checkDeviceAnnotations( main, jsonObj, sw ):
     id = str( sw.get( 'id' ) )
     keys = [ 'name', 'owner', 'rackAddress' ]
     correct = True
     for k in keys:
-        if str( sw.get( 'annotations', {} ).get( k ) ) != str( jsonObj[ k ] ) :
+        if str( sw.get( 'annotations', {} ).get( k ) ) != str( jsonObj[ k ] ):
             correct = False
             main.log.debug( "{} is wrong on switch: ".format( k ) + id )
     if not correct:
-        main.log.error( "Annotations for switch " + id  + " are incorrect: {}".format( sw ) )
+        main.log.error( "Annotations for switch " + id + " are incorrect: {}".format( sw ) )
     return correct
 
 
 def checkAllDeviceAnnotations( main, json ):
-    devices = main.Cluster.active( 0 ).REST.devices( )
+    devices = main.Cluster.active( 0 ).REST.devices()
     id = "of:0000000000000001"
     i = 1
-    result = [ ]
+    result = []
     try:
         for sw in json.loads( devices ):
             if id in sw.get( 'id' ):
diff --git a/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py
index d518c5a..ad2c4ba 100644
--- a/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py
+++ b/TestON/tests/FUNC/FUNCnetconf/FUNCnetconf.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # Testing the NETCONF protocol within ONOS
 
 
@@ -94,7 +93,6 @@
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
 
-
     def CASE2( self, main ):
         """
         - Set up cell
@@ -123,6 +121,7 @@
         except ( NameError, AttributeError ):
             main.Utils = Utils()
         main.Utils.copyKarafLog( "cycle" + str( main.cycle ) )
+
     def CASE100( self, main ):
         """
             Start NETCONF app and OFC-Server or make sure that they are already running
diff --git a/TestON/tests/FUNC/FUNCnetconf/dependencies/netconf.py b/TestON/tests/FUNC/FUNCnetconf/dependencies/netconf.py
index ce8620a..b8e7054 100644
--- a/TestON/tests/FUNC/FUNCnetconf/dependencies/netconf.py
+++ b/TestON/tests/FUNC/FUNCnetconf/dependencies/netconf.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -66,6 +66,7 @@
         main.log.error( self.name + ":    " + self.handle.before )
         main.cleanAndExit()
 
+
 def createConfig( main ):
     """
         This function writes a configuration file that can later be sent to the
diff --git a/TestON/tests/FUNC/FUNCoptical/FUNCoptical.py b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.py
index 00d5cab..aa298ab 100644
--- a/TestON/tests/FUNC/FUNCoptical/FUNCoptical.py
+++ b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # Testing the basic intent functionality of ONOS
 
 
@@ -90,16 +89,15 @@
         """
             Start Mininet opticalTest Topology
         """
-
         main.case( "Mininet with Linc-OE startup" )
         main.step( "Push TopoDDriver.json to ONOS through onos-netcfg" )
         topoResult = True
         for ctrl in main.Cluster.active():
             topoResult = topoResult and \
-                         main.ONOSbench.onosNetCfg(controllerIp=ctrl.ipAddress,
-                                                   path=main.dependencyPath,
-                                                   fileName="TopoDDriver.json")
-        #Exit if topology did not load properly
+                         main.ONOSbench.onosNetCfg( controllerIp=ctrl.ipAddress,
+                                                    path=main.dependencyPath,
+                                                    fileName="TopoDDriver.json" )
+        # Exit if topology did not load properly
         if not topoResult:
             main.cleanAndExit()
 
@@ -190,6 +188,7 @@
         except ( NameError, AttributeError ):
             main.Utils = Utils()
         main.Utils.copyKarafLog( "cycle" + str( main.cycle ) )
+
     def CASE21( self, main ):
         """
             Run pingall to discover all hosts
@@ -219,7 +218,7 @@
 
         arpingHostResults = main.TRUE
         for host in hosts:
-            if main.LincOE.arping( host, ethDevice=host+"-eth0" ):
+            if main.LincOE.arping( host, ethDevice=host + "-eth0" ):
                 main.log.info( "Successfully reached host {} with arping".format( host ) )
             else:
                 main.log.error( "Could not reach host {} with arping".format( host ) )
@@ -371,7 +370,6 @@
                                  onpass="ONOS correctly discovered the topology",
                                  onfail="ONOS incorrectly discovered the topology" )
 
-
     def CASE31( self, main ):
         import time
         """
@@ -404,8 +402,8 @@
                                                          intentsId=main.pIntentsId )
         time.sleep( 10 )
         checkStateResult = utilities.retry( f=main.Cluster.active( 0 ).CLI.checkIntentState,
-                                           retValue=main.FALSE, args=( main.pIntentsId, "INSTALLED" ),
-                                           sleep=main.checkIntentSleep, attempts=10 )
+                                            retValue=main.FALSE, args=( main.pIntentsId, "INSTALLED" ),
+                                            sleep=main.checkIntentSleep, attempts=10 )
         main.log.info( "Checking flows state" )
         checkFlowResult = main.Cluster.active( 0 ).CLI.checkFlowsState()
         # Sleep for 10 seconds to provide time for the intent state to change
@@ -453,11 +451,11 @@
                 time.sleep( 15 )
 
             for ctrl in main.Cluster.active():
-                if not any ( intent.get('state') == 'WITHDRAWING' for intent
-                         in json.loads( ctrl.CLI.intents() ) ):
-                        main.log.debug( json.loads( ctrl.CLI.intents() ) )
-                        removeResult = main.FALSE
-                        break
+                if not any( intent.get( 'state' ) == 'WITHDRAWING' for intent
+                            in json.loads( ctrl.CLI.intents() ) ):
+                    main.log.debug( json.loads( ctrl.CLI.intents() ) )
+                    removeResult = main.FALSE
+                    break
                 else:
                     removeResult = main.TRUE
         except ( TypeError, ValueError ):
@@ -547,11 +545,11 @@
             time.sleep( 15 )
 
             for ctrl in main.Cluster.active():
-                if not any ( intent.get('state') == 'WITHDRAWING' for intent
-                         in json.loads( ctrl.CLI.intents() ) ):
-                        main.log.debug( json.loads( ctrl.CLI.intents() ) )
-                        removeResult = main.FALSE
-                        break
+                if not any( intent.get( 'state' ) == 'WITHDRAWING' for intent
+                            in json.loads( ctrl.CLI.intents() ) ):
+                    main.log.debug( json.loads( ctrl.CLI.intents() ) )
+                    removeResult = main.FALSE
+                    break
                 else:
                     removeResult = main.TRUE
         except ( TypeError, ValueError ):
diff --git a/TestON/tests/FUNC/FUNCoptical/dependencies/ectopo.py b/TestON/tests/FUNC/FUNCoptical/dependencies/ectopo.py
index 576eb51..9413c98 100644
--- a/TestON/tests/FUNC/FUNCoptical/dependencies/ectopo.py
+++ b/TestON/tests/FUNC/FUNCoptical/dependencies/ectopo.py
@@ -1,5 +1,6 @@
+# !/usr/bin/env python
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +9,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,8 +20,6 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
 
-#!/usr/bin/env python
-
 from mininet.net import Mininet
 from mininet.topo import Topo
 from mininet.node import Host, RemoteController
@@ -29,9 +28,11 @@
 
 from opticalUtils import LINCSwitch, LINCLink
 
+
 class OpticalTopo( Topo ):
+
     """
-    A simple optical topology of three LINC nodes(OE*), two OVS switches(ps*), and two hosts:
+    A simple optical topology of three LINC nodes( OE* ), two OVS switches( ps* ), and two hosts:
 
               OE3
               /\
@@ -51,19 +52,19 @@
         # set up ROADMs, add them to oel[]
         oel = []
         an = { "durable": "true" }
-        for i in range (1,4):
+        for i in range( 1, 4 ):
             oean = { "optical.regens": 0 }
-            oel.append( self.addSwitch('OE%s' % i, dpid='0000ffffffffff0%s' % i, annotations=oean, cls=LINCSwitch) )
+            oel.append( self.addSwitch( 'OE%s' % i, dpid='0000ffffffffff0%s' % i, annotations=oean, cls=LINCSwitch ) )
 
         # ROADM port numbers are built as: OE1 <-> OE2 = 1200
         # leaving port number up to 100 open for use by Och port
-        self.addLink( oel[0], oel[1], port1=1200, port2=2100, annotations=an, cls=LINCLink )
-        self.addLink( oel[1], oel[2], port1=2300, port2=3200, annotations=an, cls=LINCLink )
-        self.addLink( oel[2], oel[0], port1=3100, port2=1300, annotations=an, cls=LINCLink )
+        self.addLink( oel[ 0 ], oel[ 1 ], port1=1200, port2=2100, annotations=an, cls=LINCLink )
+        self.addLink( oel[ 1 ], oel[ 2 ], port1=2300, port2=3200, annotations=an, cls=LINCLink )
+        self.addLink( oel[ 2 ], oel[ 0 ], port1=3100, port2=1300, annotations=an, cls=LINCLink )
 
         # cross-connects between OVSes and LINCs
-        self.addLink( s1, oel[0], port1=2, port2=1, annotations=an, cls=LINCLink )
-        self.addLink( s2, oel[1], port1=2, port2=1, annotations=an, cls=LINCLink )
+        self.addLink( s1, oel[ 0 ], port1=2, port2=1, annotations=an, cls=LINCLink )
+        self.addLink( s2, oel[ 1 ], port1=2, port2=1, annotations=an, cls=LINCLink )
 
 
 def setup( ctls ):
@@ -71,7 +72,7 @@
     i = 1
     for ctl in ctls:
         net.addController( RemoteController( 'c%d' % i, ip=ctl ) )
-        i+=1
+        i += 1
 
     net.start()
     LINCSwitch.bootOE( net )
@@ -80,11 +81,11 @@
     LINCSwitch.shutdownOE()
 
 
-if __name__ == "__main__" :
+if __name__ == "__main__":
     import sys
-    if len( sys.argv ) >= 2 :
+    if len( sys.argv ) >= 2:
         setLogLevel( 'info' )
         ctls = sys.argv[ 1: ]
         setup( ctls )
     else:
-        print('./ectopo.py [IP1] [IP2]...\n')
+        print( './ectopo.py [IP1] [IP2]...\n' )
diff --git a/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.py b/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.py
index ad55a9a..6b6ad93 100644
--- a/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.py
+++ b/TestON/tests/FUNC/FUNCovsdbtest/FUNCovsdbtest.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Description: This test is to check onos set configuration and flows with ovsdb connection.
 
@@ -79,7 +78,6 @@
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
 
-
         cliResults = main.testSetUp.ONOSSetUp( main.OVSDB1, main.Cluster,
                                                cellName=cellName, removeLog=True )
 
@@ -469,7 +467,7 @@
 
         main.step( "Post Network Data via HTTP(Post port need post network)" )
         Poststatus, result = main.Cluster.active( 0 ).REST.send( ctrlip, httpport, '', path + 'networks/',
-                                                 'POST', None, networkpostdata )
+                                                                 'POST', None, networkpostdata )
         utilities.assert_equals(
                 expect='200',
                 actual=Poststatus,
@@ -478,7 +476,7 @@
 
         main.step( "Post Subnet Data via HTTP(Post port need post subnet)" )
         Poststatus, result = main.Cluster.active( 0 ).REST.send( ctrlip, httpport, '', path + 'subnets/',
-                                                 'POST', None, subnetpostdata )
+                                                                 'POST', None, subnetpostdata )
         utilities.assert_equals(
                 expect='202',
                 actual=Poststatus,
@@ -487,7 +485,7 @@
 
         main.step( "Post Port1 Data via HTTP" )
         Poststatus, result = main.Cluster.active( 0 ).REST.send( ctrlip, httpport, '', path + 'ports/',
-                                                 'POST', None, port1postdata )
+                                                                 'POST', None, port1postdata )
         utilities.assert_equals(
                 expect='200',
                 actual=Poststatus,
@@ -496,7 +494,7 @@
 
         main.step( "Post Port2 Data via HTTP" )
         Poststatus, result = main.Cluster.active( 0 ).REST.send( ctrlip, httpport, '', path + 'ports/',
-                                                 'POST', None, port2postdata )
+                                                                 'POST', None, port2postdata )
         utilities.assert_equals(
                 expect='200',
                 actual=Poststatus,
diff --git a/TestON/tests/FUNC/FUNCovsdbtest/dependencies/Nbdata.py b/TestON/tests/FUNC/FUNCovsdbtest/dependencies/Nbdata.py
index d93756f..b00b183 100644
--- a/TestON/tests/FUNC/FUNCovsdbtest/dependencies/Nbdata.py
+++ b/TestON/tests/FUNC/FUNCovsdbtest/dependencies/Nbdata.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file provide the data
 lanqinglong@huawei.com
diff --git a/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.py b/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.py
index 5d471ad..73e7f4a 100644
--- a/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.py
+++ b/TestON/tests/FUNC/FUNCvirNetNB/FUNCvirNetNB.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,9 +17,7 @@
 
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-"""
 
-"""
 Description: This test is to determine if North bound
     can handle the request
 
@@ -78,8 +76,8 @@
         main.testSetUp.envSetupDescription()
         stepResult = main.FALSE
         try:
-            main.apps = main.params['ENV']['cellApps']
-            cellName = main.params['ENV']['cellName']
+            main.apps = main.params[ 'ENV' ][ 'cellApps' ]
+            cellName = main.params[ 'ENV' ][ 'cellName' ]
             main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
             stepResult = main.testSetUp.envSetup()
         except Exception as e:
@@ -126,8 +124,7 @@
 
         main.log.info( "ONOS Network Post test Start" )
         main.case( "Virtual Network NBI Test - Network" )
-        main.caseExplanation  = "Test Network Post NBI " +\
-                                "Verify Post Data same with Stored Data"
+        main.caseExplanation = "Test Network Post NBI Verify Post Data same with Stored Data"
 
         ctrlip = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
         port = main.params[ 'HTTP' ][ 'port' ]
@@ -198,8 +195,7 @@
 
         main.log.info( "ONOS Network Update test Start" )
         main.case( "Virtual Network NBI Test - Network" )
-        main.caseExplanation  = "Test Network Update NBI " +\
-                                "Verify Update Data same with Stored Data"
+        main.caseExplanation = "Test Network Update NBI Verify Update Data same with Stored Data"
 
         ctrlip = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
         port = main.params[ 'HTTP' ][ 'port' ]
@@ -449,10 +445,10 @@
         networkpostdata = network.DictoJson()
         subnetpostdata = subnet.DictoJson()
 
-        #Change allocation_poolsdata scope
+        # Change allocation_poolsdata scope
         subnet.start = "192.168.102.1"
         subnet.end = "192.168.102.255"
-        #end change
+        # end change
         newsubnetpostdata = subnet.DictoJson()
         ctrl = main.Cluster.active( 0 )
         main.step( "Post Network Data via HTTP(Post Subnet need post network)" )
@@ -740,10 +736,10 @@
         subnetpostdata = subnet.DictoJson()
         portpostdata = port.DictoJson()
 
-        #create update data
+        # create update data
         port.name = "onos-new"
         newportpostdata = port.DictoJson()
-        #end
+        # end
         ctrl = main.Cluster.active( 0 )
         main.step( "Post Network Data via HTTP(Post port need post network)" )
         Poststatus, result = ctrl.REST.send( ctrlip, httpport, '', path + 'networks/',
@@ -932,8 +928,7 @@
 
         main.log.info( "ONOS Post Error Json Create Network test Start" )
         main.case( "Virtual Network NBI Test - Network" )
-        main.caseExplanation  = "Test Network Post With Error json " +\
-                                "The wrong Json can't post network successfully"
+        main.caseExplanation = "Test Network Post With Error json The wrong Json can't post network successfully"
 
         ctrlip = os.getenv( main.params[ 'CTRL' ][ 'ip1' ] )
         port = main.params[ 'HTTP' ][ 'port' ]
@@ -943,11 +938,11 @@
         network = NetworkData()
         network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
         network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
-        #The network.admin_state_up should be True or False,when the admin_state_up is 'tttttttttt',the Json can't post.
+        # The network.admin_state_up should be True or False,when the admin_state_up is 'tttttttttt',the Json can't post.
         network.admin_state_up = 'tttttttttt'
-        #The network.routerExternal should be True or False,when the routerExternal is 'ffffffffffff',the Json can't post.
+        # The network.routerExternal should be True or False,when the routerExternal is 'ffffffffffff',the Json can't post.
         network.routerExternal = 'ffffffffffff'
-        #The network.shared should be True or False,when the shared is 'ffffffffffffff',the Json can't post.
+        # The network.shared should be True or False,when the shared is 'ffffffffffffff',the Json can't post.
         network.shared = 'ffffffffffffff'
         postdata = network.DictoJson()
 
@@ -990,9 +985,9 @@
         network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
         subnet = SubnetData()
         subnet.id = "e44bd655-e22c-4aeb-b1e9-ea1606875178"
-        #The subnet.enable_dhcp should be True or False,when the enable_dhcp is 'tttttttttttttt',the Json can't post.
+        # The subnet.enable_dhcp should be True or False,when the enable_dhcp is 'tttttttttttttt',the Json can't post.
         subnet.enable_dhcp = 'tttttttttttttt'
-        #The subnet.tenant_id should be True or False,when the tenant_id is ffffffffffffff',the Json can't post.
+        # The subnet.tenant_id should be True or False,when the tenant_id is ffffffffffffff',the Json can't post.
         subnet.shared = 'ffffffffffffff'
         subnet.tenant_id = network.tenant_id
         subnet.network_id = network.id
@@ -1055,7 +1050,7 @@
         port.subnet_id = subnet.id
         port.tenant_id = network.tenant_id
         port.network_id = network.id
-        #The port.adminStateUp should be True or False,when the adminStateUp is 'tttttttttttt',the Json can't post.
+        # The port.adminStateUp should be True or False,when the adminStateUp is 'tttttttttttt',the Json can't post.
         port.adminStateUp = 'tttttttttttt'
 
         networkpostdata = network.DictoJson()
diff --git a/TestON/tests/FUNC/FUNCvirNetNB/dependencies/Nbdata.py b/TestON/tests/FUNC/FUNCvirNetNB/dependencies/Nbdata.py
index 067991a..55a661b 100644
--- a/TestON/tests/FUNC/FUNCvirNetNB/dependencies/Nbdata.py
+++ b/TestON/tests/FUNC/FUNCvirNetNB/dependencies/Nbdata.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/xoMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 This file provide the data
 lanqinglong@huawei.com
diff --git a/TestON/tests/HA/HAclusterRestart/HAclusterRestart.py b/TestON/tests/HA/HAclusterRestart/HAclusterRestart.py
index 08e437b..2712c3f 100644
--- a/TestON/tests/HA/HAclusterRestart/HAclusterRestart.py
+++ b/TestON/tests/HA/HAclusterRestart/HAclusterRestart.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,9 +18,7 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
-
 Description: This test is to determine if ONOS can handle
     all of it's nodes restarting
 
@@ -110,11 +108,12 @@
         Assign mastership to controllers
         """
         main.HA.assignMastership( main )
+
     def CASE3( self, main ):
         """
         Assign intents
         """
-        main.HA.assignIntents(main)
+        main.HA.assignIntents( main )
 
     def CASE4( self, main ):
         """
@@ -167,7 +166,7 @@
 
         ready = utilities.retry( main.Cluster.command,
                                  False,
-                                 kwargs={ "function":"summary", "contentCheck":True },
+                                 kwargs={ "function": "summary", "contentCheck": True },
                                  sleep=30,
                                  attempts=10 )
         utilities.assert_equals( expect=True, actual=ready,
diff --git a/TestON/tests/HA/HAcontinuousStopNodes/HAcontinuousStopNodes.py b/TestON/tests/HA/HAcontinuousStopNodes/HAcontinuousStopNodes.py
index 026be2d..811e04f 100644
--- a/TestON/tests/HA/HAcontinuousStopNodes/HAcontinuousStopNodes.py
+++ b/TestON/tests/HA/HAcontinuousStopNodes/HAcontinuousStopNodes.py
@@ -1,5 +1,5 @@
 """
-Copyright 2017 Open Networking Foundation (ONF)
+Copyright 2017 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Description: This test is to determine if ONOS can handle
     a minority of it's nodes restarting
@@ -103,7 +102,6 @@
                                   extraClean=main.HA.cleanUpGenPartition )
         main.HA.initialSetUp()
 
-
     def CASE2( self, main ):
         """
         Assign devices to controllers
@@ -255,8 +253,6 @@
         """
         main.HA.compareTopo( main )
 
-
-
     def CASE9( self, main ):
         """
         Link s3-s28 down
diff --git a/TestON/tests/HA/HAfullNetPartition/HAfullNetPartition.py b/TestON/tests/HA/HAfullNetPartition/HAfullNetPartition.py
index c3a2038..cf7fe73 100644
--- a/TestON/tests/HA/HAfullNetPartition/HAfullNetPartition.py
+++ b/TestON/tests/HA/HAfullNetPartition/HAfullNetPartition.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Description: This test is to determine if ONOS can handle
              a full network partion
@@ -102,7 +101,6 @@
                                   extraClean=main.HA.cleanUpGenPartition )
         main.HA.initialSetUp()
 
-
     def CASE2( self, main ):
         """
         Assign devices to controllers
@@ -165,9 +163,9 @@
             this = iCtrl.Bench.sshToNode( iCtrl.ipAddress )
             if i not in main.partition:
                 for j in main.partition:
-                    foe =  main.Cluster.runningNodes[ j ]
+                    foe = main.Cluster.runningNodes[ j ]
                     main.log.warn( "Setting IP Tables rule from {} to {}. ".format( iCtrl.ipAddress, foe.ipAddress ) )
-                    #CMD HERE
+                    # CMD HERE
                     try:
                         cmdStr = "sudo iptables -A {} -d {} -s {} -j DROP".format( "INPUT", iCtrl.ipAddress, foe.ipAddress )
                         this.sendline( cmdStr )
@@ -185,7 +183,7 @@
                     if j not in main.partition:
                         foe = main.Cluster.runningNodes[ j ]
                         main.log.warn( "Setting IP Tables rule from {} to {}. ".format( iCtrl.ipAddress, foe.ipAddress ) )
-                        #CMD HERE
+                        # CMD HERE
                         cmdStr = "sudo iptables -A {} -d {} -s {} -j DROP".format( "INPUT", iCtrl.ipAddress, foe.ipAddress )
                         try:
                             this.sendline( cmdStr )
@@ -235,7 +233,7 @@
         for node in main.partition:
             main.Cluster.runningNodes[ node ].active = True
 
-        '''
+        """
         # NOTE : Not sure if this can be removed
          main.activeNodes.sort()
         try:
@@ -244,8 +242,7 @@
         except AssertionError:
             main.log.exception( "" )
             main.cleanAndExit()
-        '''
-
+        """
         main.step( "Checking ONOS nodes" )
         nodeResults = utilities.retry( main.HA.nodesCheck,
                                        False,
@@ -269,7 +266,6 @@
         """
         Check state after ONOS failure
         """
-
         main.HA.checkStateAfterEvent( main, afterWhich=0 )
 
         main.step( "Leadership Election is still functional" )
diff --git a/TestON/tests/HA/HAkillNodes/HAkillNodes.py b/TestON/tests/HA/HAkillNodes/HAkillNodes.py
index 4a95206..01ebe38 100644
--- a/TestON/tests/HA/HAkillNodes/HAkillNodes.py
+++ b/TestON/tests/HA/HAkillNodes/HAkillNodes.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Description: This test is to determine if ONOS can handle
     a minority of it's nodes restarting
@@ -95,7 +94,7 @@
                                                main.HA.customizeOnosGenPartitions,
                                                main.HA.copyBackupConfig,
                                                main.ONOSbench.preventAutoRespawn ],
-                                  extraClean= main.HA.cleanUpGenPartition )
+                                  extraClean=main.HA.cleanUpGenPartition )
 
         main.HA.initialSetUp( serviceClean=True )
 
@@ -149,7 +148,7 @@
             main.kill.append( main.Cluster.runningNodes[ p - 1 ] )
             # NOTE: This only works for cluster sizes of 3,5, or 7.
 
-        #NOTE: This is to fix an issue with wiki formating
+        # NOTE: This is to fix an issue with wiki formating
         nodeNames = [ node.name for node in main.kill ]
         main.step( "Killing nodes: " + str( nodeNames ) )
         killResults = main.TRUE
diff --git a/TestON/tests/HA/HAsanity/HAsanity.py b/TestON/tests/HA/HAsanity/HAsanity.py
index 82eeac5..baff818 100644
--- a/TestON/tests/HA/HAsanity/HAsanity.py
+++ b/TestON/tests/HA/HAsanity/HAsanity.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Description: This test is to determine if the HA test setup is
     working correctly. There are no failures so this test should
diff --git a/TestON/tests/HA/HAscaling/HAscaling.py b/TestON/tests/HA/HAscaling/HAscaling.py
index f986cc2..63aa1e5 100644
--- a/TestON/tests/HA/HAscaling/HAscaling.py
+++ b/TestON/tests/HA/HAscaling/HAscaling.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Description: This test is to determine if ONOS can handle
              dynamic scaling of the cluster size.
@@ -246,7 +245,6 @@
         """
         Check state after ONOS scaling
         """
-
         main.HA.checkStateAfterEvent( main, afterWhich=1 )
 
         main.step( "Leadership Election is still functional" )
diff --git a/TestON/tests/HA/HAscaling/dependencies/Server.py b/TestON/tests/HA/HAscaling/dependencies/Server.py
index 1a4b550..dbb1247 100644
--- a/TestON/tests/HA/HAscaling/dependencies/Server.py
+++ b/TestON/tests/HA/HAscaling/dependencies/Server.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,10 +18,10 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 "Functions for using the SimpleHTTPServer python module"
 import re
 
+
 class Server():
 
     def __init__( self ):
@@ -65,7 +65,7 @@
                 if logDir:
                     cmd += " &> {}".format( logDir )  # pipe all output to a file
                 else:
-                    cmd += "&> {dev/null}" # Throw away all output
+                    cmd += "&> {dev/null}"  # Throw away all output
                 cmd += " &"
                 handle.sendline( cmd )
                 handle.expect( "\$" )
@@ -79,7 +79,7 @@
                     main.log.debug( handle.before )
                     retValue = main.FALSE
                 # capture PID for later use
-                # EX: [1] 67987
+                # EX: [ 1 ] 67987
                 match = re.search( "\[\d\] (?P<PID>\d+)", response )
                 if match:
                     self.PID = match.group( "PID" )
diff --git a/TestON/tests/HA/HAsingleInstanceRestart/HAsingleInstanceRestart.py b/TestON/tests/HA/HAsingleInstanceRestart/HAsingleInstanceRestart.py
index eeb4310..584232a 100644
--- a/TestON/tests/HA/HAsingleInstanceRestart/HAsingleInstanceRestart.py
+++ b/TestON/tests/HA/HAsingleInstanceRestart/HAsingleInstanceRestart.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Description: This test is to determine if a single
     instance ONOS 'cluster' can handle a restart
@@ -409,7 +408,7 @@
                 mastershipCheck = mastershipCheck and main.TRUE
             else:
                 main.log.warn( "Mastership of switch %s changed; old: %s, new: %s" % ( switchDPID,
-                    old, current ) )
+                                                                                       old, current ) )
                 mastershipCheck = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
@@ -446,57 +445,6 @@
 
         # NOTE: Store has no durability, so intents are lost across system
         #       restarts
-        """
-        main.step( "Compare current intents with intents before the failure" )
-        # NOTE: this requires case 5 to pass for intentState to be set.
-        #      maybe we should stop the test if that fails?
-        sameIntents = main.FALSE
-        try:
-            intentState
-        except NameError:
-            main.log.warn( "No previous intent state was saved" )
-        else:
-            if intentState and intentState == ONOSIntents[ 0 ]:
-                sameIntents = main.TRUE
-                main.log.info( "Intents are consistent with before failure" )
-            # TODO: possibly the states have changed? we may need to figure out
-            #       what the acceptable states are
-            elif len( intentState ) == len( ONOSIntents[ 0 ] ):
-                sameIntents = main.TRUE
-                try:
-                    before = json.loads( intentState )
-                    after = json.loads( ONOSIntents[ 0 ] )
-                    for intent in before:
-                        if intent not in after:
-                            sameIntents = main.FALSE
-                            main.log.debug( "Intent is not currently in ONOS " +
-                                            "(at least in the same form):" )
-                            main.log.debug( json.dumps( intent ) )
-                except ( ValueError, TypeError ):
-                    main.log.exception( "Exception printing intents" )
-                    main.log.debug( repr( ONOSIntents[ 0 ] ) )
-                    main.log.debug( repr( intentState ) )
-            if sameIntents == main.FALSE:
-                try:
-                    main.log.debug( "ONOS intents before: " )
-                    main.log.debug( json.dumps( json.loads( intentState ),
-                                                sort_keys=True, indent=4,
-                                                separators=( ',', ': ' ) ) )
-                    main.log.debug( "Current ONOS intents: " )
-                    main.log.debug( json.dumps( json.loads( ONOSIntents[ 0 ] ),
-                                                sort_keys=True, indent=4,
-                                                separators=( ',', ': ' ) ) )
-                except ( ValueError, TypeError ):
-                    main.log.exception( "Exception printing intents" )
-                    main.log.debug( repr( ONOSIntents[ 0 ] ) )
-                    main.log.debug( repr( intentState ) )
-            utilities.assert_equals(
-                expect=main.TRUE,
-                actual=sameIntents,
-                onpass="Intents are consistent with before failure",
-                onfail="The Intents changed during failure" )
-        intentCheck = intentCheck and sameIntents
-        """
         main.step( "Get the OF Table entries and compare to before " +
                    "component failure" )
         FlowTables = main.TRUE
diff --git a/TestON/tests/HA/HAstopNodes/HAstopNodes.py b/TestON/tests/HA/HAstopNodes/HAstopNodes.py
index e7bdcd4..7b57730 100644
--- a/TestON/tests/HA/HAstopNodes/HAstopNodes.py
+++ b/TestON/tests/HA/HAstopNodes/HAstopNodes.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Description: This test is to determine if ONOS can handle
     a minority of it's nodes restarting
@@ -94,7 +93,7 @@
                                   extraApply=[ main.HA.startingMininet,
                                                main.HA.customizeOnosGenPartitions,
                                                main.HA.copyBackupConfig ],
-                                  extraClean= main.HA.cleanUpGenPartition )
+                                  extraClean=main.HA.cleanUpGenPartition )
 
         main.HA.initialSetUp( serviceClean=True )
 
@@ -148,7 +147,7 @@
             main.kill.append( main.Cluster.runningNodes[ p - 1 ] )
             # NOTE: This only works for cluster sizes of 3,5, or 7.
 
-        #NOTE: This is to fix an issue with wiki formating
+        # NOTE: This is to fix an issue with wiki formating
         nodeNames = [ node.name for node in main.kill ]
         main.step( "Stopping nodes: " + str( nodeNames ) )
         killResults = main.TRUE
diff --git a/TestON/tests/HA/HAswapNodes/HAswapNodes.py b/TestON/tests/HA/HAswapNodes/HAswapNodes.py
index 1fa8106..e0751f6 100644
--- a/TestON/tests/HA/HAswapNodes/HAswapNodes.py
+++ b/TestON/tests/HA/HAswapNodes/HAswapNodes.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Description: This test is to determine if ONOS can handle
              dynamic swapping of cluster nodes.
@@ -96,15 +95,14 @@
         main.testSetUp.evnSetupConclusion( stepResult )
         main.HA.generateGraph( "HAswapNodes" )
 
-
         main.testSetUp.ONOSSetUp( main.Mininet1, main.Cluster, cellName=cellName, removeLog=True,
-                                 extraApply=[ main.HA.setServerForCluster,
-                                              main.HA.swapNodeMetadata,
-                                              main.HA.startingMininet,
-                                              main.HA.copyBackupConfig,
-                                              main.HA.setMetadataUrl ],
-                                 extraClean=main.HA.cleanUpOnosService,
-                                 installMax=True )
+                                  extraApply=[ main.HA.setServerForCluster,
+                                               main.HA.swapNodeMetadata,
+                                               main.HA.startingMininet,
+                                               main.HA.copyBackupConfig,
+                                               main.HA.setMetadataUrl ],
+                                  extraClean=main.HA.cleanUpOnosService,
+                                  installMax=True )
         main.HA.initialSetUp()
 
     def CASE2( self, main ):
@@ -211,9 +209,9 @@
                                  onpass="Nodes check successful",
                                  onfail="Nodes check NOT successful" )
 
-        ready =  utilities.retry( main.Cluster.command,
+        ready = utilities.retry( main.Cluster.command,
                                   False,
-                                  kwargs={ "function":"summary", "contentCheck":True },
+                                  kwargs={ "function": "summary", "contentCheck": True },
                                   sleep=30,
                                   attempts=10 )
         utilities.assert_equals( expect=True, actual=ready,
@@ -235,23 +233,10 @@
 
         main.HA.commonChecks()
 
-        """
-        # Note: Do we really want this? It will revert the changes we have made from this test case.
-
-        main.step( "Reapplying cell variable to environment" )
-        cellName = main.params[ 'ENV' ][ 'cellName' ]
-        cellResult = main.ONOSbench.setCell( cellName )
-        utilities.assert_equals( expect=main.TRUE, actual=cellResult,
-                                 onpass="Set cell successfull",
-                                 onfail="Failled to set cell" )
-        """
-
-
     def CASE7( self, main ):
         """
         Check state after ONOS scaling
         """
-
         main.HA.checkStateAfterEvent( main, afterWhich=1 )
 
         main.step( "Leadership Election is still functional" )
diff --git a/TestON/tests/HA/HAswapNodes/dependencies/Server.py b/TestON/tests/HA/HAswapNodes/dependencies/Server.py
index 1a4b550..dbb1247 100644
--- a/TestON/tests/HA/HAswapNodes/dependencies/Server.py
+++ b/TestON/tests/HA/HAswapNodes/dependencies/Server.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,10 +18,10 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 "Functions for using the SimpleHTTPServer python module"
 import re
 
+
 class Server():
 
     def __init__( self ):
@@ -65,7 +65,7 @@
                 if logDir:
                     cmd += " &> {}".format( logDir )  # pipe all output to a file
                 else:
-                    cmd += "&> {dev/null}" # Throw away all output
+                    cmd += "&> {dev/null}"  # Throw away all output
                 cmd += " &"
                 handle.sendline( cmd )
                 handle.expect( "\$" )
@@ -79,7 +79,7 @@
                     main.log.debug( handle.before )
                     retValue = main.FALSE
                 # capture PID for later use
-                # EX: [1] 67987
+                # EX: [ 1 ] 67987
                 match = re.search( "\[\d\] (?P<PID>\d+)", response )
                 if match:
                     self.PID = match.group( "PID" )
diff --git a/TestON/tests/HA/dependencies/HA.py b/TestON/tests/HA/dependencies/HA.py
index 48b64c6..2227146 100644
--- a/TestON/tests/HA/dependencies/HA.py
+++ b/TestON/tests/HA/dependencies/HA.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 import json
 import time
 
@@ -2795,7 +2794,7 @@
 
         main.ONOSbench.createCellFile( main.ONOSbench.ip_address, cellName,
                                        main.Mininet1.ip_address,
-                                       cellAppString, ipList , main.ONOScli1.karafUser )
+                                       cellAppString, ipList, main.ONOScli1.karafUser )
         main.step( "Applying cell variable to environment" )
         cellResult = main.ONOSbench.setCell( cellName )
         verifyResult = main.ONOSbench.verifyCell()
@@ -2814,7 +2813,7 @@
         assert utilities.assert_equals, "utilities.assert_equals not defined"
         main.case( "Running ONOS Constant State Tests" )
 
-        OnosAfterWhich = [ "failure" , "scaliing" ]
+        OnosAfterWhich = [ "failure", "scaliing" ]
 
         # Assert that each device has a master
         self.checkRoleNotNull()
@@ -2981,7 +2980,7 @@
                 utilities.assert_equals(
                     expect=main.TRUE,
                     actual=sameIntents,
-                    onpass="Intents are consistent with before " + OnosAfterWhich[ afterWhich ] ,
+                    onpass="Intents are consistent with before " + OnosAfterWhich[ afterWhich ],
                     onfail="The Intents changed during " + OnosAfterWhich[ afterWhich ] )
             intentCheck = intentCheck and sameIntents
 
@@ -3032,7 +3031,6 @@
         #       we expect loss in dataplane connectivity
         LossInPings = main.FALSE
         """
-
     def compareTopo( self, main ):
         """
         Compare topo
@@ -3086,7 +3084,7 @@
                                 "Error with host ipAddresses on controller" +
                                 controllerStr + ": " + str( host ) )
                             ipResult = main.FALSE
-            ports = main.topoRelated.getAll( "ports" , True,
+            ports = main.topoRelated.getAll( "ports", True,
                                                   kwargs={ 'sleep': 5, 'attempts': 5,
                                                            'randomTime': True } )
             links = main.topoRelated.getAll( "links", True,
diff --git a/TestON/tests/HA/dependencies/obelisk.py b/TestON/tests/HA/dependencies/obelisk.py
old mode 100755
new mode 100644
index 40cc242..c43941c
--- a/TestON/tests/HA/dependencies/obelisk.py
+++ b/TestON/tests/HA/dependencies/obelisk.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,63 +20,65 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 from mininet.topo import Topo
 
+
 class ObeliskTopo( Topo ):
+
     def __init__( self ):
         Topo.__init__( self )
-        topSwitch = self.addSwitch('s1',dpid='1000'.zfill(16))
-        leftTopSwitch = self.addSwitch('s2',dpid='2000'.zfill(16))
-        rightTopSwitch = self.addSwitch('s5',dpid='5000'.zfill(16))
-        leftBotSwitch = self.addSwitch('s3',dpid='3000'.zfill(16))
-        rightBotSwitch = self.addSwitch('s6',dpid='6000'.zfill(16))
-        midBotSwitch = self.addSwitch('s28',dpid='2800'.zfill(16))
+        topSwitch = self.addSwitch( 's1', dpid='1000'.zfill( 16 ) )
+        leftTopSwitch = self.addSwitch( 's2', dpid='2000'.zfill( 16 ) )
+        rightTopSwitch = self.addSwitch( 's5', dpid='5000'.zfill( 16 ) )
+        leftBotSwitch = self.addSwitch( 's3', dpid='3000'.zfill( 16 ) )
+        rightBotSwitch = self.addSwitch( 's6', dpid='6000'.zfill( 16 ) )
+        midBotSwitch = self.addSwitch( 's28', dpid='2800'.zfill( 16 ) )
 
         topHost = self.addHost( 'h1' )
-        leftTopHost = self.addHost('h2')
-        rightTopHost = self.addHost('h5')
-        leftBotHost = self.addHost('h3')
-        rightBotHost = self.addHost('h6')
-        midBotHost = self.addHost('h28')
-        self.addLink(topSwitch,topHost)
-        self.addLink(leftTopSwitch,leftTopHost)
-        self.addLink(rightTopSwitch,rightTopHost)
-        self.addLink(leftBotSwitch,leftBotHost)
-        self.addLink(rightBotSwitch,rightBotHost)
-        self.addLink(midBotSwitch,midBotHost)
-        self.addLink(leftTopSwitch,rightTopSwitch)
-        self.addLink(topSwitch,leftTopSwitch)
-        self.addLink(topSwitch,rightTopSwitch)
-        self.addLink(leftTopSwitch,leftBotSwitch)
-        self.addLink(rightTopSwitch,rightBotSwitch)
-        self.addLink(leftBotSwitch,midBotSwitch)
-        self.addLink(midBotSwitch,rightBotSwitch)
+        leftTopHost = self.addHost( 'h2' )
+        rightTopHost = self.addHost( 'h5' )
+        leftBotHost = self.addHost( 'h3' )
+        rightBotHost = self.addHost( 'h6' )
+        midBotHost = self.addHost( 'h28' )
+        self.addLink( topSwitch, topHost )
+        self.addLink( leftTopSwitch, leftTopHost )
+        self.addLink( rightTopSwitch, rightTopHost )
+        self.addLink( leftBotSwitch, leftBotHost )
+        self.addLink( rightBotSwitch, rightBotHost )
+        self.addLink( midBotSwitch, midBotHost )
+        self.addLink( leftTopSwitch, rightTopSwitch )
+        self.addLink( topSwitch, leftTopSwitch )
+        self.addLink( topSwitch, rightTopSwitch )
+        self.addLink( leftTopSwitch, leftBotSwitch )
+        self.addLink( rightTopSwitch, rightBotSwitch )
+        self.addLink( leftBotSwitch, midBotSwitch )
+        self.addLink( midBotSwitch, rightBotSwitch )
 
-        agg1Switch = self.addSwitch('s4',dpid = '3004'.zfill(16))
-        agg2Switch = self.addSwitch('s7',dpid = '6007'.zfill(16))
-        agg1Host = self.addHost('h4')
-        agg2Host = self.addHost('h7')
-        self.addLink(agg1Switch,agg1Host)
-        self.addLink(agg2Switch,agg2Host)
-        self.addLink(agg1Switch, leftBotSwitch)
-        self.addLink(agg2Switch, rightBotSwitch)
+        agg1Switch = self.addSwitch( 's4', dpid='3004'.zfill( 16 ) )
+        agg2Switch = self.addSwitch( 's7', dpid='6007'.zfill( 16 ) )
+        agg1Host = self.addHost( 'h4' )
+        agg2Host = self.addHost( 'h7' )
+        self.addLink( agg1Switch, agg1Host )
+        self.addLink( agg2Switch, agg2Host )
+        self.addLink( agg1Switch, leftBotSwitch )
+        self.addLink( agg2Switch, rightBotSwitch )
 
-        for i in range(10):
-            num = str(i+8)
-            switch = self.addSwitch('s'+num,dpid = ('30'+num.zfill(2)).zfill(16))
-            host = self.addHost('h'+num)
-            self.addLink(switch, host)
-            self.addLink(switch, agg1Switch)
+        for i in range( 10 ):
+            num = str( i + 8 )
+            switch = self.addSwitch( 's' + num, dpid=( '30' + num.zfill( 2 ) ).zfill( 16 ) )
+            host = self.addHost( 'h' + num )
+            self.addLink( switch, host )
+            self.addLink( switch, agg1Switch )
 
-        for i in range(10):
-            num = str(i+18)
-            switch = self.addSwitch('s'+num,dpid = ('60'+num.zfill(2)).zfill(16))
-            host = self.addHost('h'+num)
-            self.addLink(switch, host)
-            self.addLink(switch, agg2Switch)
+        for i in range( 10 ):
+            num = str( i + 18 )
+            switch = self.addSwitch( 's' + num, dpid=( '60' + num.zfill( 2 ) ).zfill( 16 ) )
+            host = self.addHost( 'h' + num )
+            self.addLink( switch, host )
+            self.addLink( switch, agg2Switch )
 
-topos = { 'obelisk': (lambda: ObeliskTopo() ) }
+topos = { 'obelisk': ( lambda: ObeliskTopo() ) }
+
 
 def run():
     topo = ObeliskTopo()
diff --git a/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.py b/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.py
index c27bd47..1ad81ad 100644
--- a/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.py
+++ b/TestON/tests/MISC/SCPFbatchFlowResp/SCPFbatchFlowResp.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 class SCPFbatchFlowResp:
 
     """
@@ -75,7 +74,6 @@
         main.testSetUp.evnSetupConclusion( stepResult )
         main.commit = main.commit.split( " " )[ 1 ]
 
-
     def CASE2( self, main ):
         """
         - Set up cell
@@ -113,7 +111,7 @@
 
         main.step( "Configure AdaptiveFlowSampling " )
         stepResult = main.Cluster.active( 0 ).CLI.setCfg( component=main.params[ 'CASE10' ][ 'cfg' ],
-                                           propName="adaptiveFlowSampling ", value=main.params[ 'CASE10' ][ 'adaptiveFlowenabled' ] )
+                                                          propName="adaptiveFlowSampling ", value=main.params[ 'CASE10' ][ 'adaptiveFlowenabled' ] )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="App Configuration Succeeded! ",
@@ -215,12 +213,12 @@
 
             main.log.info( "Creating batch: " + str( index ) )
             flowJsonBatch = main.Cluster.active( 0 ).REST.createFlowBatch( numSw=main.numSw,
-                                                           swIndex=ind,
-                                                           batchSize=main.batchSize,
-                                                           batchIndex=index,
-                                                           deviceIdpreFix=main.deviceIdPrefix,
-                                                           ingressPort=2,
-                                                           egressPort=3 )
+                                                                           swIndex=ind,
+                                                                           batchSize=main.batchSize,
+                                                                           batchIndex=index,
+                                                                           deviceIdpreFix=main.deviceIdPrefix,
+                                                                           ingressPort=2,
+                                                                           egressPort=3 )
             main.flowJsonBatchList.append( flowJsonBatch )
 
             startSw += 1
@@ -247,11 +245,11 @@
         def postWorker( id ):
             while True:
                 item = q.get()
-                #print json.dumps( item )
+                # print json.dumps( item )
                 status, response = main.Cluster.active( 0 ).REST.sendFlowBatch( batch=item )
                 if status == main.TRUE:
                     main.log.info( "Thread {} is working on posting. ".format( id ) )
-                    #print json.dumps( response )
+                    # print json.dumps( response )
                     main.addedBatchList.append( response[ 1 ] )
                 else:
                     main.log.error( "Thread {} failed to post.".format( id ) )
@@ -275,7 +273,7 @@
             main.cleanAndExit()
 
         main.step( "Check to ensure all flows are in added state." )
-        #pprint( main.addedBatchList )
+        # pprint( main.addedBatchList )
         resp = main.FALSE
         while resp != main.TRUE and ( tAllAdded - tLastPostEnd < int( main.params[ 'CASE2100' ][ 'chkFlowTO' ] ) ):
             if main.params[ 'CASE2100' ][ 'RESTchkFlow' ] == 'main.TRUE':
@@ -347,7 +345,7 @@
         main.log.info( "Number of flow batches at end of remove: " + str( len( main.addedBatchList ) ) )
 
         main.step( "Check to ensure all flows are in added state." )
-        #pprint( main.addedBatchList )
+        # pprint( main.addedBatchList )
         resp = main.FALSE
         while resp != main.TRUE and ( tAllRemoved - tLastDeleteEnd < int( main.params[ 'CASE3100' ][ 'chkFlowTO' ] ) ):
             if main.params[ 'CASE3100' ][ 'RESTchkFlow' ] == 'main.TRUE':
@@ -381,7 +379,7 @@
         main.case( "Check to ensure onos flows." )
 
         resp = main.Cluster.active( 0 ).REST.checkFlowsState()
-        #pprint( resp )
+        # pprint( resp )
 
     def CASE210( self, main ):
         main.case( "Log test results to a data file" )
@@ -427,5 +425,4 @@
                                     "ERROR",
                                     "Except" ],
                                   "s" )
-        #main.stop()
-
+        # main.stop()
diff --git a/TestON/tests/PLAT/PLATdockertest/PLATdockertest.py b/TestON/tests/PLAT/PLATdockertest/PLATdockertest.py
old mode 100755
new mode 100644
index 9cbe929..dba226c
--- a/TestON/tests/PLAT/PLATdockertest/PLATdockertest.py
+++ b/TestON/tests/PLAT/PLATdockertest/PLATdockertest.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,22 +18,22 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # This is a basic platform test suite.
 # Additional platform test cases can be added on this test suite where appropriate.
 
+
 class PLATdockertest:
+
     """
     This testsuite performs the following tests:
-    1) checkout onos docker image;
-    2) test image start up in single and clustered mode;
-    3) test onos app activation and deactivation;
+    1 ) checkout onos docker image;
+    2 ) test image start up in single and clustered mode;
+    3 ) test onos app activation and deactivation;
 
     Prerequisites:
-    1) docker-engine installed on test station (localhost);
-    2) python docker client (docker-py) installed on test station
+    1 ) docker-engine installed on test station ( localhost );
+    2 ) python docker client ( docker-py ) installed on test station
     """
-
     def __init__( self ):
         self.default = ''
         global DOCKERREPO, DOCKERTAG, INITDOCKERTAG
@@ -60,73 +60,74 @@
         main.step( "Check for duplicate Tags for a given image" )
         if not duplicateTagDetected:
             stepResult = main.TRUE
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "no duplicate image tags",
-                                    onfail = "duplicate image tags detected!!" )
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="no duplicate image tags",
+                                    onfail="duplicate image tags detected!!" )
         main.step( "Get a list of image tags" )
         stepResult = main.FALSE
         if imageTagList is not []:
-            main.log.info( "The Image tag list is: " + str(imageTagList) )
+            main.log.info( "The Image tag list is: " + str( imageTagList ) )
             stepResult = main.TRUE
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "image tag list pulled successfully",
-                                    onfail = "image tag list not pulled" )
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="image tag list pulled successfully",
+                                    onfail="image tag list not pulled" )
 
     def CASE1( self, main ):
         """
-        1) set up test params;
+        1 ) set up test params;
         """
         import re
         import time
         import subprocess
 
         if imageTagCounter < len( imageTagList ):
-            DOCKERTAG = imageTagList[imageTagCounter]
+            DOCKERTAG = imageTagList[ imageTagCounter ]
         if not imageTagCounter:
             INITDOCKERTAG = DOCKERTAG
         imageTagCounter += 1
 
-        main.case("Set case test params for onos image {}".format( DOCKERTAG ))
-        main.step("Initialize test params")
-        NODElist = main.params["SCALE"]["nodelist"].split(',')
-        main.log.info("onos container names are: " + ",".join(NODElist) )
+        main.case( "Set case test params for onos image {}".format( DOCKERTAG ) )
+        main.step( "Initialize test params" )
+        NODElist = main.params[ "SCALE" ][ "nodelist" ].split( ',' )
+        main.log.info( "onos container names are: " + ",".join( NODElist ) )
         IPlist = list()
         main.testOnDirectory = re.sub( "(/tests)$", "", main.testDir )
         CTIDlist = list()
 
-        main.log.info("Check docker status, it not running, try restart it")
+        main.log.info( "Check docker status, it not running, try restart it" )
         iter = 0
         stepResult = main.TRUE
-        while subprocess.call("sudo service docker status", shell=True) and iter <= 3:
-            subprocess.call("sudo service docker restart", shell=True)
-            time.sleep(5)
+        while subprocess.call( "sudo service docker status", shell=True ) and iter <= 3:
+            subprocess.call( "sudo service docker restart", shell=True )
+            time.sleep( 5 )
             iter += 1
-            if iter == 3: stepResult = main.FALSE
+            if iter == 3:
+                stepResult = main.FALSE
 
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "docker is running",
-                                    onfail = "docker is not running")
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="docker is running",
+                                    onfail="docker is not running" )
         if stepResult == main.FALSE:
-            main.log.warn("docker is not running - exiting test")
+            main.log.warn( "docker is not running - exiting test" )
             main.cleanAndExit()
         if imageTagCounter > len( imageTagList ):
-            main.log.info("All images have been tested")
+            main.log.info( "All images have been tested" )
             main.cleanAndExit()
 
-    def CASE5(self, main):
+    def CASE5( self, main ):
         """
         Pull the specified image
         """
-
         main.case( "Pull onos docker image {} from {} - \
                     it may take sometime if this is a first time pulling.".format( DOCKERTAG, DOCKERREPO ) )
         stepResult = main.FALSE
         main.step( "pull image {} from {}".format( DOCKERTAG, DOCKERREPO ) )
-        stepResult = main.ONOSbenchDocker.dockerPull( onosRepo = DOCKERREPO, onosTag = DOCKERTAG )
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "Succeeded in pulling " + DOCKERREPO + ":" + DOCKERTAG,
-                                    onfail = "Failed to pull " + DOCKERREPO + ":" + DOCKERTAG )
-        if stepResult == main.FALSE: main.skipCase()
+        stepResult = main.ONOSbenchDocker.dockerPull( onosRepo=DOCKERREPO, onosTag=DOCKERTAG )
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="Succeeded in pulling " + DOCKERREPO + ":" + DOCKERTAG,
+                                    onfail="Failed to pull " + DOCKERREPO + ":" + DOCKERTAG )
+        if stepResult == main.FALSE:
+            main.skipCase()
 
     def CASE10( self, main ):
         """
@@ -135,46 +136,47 @@
         import re
         createResult = main.TRUE
         startResult = main.TRUE
-        main.case( "Start onos container(s) for onos image {}".format( DOCKERTAG ))
+        main.case( "Start onos container(s) for onos image {}".format( DOCKERTAG ) )
         image = DOCKERREPO + ":" + DOCKERTAG
 
-        main.step( "Create and (re)start docker container(s) for onos image {} if not already exist".format( DOCKERTAG ))
-        #stepResult = main.FALSE
+        main.step( "Create and (re)start docker container(s) for onos image {} if not already exist".format( DOCKERTAG ) )
+        # stepResult = main.FALSE
 
-        for ct in xrange(0, len(NODElist)):
-            if not main.ONOSbenchDocker.dockerCheckCTName( ctName = NODElist[ct] ):
-                main.log.info( "Create new container for onos" + str(ct + 1) )
-                createResult, ctid = main.ONOSbenchDocker.dockerCreateCT( onosImage = image, onosNode = NODElist[ct])
-                CTIDlist.append(ctid)
-                startResult = main.ONOSbenchDocker.dockerStartCT( ctID = ctid )
+        for ct in xrange( 0, len( NODElist ) ):
+            if not main.ONOSbenchDocker.dockerCheckCTName( ctName=NODElist[ ct ] ):
+                main.log.info( "Create new container for onos" + str( ct + 1 ) )
+                createResult, ctid = main.ONOSbenchDocker.dockerCreateCT( onosImage=image, onosNode=NODElist[ ct ] )
+                CTIDlist.append( ctid )
+                startResult = main.ONOSbenchDocker.dockerStartCT( ctID=ctid )
             else:
-                main.log.info("Container exists for node onos" + str(ct + 1) + "; restart container with {} image".format( DOCKERTAG ) )
-                startResult = main.ONOSbenchDocker.dockerRestartCT( ctName = NODElist[ct ] )
+                main.log.info( "Container exists for node onos" + str( ct + 1 ) + "; restart container with {} image".format( DOCKERTAG ) )
+                startResult = main.ONOSbenchDocker.dockerRestartCT( ctName=NODElist[ ct ] )
 
-        utilities.assert_equals( expect = main.TRUE, actual = createResult and startResult,
-                                    onpass = "Container successfully created",
-                                    onfail = "Failed to create the container" )
+        utilities.assert_equals( expect=main.TRUE, actual=createResult and startResult,
+                                    onpass="Container successfully created",
+                                    onfail="Failed to create the container" )
 
         main.step( "Get IP address on onos containers" )
         stepResult = main.FALSE
 
-        for ct in xrange(0,len(NODElist)):
-            IPlist.append(main.ONOSbenchDocker.dockerIP( ctName = NODElist[ct] ))
-        main.log.info("Container IPs are: " +  ', '.join( IPlist ))
+        for ct in xrange( 0, len( NODElist ) ):
+            IPlist.append( main.ONOSbenchDocker.dockerIP( ctName=NODElist[ ct ] ) )
+        main.log.info( "Container IPs are: " + ', '.join( IPlist ) )
 
-        if IPlist is not []:stepResult = main.TRUE
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "Container successfully started",
-                                    onfail = "Failed to start the container" )
+        if IPlist is not []:
+            stepResult = main.TRUE
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="Container successfully started",
+                                    onfail="Failed to start the container" )
 
-    def CASE110(self,main):
+    def CASE110( self, main ):
         """
         Steps:
-        1) check default startup standalone onos applications status;
-        2) form onos cluster with all nodes;
-        3) check onos applications status;
-        4) activate apps per params and check app status;
-        5) deactivate apps and check app status
+        1 ) check default startup standalone onos applications status;
+        2 ) form onos cluster with all nodes;
+        3 ) check onos applications status;
+        4 ) activate apps per params and check app status;
+        5 ) deactivate apps and check app status
 
         """
         import time
@@ -182,112 +184,118 @@
 
         main.case( "Form onos cluster and check status of onos apps for onos image {}".format( DOCKERTAG ) )
 
-        startupSleep = int(main.params["SLEEP"]["startup"])
+        startupSleep = int( main.params[ "SLEEP" ][ "startup" ] )
 
-        appToAct = main.params["CASE110"]["apps"]
+        appToAct = main.params[ "CASE110" ][ "apps" ]
         stepResult = main.FALSE
 
-        main.log.info( "Wait for startup, sleep (sec): " + str(startupSleep))
-        time.sleep(startupSleep)
+        main.log.info( "Wait for startup, sleep (sec): " + str( startupSleep ) )
+        time.sleep( startupSleep )
 
-        main.step( "Check initial app states from onos1 for onos image {}".format( DOCKERTAG ))
+        main.step( "Check initial app states from onos1 for onos image {}".format( DOCKERTAG ) )
         stepResult = main.TRUE
-        response = main.ONOSbenchRest.apps( ip=IPlist[0], port = 8181 )
-        main.log.debug("Rest call response is: " + response)
+        response = main.ONOSbenchRest.apps( ip=IPlist[ 0 ], port=8181 )
+        main.log.debug( "Rest call response is: " + response )
         if response is not main.FALSE:
-            for item in json.loads(response):
-                if item["state"] not in ["ACTIVE", "INSTALLED"]:
-                    main.log.info("Some bundles are not in correct state. ")
-                    main.log.info("App states are: " + response)
+            for item in json.loads( response ):
+                if item[ "state" ] not in [ "ACTIVE", "INSTALLED" ]:
+                    main.log.info( "Some bundles are not in correct state. " )
+                    main.log.info( "App states are: " + response )
                     stepResult = main.FALSE
-                    break;
-                if (item["description"] == "Builtin device drivers") and (item["state"] !=  "ACTIVE"):
-                    main.log.info("Driver app is not in 'ACTIVE' state, but in: " + item["state"])
+                    break
+                if ( item[ "description" ] == "Builtin device drivers" ) and ( item[ "state" ] != "ACTIVE" ):
+                    main.log.info( "Driver app is not in 'ACTIVE' state, but in: " + item[ "state" ] )
                     stepResult = main.FALSE
-                    break;
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "ONOS successfully started",
-                                    onfail = "Failed to start ONOS correctly" )
-        if stepResult is main.FALSE: main.skipCase()
+                    break
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="ONOS successfully started",
+                                    onfail="Failed to start ONOS correctly" )
+        if stepResult is main.FALSE:
+            main.skipCase()
 
-        main.step( "Form onos cluster using 'dependencies/onos-form-cluster' util")
+        main.step( "Form onos cluster using 'dependencies/onos-form-cluster' util" )
         stepResult = main.FALSE
-        clcmdpath = main.params["CASE110"]["clustercmdpath"]
-        main.log.info("onos-form-cluster cmd path is: " + clcmdpath)
-        dkruser = main.params["DOCKER"]["user"]
-        dkrpasswd = main.params["DOCKER"]["password"]
-        main.ONOSbenchDocker.onosFormCluster(cmdPath = clcmdpath, onosIPs=IPlist, user=dkruser, passwd = dkrpasswd)
-        main.log.info("Wait for cluster to form with sleep time of " + str(startupSleep))
-        time.sleep(startupSleep)
-        status, response = main.ONOSbenchRest.send(ip=IPlist[0], port=8181, url="/cluster")
-        main.log.debug("Rest call response: " + str(status) + " - " + response)
+        clcmdpath = main.params[ "CASE110" ][ "clustercmdpath" ]
+        main.log.info( "onos-form-cluster cmd path is: " + clcmdpath )
+        dkruser = main.params[ "DOCKER" ][ "user" ]
+        dkrpasswd = main.params[ "DOCKER" ][ "password" ]
+        main.ONOSbenchDocker.onosFormCluster( cmdPath=clcmdpath, onosIPs=IPlist, user=dkruser, passwd=dkrpasswd )
+        main.log.info( "Wait for cluster to form with sleep time of " + str( startupSleep ) )
+        time.sleep( startupSleep )
+        status, response = main.ONOSbenchRest.send( ip=IPlist[ 0 ], port=8181, url="/cluster" )
+        main.log.debug( "Rest call response: " + str( status ) + " - " + response )
         if status == 200:
-            jrsp = json.loads(response)
+            jrsp = json.loads( response )
             if DOCKERTAG == "1.2" or DOCKERTAG == "1.3" or DOCKERTAG == "1.4" or DOCKERTAG == "1.5":
-                clusterIP = [item["ip"]for item in jrsp["nodes"] if item["status"]== "ACTIVE"]
+                clusterIP = [ item[ "ip" ]for item in jrsp[ "nodes" ] if item[ "status" ] == "ACTIVE" ]
             else:
-                clusterIP = [item["ip"]for item in jrsp["nodes"] if item["status"]== "READY"]
-            main.log.debug(" IPlist is:" + ",".join(IPlist))
-            main.log.debug(" cluster IP is" + ",".join(clusterIP))
-            if set(IPlist) == set(clusterIP): stepResult = main.TRUE
+                clusterIP = [ item[ "ip" ]for item in jrsp[ "nodes" ] if item[ "status" ] == "READY" ]
+            main.log.debug( " IPlist is:" + ",".join( IPlist ) )
+            main.log.debug( " cluster IP is" + ",".join( clusterIP ) )
+            if set( IPlist ) == set( clusterIP ):
+                stepResult = main.TRUE
 
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "ONOS successfully started",
-                                    onfail = "Failed to start ONOS correctly" )
-        if stepResult is main.FALSE: main.skipCase()
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="ONOS successfully started",
+                                    onfail="Failed to start ONOS correctly" )
+        if stepResult is main.FALSE:
+            main.skipCase()
 
-        main.step( "Check cluster app status")
+        main.step( "Check cluster app status" )
         stepResult = main.TRUE
-        response = main.ONOSbenchRest.apps( ip=IPlist[0], port = 8181 )
+        response = main.ONOSbenchRest.apps( ip=IPlist[ 0 ], port=8181 )
         if response is not main.FALSE:
-            for item in json.loads(response):
-                if item["state"] not in ["ACTIVE", "INSTALLED"]:
-                    main.log.info("Some bundles are not in correct state. ")
-                    main.log.info("App states are: " + response)
+            for item in json.loads( response ):
+                if item[ "state" ] not in [ "ACTIVE", "INSTALLED" ]:
+                    main.log.info( "Some bundles are not in correct state. " )
+                    main.log.info( "App states are: " + response )
                     stepResult = main.FALSE
                     break
-                if (item["description"] == "Builtin device drivers") and (item["state"] != "ACTIVE"):
-                    main.log.info("Driver app is not in 'ACTIVE' state, but in: " + item["state"])
+                if ( item[ "description" ] == "Builtin device drivers" ) and ( item[ "state" ] != "ACTIVE" ):
+                    main.log.info( "Driver app is not in 'ACTIVE' state, but in: " + item[ "state" ] )
                     stepResult = main.FALSE
                     break
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "ONOS successfully started",
-                                    onfail = "Failed to start ONOS correctly" )
-        if stepResult is main.FALSE: main.skipCase()
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="ONOS successfully started",
+                                    onfail="Failed to start ONOS correctly" )
+        if stepResult is main.FALSE:
+            main.skipCase()
 
-        main.step(" Activate an APP from REST and check APP status")
+        main.step( " Activate an APP from REST and check APP status" )
         appResults = list()
         stepResult = main.TRUE
-        applist = main.params["CASE110"]["apps"].split(",")
-        main.log.info("List of apps to activate: " + str(applist) )
+        applist = main.params[ "CASE110" ][ "apps" ].split( "," )
+        main.log.info( "List of apps to activate: " + str( applist ) )
         for app in applist:
-            appRslt = main.ONOSbenchRest.activateApp(appName=app, ip=IPlist[0], port=8181, check=True)
-            time.sleep(5)
-            appResults.append(appRslt)
+            appRslt = main.ONOSbenchRest.activateApp( appName=app, ip=IPlist[ 0 ], port=8181, check=True )
+            time.sleep( 5 )
+            appResults.append( appRslt )
             stepResult = stepResult and appRslt
-        main.log.debug("Apps activation result for " + ",".join(applist) + ": " + str(appResults) )
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "Successfully activated apps",
-                                    onfail = "Failed to activated apps correctly" )
-        if stepResult is main.FALSE: main.skipCase()
+        main.log.debug( "Apps activation result for " + ",".join( applist ) + ": " + str( appResults ) )
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="Successfully activated apps",
+                                    onfail="Failed to activated apps correctly" )
+        if stepResult is main.FALSE:
+            main.skipCase()
 
-        main.step(" Deactivate an APP from REST and check APP status")
+        main.step( " Deactivate an APP from REST and check APP status" )
         appResults = list()
         stepResult = main.TRUE
-        applist = main.params["CASE110"]["apps"].split(",")
-        main.log.info("Apps to deactivate: " + str(applist) )
+        applist = main.params[ "CASE110" ][ "apps" ].split( "," )
+        main.log.info( "Apps to deactivate: " + str( applist ) )
         for app in applist:
-            time.sleep(5)
-            appRslt = main.ONOSbenchRest.deactivateApp(appName=app, ip=IPlist[0], port=8181, check=True)
-            appResults.append(appRslt)
+            time.sleep( 5 )
+            appRslt = main.ONOSbenchRest.deactivateApp( appName=app, ip=IPlist[ 0 ], port=8181, check=True )
+            appResults.append( appRslt )
             stepResult = stepResult and appRslt
-        main.log.debug("Apps deactivation result for " + ",".join(applist) + ": " + str(appResults) )
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "Successfully deactivated apps",
-                                    onfail = "Failed to deactivated apps correctly" )
-        if stepResult is main.FALSE: main.skipCase()
+        main.log.debug( "Apps deactivation result for " + ",".join( applist ) + ": " + str( appResults ) )
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="Successfully deactivated apps",
+                                    onfail="Failed to deactivated apps correctly" )
+        if stepResult is main.FALSE:
+            main.skipCase()
 
-    def CASE900(self,main):
+    def CASE900( self, main ):
         """
         Check onos logs for exceptions after tests
         """
@@ -297,78 +305,75 @@
 
         logResult = main.TRUE
 
-        user = main.params["DOCKER"]["user"]
-        pwd = main.params["DOCKER"]["password"]
+        user = main.params[ "DOCKER" ][ "user" ]
+        pwd = main.params[ "DOCKER" ][ "password" ]
 
-        main.case("onos Exceptions check with onos image {}".format( DOCKERTAG ))
-        main.step("check onos for any exceptions")
+        main.case( "onos Exceptions check with onos image {}".format( DOCKERTAG ) )
+        main.step( "check onos for any exceptions" )
 
         for ip in IPlist:
             spawncmd = "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 8101 " + user + "@" + ip
-            main.log.info("log on node using cmd: " + spawncmd)
+            main.log.info( "log on node using cmd: " + spawncmd )
             try:
-                handle = pexpect.spawn(spawncmd)
-                #handle.expect("yes/no")
-                #handle.sendline("yes")
-                #print("yes is sent")
-                #this extra statement is sent to get around some
-                #pexpect issue of not seeing the next expected string
-                handle.expect("Password:")
-                handle.sendline(pwd)
-                time.sleep(5)
-                handle.expect("onos>")
-                handle.sendline("log:exception-display")
-                handle.expect("onos>")
+                handle = pexpect.spawn( spawncmd )
+                # handle.expect( "yes/no" )
+                # handle.sendline( "yes" )
+                # print( "yes is sent" )
+                # this extra statement is sent to get around some
+                # pexpect issue of not seeing the next expected string
+                handle.expect( "Password:" )
+                handle.sendline( pwd )
+                time.sleep( 5 )
+                handle.expect( "onos>" )
+                handle.sendline( "log:exception-display" )
+                handle.expect( "onos>" )
                 result = handle.before
-                if re.search("Exception", result):
-                    main.log.info("onos: " + ip + " Exceptions:" + result)
+                if re.search( "Exception", result ):
+                    main.log.info( "onos: " + ip + " Exceptions:" + result )
                     logResult = logResult and main.FALSE
                 else:
-                    main.log.info("onos: " + ip + " Exceptions: None")
+                    main.log.info( "onos: " + ip + " Exceptions: None" )
                     logResult = logResult and main.TRUE
             except Exception:
-                main.log.exception("Uncaught exception when getting log from onos:" + ip)
+                main.log.exception( "Uncaught exception when getting log from onos:" + ip )
                 logResult = logResult and main.FALSE
 
-        utilities.assert_equals( expect = main.TRUE, actual = logResult,
-                                    onpass = "onos exception check passed",
-                                    onfail = "onos exeption check failed" )
+        utilities.assert_equals( expect=main.TRUE, actual=logResult,
+                                    onpass="onos exception check passed",
+                                    onfail="onos exeption check failed" )
 
     def CASE1000( self, main ):
-
         """
         Cleanup after tests - stop and delete the containers created; delete the image
         """
         import time
 
-        main.case("Clean up  images (ex. none:none tagged) and containers")
-        main.step("Stop onos containers")
+        main.case( "Clean up  images (ex. none:none tagged) and containers" )
+        main.step( "Stop onos containers" )
         stepResult = main.TRUE
         for ctname in NODElist:
             if main.ONOSbenchDocker.dockerCheckCTName( ctName="/" + ctname ):
                 main.log.info( "stopping docker container: /" + ctname )
                 stopResult = main.ONOSbenchDocker.dockerStopCT( ctName="/" + ctname )
-                time.sleep(10)
+                time.sleep( 10 )
                 rmResult = main.ONOSbenchDocker.dockerRemoveCT( ctName="/" + ctname )
                 stepResult = stepResult and stopResult and rmResult
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "Container successfully stopped",
-                                    onfail = "Failed to stopped the container" )
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="Container successfully stopped",
+                                    onfail="Failed to stopped the container" )
 
-        #main.step( "remove exiting onosproject/onos images")
-        #stepResult = main.ONOSbenchDocker.dockerRemoveImage( image = DOCKERREPO + ":" + DOCKERTAG )
-        main.step( "remove dangling 'none:none' images")
+        # main.step( "remove exiting onosproject/onos images" )
+        # stepResult = main.ONOSbenchDocker.dockerRemoveImage( image=DOCKERREPO + ":" + DOCKERTAG )
+        main.step( "remove dangling 'none:none' images" )
         stepResult = main.ONOSbenchDocker.dockerRemoveImage()
-        utilities.assert_equals( expect = main.TRUE, actual = stepResult,
-                                    onpass = "Succeeded in cleaning up images",
-                                    onfail = "Failed in cleaning up images" )
+        utilities.assert_equals( expect=main.TRUE, actual=stepResult,
+                                    onpass="Succeeded in cleaning up images",
+                                    onfail="Failed in cleaning up images" )
 
     def CASE1001( self, main ):
-
         """
         Create a file for publishing results on wiki in tabular form
         """
-
         main.case( "Create a file for publishing on wiki in tabular form" )
         import re
         imageTagCounter = 0
@@ -379,26 +384,26 @@
         totalNumOfTestCases = 6
         try:
             main.tableFileName = main.logdir + "/" + main.TEST + "TableWiki.txt"
-            main.wikiTableFile = open(main.tableFileName, "a+")
-            main.wikiFileHandle = open(main.WikiFileName, "r")
+            main.wikiTableFile = open( main.tableFileName, "a+" )
+            main.wikiFileHandle = open( main.WikiFileName, "r" )
             for imageTag in imageTagList:
                 resultDictionary[ imageTag ] = []
             for line in main.wikiFileHandle:
-                matchObj = re.search("(?!.*Case 0).*<h3>(.+?)<\/h3>", line)
+                matchObj = re.search( "(?!.*Case 0).*<h3>(.+?)<\/h3>", line )
                 if testCaseCounter < totalNumOfTestCases:
                     if matchObj:
-                        wordsToRemove = re.compile("latest|- PASS|- FAIL|- No Result")
-                        testCaseName = wordsToRemove.sub("", matchObj.group(1))
-                        testCaseName = testCaseName.replace( INITDOCKERTAG,'' )
-                        testCaseList.append(testCaseName)
+                        wordsToRemove = re.compile( "latest|- PASS|- FAIL|- No Result" )
+                        testCaseName = wordsToRemove.sub( "", matchObj.group( 1 ) )
+                        testCaseName = testCaseName.replace( INITDOCKERTAG, '' )
+                        testCaseList.append( testCaseName )
                         testCaseCounter += 1
                 if matchObj:
                     if "- PASS" in line:
-                        resultDictionary[ imageTagList[ imageTagCounter ] ].append("PASS")
+                        resultDictionary[ imageTagList[ imageTagCounter ] ].append( "PASS" )
                     if "- FAIL" in line:
-                        resultDictionary[ imageTagList[ imageTagCounter ] ].append("FAIL")
+                        resultDictionary[ imageTagList[ imageTagCounter ] ].append( "FAIL" )
                     if "- No Result" in line:
-                        resultDictionary[ imageTagList[ imageTagCounter ] ].append("No Result")
+                        resultDictionary[ imageTagList[ imageTagCounter ] ].append( "No Result" )
                     resultCounter += 1
                 if resultCounter == totalNumOfTestCases:
                     imageTagCounter += 1
@@ -428,6 +433,6 @@
         except Exception:
             main.log.exception( "Exception while writing to the table file" )
             logResult = main.FALSE
-        utilities.assert_equals( expect = main.TRUE, actual = logResult,
-                                    onpass = "onos exception check passed",
-                                    onfail = "onos exception check failed" )
+        utilities.assert_equals( expect=main.TRUE, actual=logResult,
+                                    onpass="onos exception check passed",
+                                    onfail="onos exception check failed" )
diff --git a/TestON/tests/SAMP/SAMPstartTemplate_1node/Dependency/newFuncTopo.py b/TestON/tests/SAMP/SAMPstartTemplate_1node/Dependency/newFuncTopo.py
old mode 100755
new mode 100644
index d2aefda..e3e10ab
--- a/TestON/tests/SAMP/SAMPstartTemplate_1node/Dependency/newFuncTopo.py
+++ b/TestON/tests/SAMP/SAMPstartTemplate_1node/Dependency/newFuncTopo.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Custom topology for Mininet
 """
@@ -35,19 +34,23 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class VLANHost( Host ):
+
     def config( self, vlan=100, **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ifconfig %s inet 0' % intf )
         self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
-        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params[ 'ip' ] ) )
         newName = '%s.%d' % ( intf, vlan )
         intf.name = newName
         self.nameToIntf[ newName ] = intf
         return r
 
+
 class IPv6Host( Host ):
+
     def config( self, v6Addr='1000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
@@ -55,13 +58,16 @@
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='2000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class MyTopo( Topo ):
 
     def __init__( self ):
@@ -69,43 +75,43 @@
         Topo.__init__( self )
 
         # Switch S5 Hosts
-        host1=self.addHost( 'h1', ip='10.1.0.2/24' )
-        host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
-        host3=self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
-        #VLAN hosts
-        host4=self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
-        host5=self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host6=self.addHost( 'h6', ip='11.1.0.2/24' )
-        host7=self.addHost( 'h7', ip='12.1.0.2/24' )
-        #Multicast Sender
-        host8=self.addHost( 'h8', ip='10.1.0.4/24' )
+        host1 = self.addHost( 'h1', ip='10.1.0.2/24' )
+        host2 = self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+        host3 = self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
+        # VLAN hosts
+        host4 = self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
+        host5 = self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host6 = self.addHost( 'h6', ip='11.1.0.2/24' )
+        host7 = self.addHost( 'h7', ip='12.1.0.2/24' )
+        # Multicast Sender
+        host8 = self.addHost( 'h8', ip='10.1.0.4/24' )
 
         # Switch S6 Hosts
-        host9=self.addHost( 'h9', ip='10.1.0.5/24' )
-        host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
-        host11=self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
-        #VLAN hosts
-        host12=self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
-        host13=self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host14=self.addHost( 'h14', ip='11.1.0.3/24' )
-        host15=self.addHost( 'h15', ip='12.1.0.3/24' )
-        #Multicast Receiver
-        host16=self.addHost( 'h16', ip='10.1.0.7/24' )
+        host9 = self.addHost( 'h9', ip='10.1.0.5/24' )
+        host10 = self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+        host11 = self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
+        # VLAN hosts
+        host12 = self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
+        host13 = self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host14 = self.addHost( 'h14', ip='11.1.0.3/24' )
+        host15 = self.addHost( 'h15', ip='12.1.0.3/24' )
+        # Multicast Receiver
+        host16 = self.addHost( 'h16', ip='10.1.0.7/24' )
 
         # Switch S7 Hosts
-        host17=self.addHost( 'h17', ip='10.1.0.8/24' )
-        host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
-        host19=self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
-        #VLAN hosts
-        host20=self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
-        host21=self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host22=self.addHost( 'h22', ip='11.1.0.4/24' )
-        host23=self.addHost( 'h23', ip='12.1.0.4/24' )
-        #Multicast Receiver
-        host24=self.addHost( 'h24', ip='10.1.0.10/24' )
+        host17 = self.addHost( 'h17', ip='10.1.0.8/24' )
+        host18 = self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+        host19 = self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
+        # VLAN hosts
+        host20 = self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
+        host21 = self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host22 = self.addHost( 'h22', ip='11.1.0.4/24' )
+        host23 = self.addHost( 'h23', ip='12.1.0.4/24' )
+        # Multicast Receiver
+        host24 = self.addHost( 'h24', ip='10.1.0.10/24' )
 
         s1 = self.addSwitch( 's1' )
         s2 = self.addSwitch( 's2' )
@@ -115,59 +121,60 @@
         s6 = self.addSwitch( 's6' )
         s7 = self.addSwitch( 's7' )
 
-        self.addLink(s5,host1)
-        self.addLink(s5,host2)
-        self.addLink(s5,host3)
-        self.addLink(s5,host4)
-        self.addLink(s5,host5)
-        self.addLink(s5,host6)
-        self.addLink(s5,host7)
-        self.addLink(s5,host8)
+        self.addLink( s5, host1 )
+        self.addLink( s5, host2 )
+        self.addLink( s5, host3 )
+        self.addLink( s5, host4 )
+        self.addLink( s5, host5 )
+        self.addLink( s5, host6 )
+        self.addLink( s5, host7 )
+        self.addLink( s5, host8 )
 
-        self.addLink(s6,host9)
-        self.addLink(s6,host10)
-        self.addLink(s6,host11)
-        self.addLink(s6,host12)
-        self.addLink(s6,host13)
-        self.addLink(s6,host14)
-        self.addLink(s6,host15)
-        self.addLink(s6,host16)
+        self.addLink( s6, host9 )
+        self.addLink( s6, host10 )
+        self.addLink( s6, host11 )
+        self.addLink( s6, host12 )
+        self.addLink( s6, host13 )
+        self.addLink( s6, host14 )
+        self.addLink( s6, host15 )
+        self.addLink( s6, host16 )
 
-        self.addLink(s7,host17)
-        self.addLink(s7,host18)
-        self.addLink(s7,host19)
-        self.addLink(s7,host20)
-        self.addLink(s7,host21)
-        self.addLink(s7,host22)
-        self.addLink(s7,host23)
-        self.addLink(s7,host24)
+        self.addLink( s7, host17 )
+        self.addLink( s7, host18 )
+        self.addLink( s7, host19 )
+        self.addLink( s7, host20 )
+        self.addLink( s7, host21 )
+        self.addLink( s7, host22 )
+        self.addLink( s7, host23 )
+        self.addLink( s7, host24 )
 
-        self.addLink(s1,s2)
-        self.addLink(s1,s3)
-        self.addLink(s1,s4)
-        self.addLink(s1,s5)
+        self.addLink( s1, s2 )
+        self.addLink( s1, s3 )
+        self.addLink( s1, s4 )
+        self.addLink( s1, s5 )
 
-        self.addLink(s2,s3)
-        self.addLink(s2,s5)
-        self.addLink(s2,s6)
+        self.addLink( s2, s3 )
+        self.addLink( s2, s5 )
+        self.addLink( s2, s6 )
 
-        self.addLink(s3,s4)
-        self.addLink(s3,s6)
+        self.addLink( s3, s4 )
+        self.addLink( s3, s6 )
 
-        self.addLink(s4,s7)
+        self.addLink( s4, s7 )
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/SAMP/SAMPstartTemplate_1node/SAMPstartTemplate_1node.py b/TestON/tests/SAMP/SAMPstartTemplate_1node/SAMPstartTemplate_1node.py
index 7da7e54..37020b3 100644
--- a/TestON/tests/SAMP/SAMPstartTemplate_1node/SAMPstartTemplate_1node.py
+++ b/TestON/tests/SAMP/SAMPstartTemplate_1node/SAMPstartTemplate_1node.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,23 +18,22 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # This is a sample template that starts up ONOS cluster, this template
 # can be use as a base script for ONOS System Testing.
 
+
 class SAMPstartTemplate_1node:
 
     def __init__( self ):
         self.default = ''
 
-
-    def CASE0(self, main):
-        '''
+    def CASE0( self, main ):
+        """
             Pull specific ONOS branch, then Build ONOS on ONOS Bench.
             This step is usually skipped. Because in a Jenkins driven automated
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
         except ImportError:
@@ -47,11 +46,11 @@
         main.testSetUp.gitPulling()
 
     def CASE1( self, main ):
-        '''
+        """
             Set up global test variables;
             Uninstall all running cells in test env defined in .topo file
 
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
         except ImportError:
@@ -65,22 +64,20 @@
         main.testSetUp.envSetupDescription()
         stepResult = main.FALSE
         try:
-            main.onosStartupSleep = float( main.params['CASE1']['SleepTimers']['onosStartup'] )
-            main.onosCfgSleep = float( main.params['CASE1']['SleepTimers']['onosCfg'] )
-            main.mnStartupSleep = float( main.params['CASE1']['SleepTimers']['mnStartup'] )
-            main.mnCfgSleep = float( main.params['CASE1']['SleepTimers']['mnCfg'] )
+            main.onosStartupSleep = float( main.params[ 'CASE1' ][ 'SleepTimers' ][ 'onosStartup' ] )
+            main.onosCfgSleep = float( main.params[ 'CASE1' ][ 'SleepTimers' ][ 'onosCfg' ] )
+            main.mnStartupSleep = float( main.params[ 'CASE1' ][ 'SleepTimers' ][ 'mnStartup' ] )
+            main.mnCfgSleep = float( main.params[ 'CASE1' ][ 'SleepTimers' ][ 'mnCfg' ] )
             stepResult = main.testSetUp.envSetup( includeGitPull=False )
         except Exception as e:
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
 
-
-
     def CASE2( self, main ):
-        '''
+        """
             Report errors/warnings/exceptions
-        '''
-        main.log.info("Error report: \n" )
+        """
+        main.log.info( "Error report: \n" )
         main.ONOSbench.logReport( main.Cluster.active( 0 ).ipAddress,
                                   [ "INFO",
                                     "FOLLOWER",
@@ -92,12 +89,11 @@
 
     def CASE10( self, main ):
         """
-        Start ONOS cluster (1 node in this example) in three steps:
-        1) start a basic cluster with drivers app via ONOSDriver;
-        2) activate apps via ONOSCliDriver;
-        3) configure onos via ONOSCliDriver;
+        Start ONOS cluster ( 1 node in this example ) in three steps:
+        1 ) start a basic cluster with drivers app via ONOSDriver;
+        2 ) activate apps via ONOSCliDriver;
+        3 ) configure onos via ONOSCliDriver;
         """
-
         import time
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
@@ -108,8 +104,8 @@
             main.testSetUp
         except ( NameError, AttributeError ):
             main.testSetUp = ONOSSetup()
-        main.case( "Start up " + str( main.Cluster.numCtrls ) + "-node onos cluster.")
-        main.step( "Start ONOS cluster with basic (drivers) app.")
+        main.case( "Start up " + str( main.Cluster.numCtrls ) + "-node onos cluster." )
+        main.step( "Start ONOS cluster with basic (drivers) app." )
         stepResult = main.ONOSbench.startBasicONOS( nodeList=main.Cluster.getIps(),
                                                     opSleep=200,
                                                     onosUser=main.ONOScell.karafUser )
@@ -120,12 +116,12 @@
 
         main.testSetUp.startOnosClis( main.Cluster )
 
-        main.step( "Activate onos apps.")
-        main.apps = main.params['CASE10'].get( 'Apps' )
+        main.step( "Activate onos apps." )
+        main.apps = main.params[ 'CASE10' ].get( 'Apps' )
         if main.apps:
             main.log.info( "Apps to activate: " + main.apps )
             activateResult = main.TRUE
-            for a in main.apps.split(","):
+            for a in main.apps.split( "," ):
                 activateResult = activateResult & main.Cluster.active( 0 ).CLI.activateApp( a )
             # TODO: check this worked
             time.sleep( main.onosCfgSleep )  # wait for apps to activate
@@ -137,13 +133,13 @@
                                  onfail="Failed to set config" )
 
         main.step( "Set ONOS configurations" )
-        config = main.params['CASE10'].get( 'ONOS_Configuration' )
+        config = main.params[ 'CASE10' ].get( 'ONOS_Configuration' )
         if config:
             main.log.debug( config )
             checkResult = main.TRUE
             for component in config:
-                for setting in config[component]:
-                    value = config[component][setting]
+                for setting in config[ component ]:
+                    value = config[ component ][ setting ]
                     check = main.Cluster.active( 0 ).CLI.setCfg( component, setting, value )
                     main.log.info( "Value was changed? {}".format( main.TRUE == check ) )
                     checkResult = check and checkResult
@@ -160,7 +156,7 @@
         """
         import time
 
-        topology = main.params['CASE11']['topo']
+        topology = main.params[ 'CASE11' ][ 'topo' ]
         main.log.report( "Start Mininet topology" )
         main.case( "Start Mininet topology" )
 
@@ -175,36 +171,33 @@
         if not topoResult:
             main.cleanAndExit()
 
-        main.step( "Assign switches to controllers.")
+        main.step( "Assign switches to controllers." )
         assignResult = main.TRUE
-        for i in range(1, 8):
+        for i in range( 1, 8 ):
             assignResult = assignResult & \
                            main.Mininet1.assignSwController( sw="s" + str( i ),
                                                              ip=main.Cluster.getIps(),
                                                              port='6653' )
-        time.sleep(main.mnCfgSleep)
+        time.sleep( main.mnCfgSleep )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="Successfully assign switches to controllers",
                                  onfail="Failed to assign switches to controllers" )
 
-
     def CASE12( self, main ):
         """
             Tests using through ONOS CLI handles
         """
-
-        main.case( "Test some onos commands through CLI. ")
-        main.log.debug( main.Cluster.active( 0 ).CLI.sendline("summary") )
-        main.log.debug( main.Cluster.active( 0 ).CLI.sendline("devices") )
+        main.case( "Test some onos commands through CLI. " )
+        main.log.debug( main.Cluster.active( 0 ).CLI.sendline( "summary" ) )
+        main.log.debug( main.Cluster.active( 0 ).CLI.sendline( "devices" ) )
 
     def CASE22( self, main ):
         """
             Tests using ONOS REST API handles
         """
-
-        main.case( " Sample tests using ONOS REST API handles. ")
-        main.log.debug( main.Cluster.active( 0 ).REST.send("/devices") )
+        main.case( " Sample tests using ONOS REST API handles. " )
+        main.log.debug( main.Cluster.active( 0 ).REST.send( "/devices" ) )
         main.log.debug( main.Cluster.active( 0 ).REST.apps() )
 
     def CASE32( self, main ):
@@ -219,17 +212,17 @@
         installResults = main.Cluster.active( 0 ).CLI.activateApp( "org.onosproject.fwd" )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=installResults,
-                                 onpass = "Configure fwd successful",
+                                 onpass="Configure fwd successful",
                                  onfail="Configure fwd failed" )
         main.step( "Run pingall to check connectivity. " )
         pingResult = main.FALSE
         passMsg = "Reactive Pingall test passed"
         pingResult = main.Mininet1.pingall()
         if not pingResult:
-           main.log.warn( "First pingall failed. Trying again..." )
-           pingResult = main.Mininet1.pingall()
-           passMsg += "on the second try"
+            main.log.warn( "First pingall failed. Trying again..." )
+            pingResult = main.Mininet1.pingall()
+            passMsg += "on the second try"
         utilities.assert_equals( expect=main.TRUE,
                                  actual=pingResult,
                                  onpass=passMsg,
-                                 onfail= "Reactive Pingall failed, " + "one or more ping pairs failed." )
+                                 onfail="Reactive Pingall failed, " + "one or more ping pairs failed." )
diff --git a/TestON/tests/SAMP/SAMPstartTemplate_3node/Dependency/newFuncTopo.py b/TestON/tests/SAMP/SAMPstartTemplate_3node/Dependency/newFuncTopo.py
old mode 100755
new mode 100644
index 0d72770..ad99198
--- a/TestON/tests/SAMP/SAMPstartTemplate_3node/Dependency/newFuncTopo.py
+++ b/TestON/tests/SAMP/SAMPstartTemplate_3node/Dependency/newFuncTopo.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Custom topology for Mininet
 """
@@ -35,19 +34,23 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class VLANHost( Host ):
+
     def config( self, vlan=100, **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ifconfig %s inet 0' % intf )
         self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
-        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params[ 'ip' ] ) )
         newName = '%s.%d' % ( intf, vlan )
         intf.name = newName
         self.nameToIntf[ newName ] = intf
         return r
 
+
 class IPv6Host( Host ):
+
     def config( self, v6Addr='1000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
@@ -55,13 +58,16 @@
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='2000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class MyTopo( Topo ):
 
     def __init__( self ):
@@ -69,43 +75,43 @@
         Topo.__init__( self )
 
         # Switch S5 Hosts
-        host1=self.addHost( 'h1', ip='10.1.0.2/24' )
-        host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
-        host3=self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
-        #VLAN hosts
-        host4=self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
-        host5=self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host6=self.addHost( 'h6', ip='11.1.0.2/24' )
-        host7=self.addHost( 'h7', ip='12.1.0.2/24' )
-        #Multicast Sender
-        host8=self.addHost( 'h8', ip='10.1.0.4/24' )
+        host1 = self.addHost( 'h1', ip='10.1.0.2/24' )
+        host2 = self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+        host3 = self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
+        # VLAN hosts
+        host4 = self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
+        host5 = self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host6 = self.addHost( 'h6', ip='11.1.0.2/24' )
+        host7 = self.addHost( 'h7', ip='12.1.0.2/24' )
+        # Multicast Sender
+        host8 = self.addHost( 'h8', ip='10.1.0.4/24' )
 
         # Switch S6 Hosts
-        host9=self.addHost( 'h9', ip='10.1.0.5/24' )
-        host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
-        host11=self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
-        #VLAN hosts
-        host12=self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
-        host13=self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host14=self.addHost( 'h14', ip='11.1.0.3/24' )
-        host15=self.addHost( 'h15', ip='12.1.0.3/24' )
-        #Multicast Receiver
-        host16=self.addHost( 'h16', ip='10.1.0.7/24' )
+        host9 = self.addHost( 'h9', ip='10.1.0.5/24' )
+        host10 = self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+        host11 = self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
+        # VLAN hosts
+        host12 = self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
+        host13 = self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host14 = self.addHost( 'h14', ip='11.1.0.3/24' )
+        host15 = self.addHost( 'h15', ip='12.1.0.3/24' )
+        # Multicast Receiver
+        host16 = self.addHost( 'h16', ip='10.1.0.7/24' )
 
         # Switch S7 Hosts
-        host17=self.addHost( 'h17', ip='10.1.0.8/24' )
-        host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
-        host19=self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
-        #VLAN hosts
-        host20=self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
-        host21=self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host22=self.addHost( 'h22', ip='11.1.0.4/24' )
-        host23=self.addHost( 'h23', ip='12.1.0.4/24' )
-        #Multicast Receiver
-        host24=self.addHost( 'h24', ip='10.1.0.10/24' )
+        host17 = self.addHost( 'h17', ip='10.1.0.8/24' )
+        host18 = self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+        host19 = self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
+        # VLAN hosts
+        host20 = self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
+        host21 = self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host22 = self.addHost( 'h22', ip='11.1.0.4/24' )
+        host23 = self.addHost( 'h23', ip='12.1.0.4/24' )
+        # Multicast Receiver
+        host24 = self.addHost( 'h24', ip='10.1.0.10/24' )
 
         s1 = self.addSwitch( 's1' )
         s2 = self.addSwitch( 's2' )
@@ -115,59 +121,60 @@
         s6 = self.addSwitch( 's6' )
         s7 = self.addSwitch( 's7' )
 
-        self.addLink(s5,host1)
-        self.addLink(s5,host2)
-        self.addLink(s5,host3)
-        self.addLink(s5,host4)
-        self.addLink(s5,host5)
-        self.addLink(s5,host6)
-        self.addLink(s5,host7)
-        self.addLink(s5,host8)
+        self.addLink( s5, host1 )
+        self.addLink( s5, host2 )
+        self.addLink( s5, host3 )
+        self.addLink( s5, host4 )
+        self.addLink( s5, host5 )
+        self.addLink( s5, host6 )
+        self.addLink( s5, host7 )
+        self.addLink( s5, host8 )
 
-        self.addLink(s6,host9)
-        self.addLink(s6,host10)
-        self.addLink(s6,host11)
-        self.addLink(s6,host12)
-        self.addLink(s6,host13)
-        self.addLink(s6,host14)
-        self.addLink(s6,host15)
-        self.addLink(s6,host16)
+        self.addLink( s6, host9 )
+        self.addLink( s6, host10 )
+        self.addLink( s6, host11 )
+        self.addLink( s6, host12 )
+        self.addLink( s6, host13 )
+        self.addLink( s6, host14 )
+        self.addLink( s6, host15 )
+        self.addLink( s6, host16 )
 
-        self.addLink(s7,host17)
-        self.addLink(s7,host18)
-        self.addLink(s7,host19)
-        self.addLink(s7,host20)
-        self.addLink(s7,host21)
-        self.addLink(s7,host22)
-        self.addLink(s7,host23)
-        self.addLink(s7,host24)
+        self.addLink( s7, host17 )
+        self.addLink( s7, host18 )
+        self.addLink( s7, host19 )
+        self.addLink( s7, host20 )
+        self.addLink( s7, host21 )
+        self.addLink( s7, host22 )
+        self.addLink( s7, host23 )
+        self.addLink( s7, host24 )
 
-        self.addLink(s1,s2)
-        self.addLink(s1,s3)
-        self.addLink(s1,s4)
-        self.addLink(s1,s5)
+        self.addLink( s1, s2 )
+        self.addLink( s1, s3 )
+        self.addLink( s1, s4 )
+        self.addLink( s1, s5 )
 
-        self.addLink(s2,s3)
-        self.addLink(s2,s5)
-        self.addLink(s2,s6)
+        self.addLink( s2, s3 )
+        self.addLink( s2, s5 )
+        self.addLink( s2, s6 )
 
-        self.addLink(s3,s4)
-        self.addLink(s3,s6)
+        self.addLink( s3, s4 )
+        self.addLink( s3, s6 )
 
-        self.addLink(s4,s7)
+        self.addLink( s4, s7 )
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.py b/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.py
index 553fa8e..cb5019c 100644
--- a/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.py
+++ b/TestON/tests/SAMP/SAMPstartTemplate_3node/SAMPstartTemplate_3node.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,23 +18,22 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # This is a sample template that starts up ONOS cluster, this template
 # can be use as a base script for ONOS System Testing.
 
+
 class SAMPstartTemplate_3node:
 
     def __init__( self ):
         self.default = ''
 
-
-    def CASE0(self, main):
-        '''
+    def CASE0( self, main ):
+        """
             Pull specific ONOS branch, then Build ONOS on ONOS Bench.
             This step is usually skipped. Because in a Jenkins driven automated
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
         except ImportError:
@@ -47,13 +46,12 @@
 
         main.testSetUp.gitPulling()
 
-
     def CASE1( self, main ):
-        '''
+        """
             Set up global test variables;
             Uninstall all running cells in test env defined in .topo file
 
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
         except ImportError:
@@ -67,23 +65,21 @@
         main.testSetUp.envSetupDescription()
         stepResult = main.FALSE
         try:
-            main.onosStartupSleep = float(main.params['CASE1']['SleepTimers']['onosStartup'])
-            main.onosCfgSleep = float(main.params['CASE1']['SleepTimers']['onosCfg'])
-            main.mnStartupSleep = float(main.params['CASE1']['SleepTimers']['mnStartup'])
-            main.mnCfgSleep = float(main.params['CASE1']['SleepTimers']['mnCfg'])
+            main.onosStartupSleep = float( main.params[ 'CASE1' ][ 'SleepTimers' ][ 'onosStartup' ] )
+            main.onosCfgSleep = float( main.params[ 'CASE1' ][ 'SleepTimers' ][ 'onosCfg' ] )
+            main.mnStartupSleep = float( main.params[ 'CASE1' ][ 'SleepTimers' ][ 'mnStartup' ] )
+            main.mnCfgSleep = float( main.params[ 'CASE1' ][ 'SleepTimers' ][ 'mnCfg' ] )
             stepResult = main.testSetUp.envSetup( includeGitPull=False )
         except Exception as e:
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
 
-
-
     def CASE2( self, main ):
-        '''
+        """
             Report errors/warnings/exceptions
-        '''
-        main.log.info("Error report: \n" )
-        main.ONOSbench.logReport( main.Cluster.runningNodes[0].ipAddress,
+        """
+        main.log.info( "Error report: \n" )
+        main.ONOSbench.logReport( main.Cluster.runningNodes[ 0 ].ipAddress,
                                   [ "INFO",
                                     "FOLLOWER",
                                     "WARN",
@@ -94,10 +90,10 @@
 
     def CASE10( self, main ):
         """
-        Start ONOS cluster (3 nodes in this example) in three steps:
-        1) start a basic cluster with drivers app via ONOSDriver;
-        2) activate apps via ONOSCliDriver;
-        3) configure onos via ONOSCliDriver;
+        Start ONOS cluster ( 3 nodes in this example ) in three steps:
+        1 ) start a basic cluster with drivers app via ONOSDriver;
+        2 ) activate apps via ONOSCliDriver;
+        3 ) configure onos via ONOSCliDriver;
         """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
@@ -113,9 +109,9 @@
 
         main.case( "Start up " + str( main.Cluster.numCtrls ) + "-node onos cluster." )
 
-        main.step( "Start ONOS cluster with basic (drivers) app.")
+        main.step( "Start ONOS cluster with basic (drivers) app." )
         stepResult = main.ONOSbench.startBasicONOS( nodeList=main.Cluster.getIps(), opSleep=200,
-                                               onosUser=main.ONOScell.karafUser )
+                                                    onosUser=main.ONOScell.karafUser )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="Successfully started basic ONOS cluster ",
@@ -123,13 +119,13 @@
 
         main.testSetUp.startOnosClis()
 
-        main.step( "Activate onos apps.")
-        main.apps = main.params['CASE10'].get( 'Apps' )
+        main.step( "Activate onos apps." )
+        main.apps = main.params[ 'CASE10' ].get( 'Apps' )
         if main.apps:
             main.log.info( "Apps to activate: " + main.apps )
             activateResult = main.TRUE
-            for a in main.apps.split(","):
-                activateResult = activateResult & main.Cluster.active( 0 ).CLI.activateApp(a)
+            for a in main.apps.split( "," ):
+                activateResult = activateResult & main.Cluster.active( 0 ).CLI.activateApp( a )
             # TODO: check this worked
             time.sleep( main.onosCfgSleep )  # wait for apps to activate
         else:
@@ -140,14 +136,14 @@
                                  onfail="Failed to set config" )
 
         main.step( "Set ONOS configurations" )
-        config = main.params['CASE10'].get( 'ONOS_Configuration' )
+        config = main.params[ 'CASE10' ].get( 'ONOS_Configuration' )
         if config:
             main.log.debug( config )
             checkResult = main.TRUE
             for component in config:
-                for setting in config[component]:
-                    value = config[component][setting]
-                    check = main.Cluster.runningNodes[0].setCfg( component, setting, value )
+                for setting in config[ component ]:
+                    value = config[ component ][ setting ]
+                    check = main.Cluster.runningNodes[ 0 ].setCfg( component, setting, value )
                     main.log.info( "Value was changed? {}".format( main.TRUE == check ) )
                     checkResult = check and checkResult
             utilities.assert_equals( expect=main.TRUE,
@@ -163,12 +159,12 @@
         """
         import time
 
-        topology = main.params['CASE11']['topo']
+        topology = main.params[ 'CASE11' ][ 'topo' ]
         main.log.report( "Start Mininet topology" )
         main.case( "Start Mininet topology" )
 
         main.step( "Starting Mininet Topology" )
-        topoResult = main.Mininet1.startNet(mnCmd=topology )
+        topoResult = main.Mininet1.startNet( mnCmd=topology )
         stepResult = topoResult
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -178,25 +174,23 @@
         if not topoResult:
             main.cleanAndExit()
 
-        main.step( "Assign switches to controllers.")
+        main.step( "Assign switches to controllers." )
         assignResult = main.TRUE
-        for i in range(1, 8):
+        for i in range( 1, 8 ):
             assignResult = assignResult & main.Mininet1.assignSwController( sw="s" + str( i ),
                                                                             ip=main.Cluster.getIps(),
                                                                             port='6653' )
-        time.sleep(main.mnCfgSleep)
+        time.sleep( main.mnCfgSleep )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="Successfully assign switches to controllers",
                                  onfail="Failed to assign switches to controllers" )
 
-
     def CASE12( self, main ):
         """
             Tests using through ONOS CLI handles
         """
-
-        main.case( "Test some onos commands through CLI. ")
+        main.case( "Test some onos commands through CLI. " )
         main.log.debug( main.Cluster.active( 0 ).CLI.sendline( "summary" ) )
         main.log.debug( main.Cluster.active( 1 ).CLI.sendline( "devices" ) )
 
@@ -204,8 +198,7 @@
         """
             Tests using ONOS REST API handles
         """
-
-        main.case( " Sample tests using ONOS REST API handles. ")
+        main.case( " Sample tests using ONOS REST API handles. " )
         main.log.debug( main.Cluster.active( 0 ).REST.send( "/devices" ) )
         main.log.debug( main.Cluster.active( 2 ).REST.apps() )
 
@@ -221,17 +214,17 @@
         installResults = main.Cluster.active( 0 ).CLI.activateApp( "org.onosproject.fwd" )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=installResults,
-                                 onpass= "Configure fwd successful",
-                                 onfail= "Configure fwd failed" )
+                                 onpass="Configure fwd successful",
+                                 onfail="Configure fwd failed" )
         main.step( "Run pingall to check connectivity. " )
         pingResult = main.FALSE
         passMsg = "Reactive Pingall test passed"
         pingResult = main.Mininet1.pingall()
         if not pingResult:
-           main.log.warn("First pingall failed. Trying again...")
-           pingResult = main.Mininet1.pingall()
-           passMsg += "on the second try"
+            main.log.warn( "First pingall failed. Trying again..." )
+            pingResult = main.Mininet1.pingall()
+            passMsg += "on the second try"
         utilities.assert_equals( expect=main.TRUE,
                                  actual=pingResult,
                                  onpass=passMsg,
-                                 onfail= "Reactive Pingall failed, " + "one or more ping pairs failed" )
+                                 onfail="Reactive Pingall failed, " + "one or more ping pairs failed" )
diff --git a/TestON/tests/SCPF/SCPFcbench/SCPFcbench.py b/TestON/tests/SCPF/SCPFcbench/SCPFcbench.py
index 0bafefb..c139d48 100644
--- a/TestON/tests/SCPF/SCPFcbench/SCPFcbench.py
+++ b/TestON/tests/SCPF/SCPFcbench/SCPFcbench.py
@@ -22,13 +22,13 @@
         main.case( "pre-condition for cbench test." )
 
         try:
-            if type( init ) is not bool:
+            if not isinstance( init, bool ):
                 init = False
         except NameError:
             init = False
 
         # -- INIT SECTION, ONLY RUNS ONCE -- #
-        if init == False:
+        if not init:
             init = True
             try:
                 from tests.dependencies.ONOSSetup import ONOSSetup
@@ -80,7 +80,6 @@
                                  onpass="Successfully configure onos for cbench test ",
                                  onfail="Failed to configure onos for cbench test" )
 
-
     def CASE2( self, main ):
         main.case( "Running Cbench" )
         main.step( "Issuing cbench commands and grab returned results" )
@@ -119,7 +118,7 @@
                 main.log.info( "Standard Deviation: \t" + stdev )
 
                 try:
-                    dbFileName="/tmp/CbenchDB"
+                    dbFileName = "/tmp/CbenchDB"
                     dbfile = open( dbFileName, "w+" )
                     temp = "'" + main.commit + "',"
                     temp += "'" + mode + "',"
@@ -133,7 +132,7 @@
 
                 stepResult = main.TRUE
                 break
-        if ( validFlag == False ):
+        if not validFlag:
             main.log.warn( "Cbench Test produced no valid results!!!!" )
             stepResult = main.FALSE
 
@@ -141,4 +140,3 @@
                                  actual=stepResult,
                                  onpass="Successfully tested onos for cbench. ",
                                  onfail="Failed to obtain valid onos cbench result!" )
-
diff --git a/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py b/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py
index 41b09aa..c86ecac 100644
--- a/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py
+++ b/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # ScaleOutTemplate -> flowTP
 #
 # CASE1 starts number of nodes specified in param file
@@ -40,24 +39,24 @@
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
         except ImportError:
-            main.log.error("ONOSSetup not found. exiting the test")
+            main.log.error( "ONOSSetup not found. exiting the test" )
             main.cleanAndExit()
         main.testSetUp.envSetupDescription()
         try:
-            #Load values from params file
+            # Load values from params file
             cellName = main.params[ 'ENV' ][ 'cellName' ]
             main.apps = main.params[ 'ENV' ][ 'cellApps' ]
             BENCHUser = main.params[ 'BENCH' ][ 'user' ]
             BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
-            main.scale = ( main.params[ 'SCALE' ]  ).split( "," )
+            main.scale = ( main.params[ 'SCALE' ] ).split( "," )
             main.flowRuleCfg = main.params[ 'CFG' ][ 'flowRule' ]
             main.neighbor = ( main.params[ 'TEST' ][ 'neighbors' ] ).split( "," )
             main.nullProviderCfg = main.params[ 'CFG' ][ 'nullProvider' ]
             isFlowObj = main.params[ 'TEST' ][ 'flowObj' ] == "True"
             if isFlowObj:
-               resultFile = main.params[ 'TEST' ][ 'flowObjResultFile' ]
+                resultFile = main.params[ 'TEST' ][ 'flowObjResultFile' ]
             else:
-               resultFile = main.params[ 'TEST' ][ 'flowResultFile' ]
+                resultFile = main.params[ 'TEST' ][ 'flowResultFile' ]
             stepResult = main.testSetUp.envSetup()
             resultsDB = open( str( resultFile ), "w+" )
             resultsDB.close()
@@ -110,13 +109,13 @@
         main.step( "\tNEIGHBORS:\t" + neighbors )
         main.log.info( "=============================================================" )
         main.log.info( "=============================================================" )
-        #write file to configure nil link
+        # write file to configure nil link
         ipCSV = ""
-        for i in range ( main.Cluster.maxCtrls ):
+        for i in range( main.Cluster.maxCtrls ):
             tempstr = "ip" + str( i + 1 )
             ipCSV += main.params[ 'CTRL' ][ tempstr ]
             if i + 1 < main.Cluster.maxCtrls:
-                ipCSV +=","
+                ipCSV += ","
 
         main.ONOSbench.onosCfgSet( main.Cluster.active( 0 ).ipAddress,
                                    main.flowRuleCfg,
@@ -142,51 +141,51 @@
                 main.ONOSbench.handle.expect( ":~" )
                 time.sleep( 5 )
                 main.ONOSbench.handle.sendline( "onos $OC1 roles " )
-                main.ONOSbench.handle.expect ( ":~" )
+                main.ONOSbench.handle.expect( ":~" )
                 main.log.info( "switch masterships:" + str( main.ONOSbench.handle.before ) )
                 break
             time.sleep( 5 )
 
-        #divide flows/flowObjectives
+        # divide flows/flowObjectives
         if isFlowObj:
-           toInstall = "FlowObjectives"
-           installCount = int( main.params[ 'TEST' ][ 'flowObjectives' ] )
-           ifFailed = "FLOW_OBJ_TESTER.PY FAILURE"
-           resultFile = main.params[ 'TEST' ][ 'flowObjResultFile' ]
+            toInstall = "FlowObjectives"
+            installCount = int( main.params[ 'TEST' ][ 'flowObjectives' ] )
+            ifFailed = "FLOW_OBJ_TESTER.PY FAILURE"
+            resultFile = main.params[ 'TEST' ][ 'flowObjResultFile' ]
         else:
-           toInstall = "Flows"
-           installCount = int( main.params[ 'TEST' ][ 'flows' ] )
-           ifFailed = "FLOW_TESTER.PY FAILURE"
-           resultFile = main.params[ 'TEST' ][ 'flowResultFile' ]
+            toInstall = "Flows"
+            installCount = int( main.params[ 'TEST' ][ 'flows' ] )
+            ifFailed = "FLOW_TESTER.PY FAILURE"
+            resultFile = main.params[ 'TEST' ][ 'flowResultFile' ]
         main.log.info( toInstall + " Target  = " + str( installCount ) )
 
-        installCountPerSwitch = ( installCount *max( int ( neighbors ) + 1, int( servers ) ) )/( ( int( neighbors ) + 1 )*int( servers )*( switches ) )
+        installCountPerSwitch = ( installCount * max( int( neighbors ) + 1, int( servers ) ) ) / ( ( int( neighbors ) + 1 ) * int( servers ) * ( switches ) )
 
         main.log.info( toInstall + " per switch = " + str( installCountPerSwitch ) )
-        #build list of servers in "$OC1, $OC2...." format
+        # build list of servers in "$OC1, $OC2...." format
         serverEnvVars = ""
         for i in range( int( servers ) ):
             serverEnvVars += ( "-s " + main.Cluster.active( i ).ipAddress + " " )
 
-        data = [ [ "" ]*int( servers ) ]*int( sampleSize )
-        maxes = [ "" ]*int( sampleSize )
+        data = [ [ "" ] * int( servers ) ] * int( sampleSize )
+        maxes = [ "" ] * int( sampleSize )
 
         flowCMD = "python3 " + homeDir + "/onos/tools/test/bin/"
         if isFlowObj:
-           flowCMD += testCMD[ 2 ] + " " + str( installCountPerSwitch ) + " " + testCMD[ 1 ]
-           flowCMD += " " + neighbors + " " + testCMD[ 3 ] + " " + str( flowObjType ) + " " + str( serverEnvVars ) + "-j"
+            flowCMD += testCMD[ 2 ] + " " + str( installCountPerSwitch ) + " " + testCMD[ 1 ]
+            flowCMD += " " + neighbors + " " + testCMD[ 3 ] + " " + str( flowObjType ) + " " + str( serverEnvVars ) + "-j"
         else:
-           flowCMD += testCMD[ 0 ] + " " + str( installCountPerSwitch ) + " " + testCMD[ 1 ]
-           flowCMD += " " + neighbors + " " + str( serverEnvVars ) + "-j"
+            flowCMD += testCMD[ 0 ] + " " + str( installCountPerSwitch ) + " " + testCMD[ 1 ]
+            flowCMD += " " + neighbors + " " + str( serverEnvVars ) + "-j"
 
         main.log.info( flowCMD )
-        #time.sleep( 60 )
+        # time.sleep( 60 )
 
         for test in range( 0, warmUp + sampleSize ):
             if test < warmUp:
                 main.log.info( "Warm up " + str( test + 1 ) + " of " + str( warmUp ) )
             else:
-                 main.log.info( "====== Test run: " + str( test-warmUp+1 ) + " ======" )
+                main.log.info( "====== Test run: " + str( test - warmUp + 1 ) + " ======" )
 
             main.ONOSbench.handle.sendline( flowCMD )
             main.ONOSbench.handle.expect( ":~" )
@@ -205,17 +204,17 @@
                 main.log.info( main.ONOSbench.handle.before )
 
                 break
-            result = [ "" ]*( main.Cluster.numCtrls )
+            result = [ "" ] * ( main.Cluster.numCtrls )
 
             rawResult = rawResult.splitlines()
 
             for node in range( main.Cluster.numCtrls ):
                 for line in rawResult:
-                    #print( "line: " + line )
+                    # print( "line: " + line )
                     if main.Cluster.active( node ).ipAddress in line and "server" in line:
                         temp = line.split( " " )
                         for word in temp:
-                            #print ( "word: " + word )
+                            # print ( "word: " + word )
                             if "elapsed" in repr( word ):
                                 index = temp.index( word ) + 1
                                 myParsed = ( temp[ index ] ).replace( ",", "" )
@@ -231,11 +230,11 @@
                         main.log.error( "Missing data point, critical failure incoming" )
 
                 print result
-                maxes[ test-warmUp ] = max( result )
-                main.log.info( "Data collection iteration: " + str( test-warmUp ) + " of " + str( sampleSize ) )
-                main.log.info( "Throughput time: " + str( maxes[ test-warmUp ] ) + "(ms)" )
+                maxes[ test - warmUp ] = max( result )
+                main.log.info( "Data collection iteration: " + str( test - warmUp ) + " of " + str( sampleSize ) )
+                main.log.info( "Throughput time: " + str( maxes[ test - warmUp ] ) + "(ms)" )
 
-                data[ test-warmUp ] = result
+                data[ test - warmUp ] = result
 
             # wait for flows = 0
             for checkCount in range( 0, 5 ):
@@ -257,7 +256,6 @@
         main.log.info( "raw data: " + str( data ) )
         main.log.info( "maxes:" + str( maxes ) )
 
-
         # report data
         print( "" )
         main.log.info( "\t Results (measurments are in milliseconds)" )
@@ -285,7 +283,7 @@
         main.log.info( "Standard Deviation of max values: " + str( stdOfMaxes ) )
         print( "\n\n" )
 
-        avgTP = int( installCount )  / avgOfMaxes #result in kflows/second
+        avgTP = int( installCount ) / avgOfMaxes  # result in kflows/second
 
         tp = []
         for i in maxes:
@@ -308,4 +306,4 @@
 
         main.log.report( "Result line to file: " + resultString )
 
-        main.ONOSbench.logReport( main.Cluster.active( 0 ).ipAddress, [ "ERROR", "WARNING", "EXCEPT" ], outputMode="d" )
\ No newline at end of file
+        main.ONOSbench.logReport( main.Cluster.active( 0 ).ipAddress, [ "ERROR", "WARNING", "EXCEPT" ], outputMode="d" )
diff --git a/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.py b/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.py
index 4298c3d..b742960 100644
--- a/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.py
+++ b/TestON/tests/SCPF/SCPFhostLat/SCPFhostLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
     SCPFhostLat
     This test will test the host found latency.
@@ -213,7 +212,7 @@
                     caseResult = main.FALSE
                 resultFile.close()
             # Compare the timestemps, and get the lowest one.
-            temp = 0;
+            temp = 0
             # Get host event timestamps from each nodes
             for ctrl in main.Cluster.active():
                 metricsResult = json.loads( ctrl.CLI.topologyEventsMetrics() )
@@ -229,7 +228,7 @@
             # gethost to remove
             gethost = main.Cluster.active( 0 ).REST.hosts()
             HosttoRemove = []
-            HosttoRemove.append( json.loads( gethost[ 1:len( gethost )-1 ] ).get( 'id' ) )
+            HosttoRemove.append( json.loads( gethost[ 1:len( gethost ) - 1 ] ).get( 'id' ) )
             main.Cluster.active( 0 ).CLI.removeHost( HosttoRemove )
 
         main.log.info( "Result List: {}".format( addingHostTime ) )
@@ -260,7 +259,7 @@
         assertion = main.TRUE
 
         utilities.assert_equals( expect=main.TRUE, actual=assertion,
-                onpass='Host latency test successful',
-                onfail='Host latency test failed' )
+                                 onpass='Host latency test successful',
+                                 onfail='Host latency test failed' )
 
         main.Utils.mininetCleanup( main.Mininet1 )
diff --git a/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.py b/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.py
index 97f6039..7be0cc3 100644
--- a/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.py
+++ b/TestON/tests/SCPF/SCPFintentEventTp/SCPFintentEventTp.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,25 +18,24 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
 SCPFintentEventTp
     - Use intentperf app to generate a lot of intent install and withdraw events
     - Test will run with 1,3,5,7 nodes, and with all neighbors
     - Test will run 400 seconds and grep the overall rate from intent-perf summary
 
     yunpeng@onlab.us
-'''
-
+"""
 import time
 
 
 class SCPFintentEventTp:
+
     def __init__( self ):
         self.default = ''
 
     def CASE0( self, main ):
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -44,7 +43,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -120,6 +119,7 @@
         # balanceMasters
         main.Cluster.active( 0 ).CLI.balanceMasters()
         time.sleep( main.startUpSleep )
+
     def CASE2( self, main ):
         import numpy
 
@@ -158,7 +158,7 @@
                 resultString = "'" + main.commit + "',"
                 resultString += "'1gig',"
                 resultString += str( main.Cluster.numCtrls ) + ","
-                resultString += "'baremetal" + str( nodes + 1 ) + "',"
+                resultString += "'baremetal" + str(nodes + 1) + "',"
                 resultString += neighbors + ","
                 resultString += result[ main.Cluster.active( nodes ).ipAddress ] + ","
                 resultString += str( 0 ) + "\n"  # no stddev
diff --git a/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py b/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py
index 78a2b34..44e0b6e 100644
--- a/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py
+++ b/TestON/tests/SCPF/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,23 +18,23 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 SCPFintentInstallWithdrawLat:
     - Test the latency of intent installed and withdrawn
     - Use Push-test-intents command to push intents
     - Use Null provider with 7 devices and linear topology
     - Always push intents between 1/6 and 7/5
-    - The batch size is defined in parm file. ( default 1,100,1000)
+    - The batch size is defined in parm file. ( default 1,100,1000 )
 
     yunpeng@onlab.us
 """
 class SCPFintentInstallWithdrawLat:
+
     def __init__( self ):
         self.default = ''
 
     def CASE0( self, main ):
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -42,8 +42,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
-
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -97,6 +96,7 @@
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
         main.commit = main.commit.split( " " )[ 1 ]
+
     def CASE1( self, main ):
         # Clean up test environment and set up
         import time
@@ -156,7 +156,7 @@
                                                                               options="-i",
                                                                               timeout=main.timeout,
                                                                               getResponse=True )
-                if type( installResult ) is str:
+                if isinstance( installResult, str ):
                     if "Failure" in installResult:
                         main.log.error( "Install Intents failure, ignore this iteration." )
                         if validrun < main.warmUp:
@@ -195,7 +195,7 @@
                                                                                timeout=main.timeout,
                                                                                getResponse=True )
 
-                if type( withdrawResult ) is str:
+                if isinstance( withdrawResult, str ):
                     if "Failure" in withdrawResult:
                         main.log.error( "withdraw Intents failure, ignore this iteration." )
                         if validrun < main.warmUp:
@@ -238,8 +238,8 @@
             main.log.report( "Install average: {}    std: {}".format( installave, installstd ) )
             main.log.report( "Withdraw average: {}   std: {}".format( withdrawave, withdrawstd ) )
             # write result to database file
-            if not ( numpy.isnan( installave ) or numpy.isnan( installstd ) or\
-                    numpy.isnan( withdrawstd ) or numpy.isnan( withdrawave ) ):
+            if not ( numpy.isnan( installave ) or numpy.isnan( installstd ) or
+                     numpy.isnan( withdrawstd ) or numpy.isnan( withdrawave ) ):
                 databaseString = "'" + main.commit + "',"
                 databaseString += str( main.Cluster.numCtrls ) + ","
                 databaseString += str( batchSize ) + ","
diff --git a/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py b/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py
index 285e12d..41a3408 100644
--- a/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py
+++ b/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # SCPFintentRerouteLat
 """
 SCPFintentRerouteLat
@@ -26,24 +25,23 @@
     - Test Algorithm:
         1. Start Null Provider reroute Topology
         2. Using Push-test-intents to push batch size intents from switch 1 to switch 7
-        3. Cut the link between switch 3 and switch 4 (the path will reroute to switch 8)
+        3. Cut the link between switch 3 and switch 4 ( the path will reroute to switch 8 )
         4. Get the topology time stamp
-        5. Get Intent reroute(Installed) time stamp from each nodes
+        5. Get Intent reroute( Installed ) time stamp from each nodes
         6. Use the latest intent time stamp subtract topology time stamp
     - This test will run 5 warm up by default, warm up iteration can be setup in Param file
     - The intent batch size will default set to 1, 100, and 1000, also can be set in Param file
     - The unit of the latency result is milliseconds
 """
-
-
 class SCPFintentRerouteLat:
+
     def __init__( self ):
         self.default = ''
 
     def CASE0( self, main ):
         import imp
         import os
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -51,7 +49,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -115,11 +113,10 @@
         main.testSetUp.evnSetupConclusion( stepResult )
         main.commit = main.commit.split( " " )[ 1 ]
 
-
     def CASE1( self, main ):
-        '''
+        """
             clean up test environment and set up
-        '''
+        """
         import time
 
         main.maxNumBatch = 0
@@ -239,7 +236,8 @@
                         main.startLine[ i ] = timestamp
                         main.log.info( "Timestamp of last LINK_REMOVED event on node {} is {}".format( i + 1,
                                                                                                        main.startLine[ i ] ) )
-                if skip: continue
+                if skip:
+                    continue
 
                 # calculate values
                 topologyTimestamps = main.intentRerouteLatFuncs.getTopologyTimestamps( main )
diff --git a/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py b/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
index d9d0271..d91f09e 100644
--- a/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
+++ b/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
@@ -1,37 +1,39 @@
-'''
+"""
 The functions for intentRerouteLat
 
-'''
+"""
 import numpy
 import time
 import json
 
+
 def _init_( self ):
     self.default = ''
 
+
 def sanityCheck( main, linkNumExpected, flowNumExpected, intentNumExpected ):
-    '''
+    """
     Sanity check on numbers of links, flows and intents in ONOS
-    '''
+    """
     attemps = 0
     main.verify = main.FALSE
     linkNum = 0
     flowNum = 0
     intentNum = 0
     while attemps <= main.verifyAttempts:
-        time.sleep(main.verifySleep)
+        time.sleep( main.verifySleep )
         summary = json.loads( main.Cluster.active( 0 ).CLI.summary( timeout=main.timeout ) )
-        linkNum = summary.get("links")
-        flowNum = summary.get("flows")
-        intentNum = summary.get("intents")
+        linkNum = summary.get( "links" )
+        flowNum = summary.get( "flows" )
+        intentNum = summary.get( "intents" )
         if linkNum == linkNumExpected and flowNum == flowNumExpected and intentNum == intentNumExpected:
-            main.log.info("links: {}, flows: {}, intents: {}".format(linkNum, flowNum, intentNum))
+            main.log.info( "links: {}, flows: {}, intents: {}".format( linkNum, flowNum, intentNum ) )
             main.verify = main.TRUE
             break
         attemps += 1
     if not main.verify:
-        main.log.warn("Links or flows or intents number not as expected")
-        main.log.warn("links: {}, flows: {}, intents: {}".format(linkNum, flowNum, intentNum))
+        main.log.warn( "Links or flows or intents number not as expected" )
+        main.log.warn( "links: {}, flows: {}, intents: {}".format( linkNum, flowNum, intentNum ) )
         # bring back topology
         bringBackTopology( main )
         if main.validRun >= main.warmUp:
@@ -39,6 +41,7 @@
         else:
             main.validRun += 1
 
+
 def bringBackTopology( main ):
     main.log.info( "Bring back topology " )
     main.Cluster.active( 0 ).CLI.pushTestIntents( main.ingress,
@@ -46,20 +49,20 @@
                                                   main.batchSize,
                                                   offset=1,
                                                   options="-w",
-                                                  timeout=main.timeout)
+                                                  timeout=main.timeout )
     main.Cluster.active( 0 ).CLI.purgeWithdrawnIntents()
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "deviceCount",
-                                         value=0)
+                                         value=0 )
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "enabled",
-                                         value="false")
+                                         value="false" )
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "deviceCount",
-                                         value=main.deviceCount)
+                                         value=main.deviceCount )
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "enabled",
-                                         value="true")
+                                         value="true" )
     main.Cluster.active( 0 ).CLI.balanceMasters()
     time.sleep( main.setMasterSleep )
     if main.Cluster.numCtrls > 1:
@@ -69,10 +72,11 @@
                                                  main.Cluster.active( 0 ).ipAddress )
     time.sleep( main.setMasterSleep )
 
+
 def getLogNum( main, nodeId ):
-    '''
+    """
     Return the number of karaf log files
-    '''
+    """
     try:
         logNameList = main.ONOSbench.listLog( main.Cluster.active( nodeId ).ipAddress )
         assert logNameList is not None
@@ -81,13 +85,14 @@
             return 2
         return 1
     except AssertionError:
-        main.log.error("There is no karaf log")
+        main.log.error( "There is no karaf log" )
         return -1
 
+
 def getTopologyTimestamps( main ):
-    '''
+    """
     Get timestamps for the last topology events on all cluster nodes
-    '''
+    """
     timestamps = []
     for i in range( main.Cluster.numCtrls ):
         # Search for last topology event in karaf log
@@ -99,7 +104,7 @@
             main.log.error( "Error when trying to get topology event timestamp" )
             return main.ERROR
         try:
-            timestampField = lines[0].split( "creationTime=" )
+            timestampField = lines[ 0 ].split( "creationTime=" )
             timestamp = timestampField[ 1 ].split( "," )
             timestamp = int( timestamp[ 0 ] )
             timestamps.append( timestamp )
@@ -108,10 +113,11 @@
             return main.ERROR
     return timestamps
 
+
 def getIntentTimestamps( main ):
-    '''
+    """
     Get timestamps for all intent keys on all cluster nodes
-    '''
+    """
     timestamps = {}
     for i in range( main.Cluster.numCtrls ):
         # Search for intent INSTALLED event in karaf log
@@ -128,7 +134,7 @@
                 keyField = line.split( "key=" )
                 key = keyField[ 1 ].split( "," )
                 key = key[ 0 ]
-                if not key in timestamps.keys():
+                if key not in timestamps.keys():
                     timestamps[ key ] = []
                 # Get timestamp
                 timestampField = line.split( "time = " )
@@ -140,10 +146,11 @@
                 return main.ERROR
     return timestamps
 
+
 def calculateLatency( main, topologyTimestamps, intentTimestamps ):
-    '''
+    """
     Calculate reroute latency values using timestamps
-    '''
+    """
     topologyTimestamp = numpy.min( topologyTimestamps )
     firstInstalledLatency = {}
     lastInstalledLatency = {}
diff --git a/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.py b/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.py
index ecbf5cd..0a99c41 100644
--- a/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.py
+++ b/TestON/tests/SCPF/SCPFmastershipFailoverLat/SCPFmastershipFailoverLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2017 Open Networking Foundation (ONF)
+Copyright 2017 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,15 +18,15 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 class SCPFmastershipFailoverLat:
+
     def __init__( self ):
         self.default = ''
 
     def CASE0( self, main ):
         import os
         import imp
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -34,7 +34,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -79,8 +79,6 @@
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
 
-
-
     def CASE1( self, main ):
         # Clean up test environment and set up
         import time
@@ -110,11 +108,10 @@
                                  onpass="Mininet was set up correctly.",
                                  onfail="Mininet was NOT set up correctly." )
 
-
     def CASE2( self, main ):
         """
         Kill ONOS node, and measure the latency for INSTANCE_DEACTIVATED, MASTER_CHANGED, and role request
-        (tshark time), then bring the node back up.
+        ( tshark time ), then bring the node back up.
         """
         import time
         import datetime
@@ -123,14 +120,17 @@
 
         main.HA = HA()
 
-        main.latencyData = { 'kill_to_deactivation' : [],
-                             'deactivation_to_role_request' : [] }
+        main.latencyData = { 'kill_to_deactivation': [],
+                             'deactivation_to_role_request': [] }
 
         main.failCounter = 0
         passingResult = True
         criticalError = False
 
-        main.step( "Gathering data starting with " + str( main.warmUp ) + " warm ups and a sample size of " + str( main.sampleSize ) )
+        main.step( "Gathering data starting with "
+                   + str( main.warmUp )
+                   + " warm ups and a sample size of "
+                   + str( main.sampleSize ) )
 
         for iteration in range( 0, main.sampleSize + main.warmUp ):
 
@@ -185,10 +185,12 @@
                 eventOutput = main.Cluster.active( CLInum ).CLI.events( args='-a' ).split( "\r\n" )
                 for line in reversed( eventOutput ):
                     if "INSTANCE_DEACTIVATED" in line and len( instanceDeactivatedLats ) == CLInum:
-                        deactivateTime = float( datetime.datetime.strptime( line.split()[ 0 ], "%Y-%m-%dT%H:%M:%S.%f" ).strftime( '%s.%f' ) ) * 1000.0
+                        deactivateTime = float( datetime.datetime.strptime(
+                                            line.split()[ 0 ], "%Y-%m-%dT%H:%M:%S.%f" ).strftime( '%s.%f' ) ) * 1000.0
                         instanceDeactivatedLats.append( deactivateTime - time1 )
                     elif "MASTER_CHANGED" in line and len( masterChangedLats ) == CLInum:
-                        changedTime = float( datetime.datetime.strptime( line.split()[ 0 ], "%Y-%m-%dT%H:%M:%S.%f" ).strftime( '%s.%f' ) ) * 1000.0
+                        changedTime = float( datetime.datetime.strptime(
+                                            line.split()[ 0 ], "%Y-%m-%dT%H:%M:%S.%f" ).strftime( '%s.%f' ) ) * 1000.0
                         masterChangedLats.append( changedTime - time1 )
                     if len( instanceDeactivatedLats ) > CLInum and len( masterChangedLats ) > CLInum:
                         break
@@ -228,9 +230,10 @@
 
                     if eventLatCheck and tsharkLatCheck and validDataCheck:
                         main.log.info( "Saving data..." )
-                        main.latencyData[ 'kill_to_deactivation' ].append( instanceDeactivated )
-                        main.latencyData[ 'deactivation_to_role_request' ].append( roleRequestLat - instanceDeactivated )
-
+                        main.latencyData[ 'kill_to_deactivation' ]\
+                            .append( instanceDeactivated )
+                        main.latencyData[ 'deactivation_to_role_request' ]\
+                            .append( roleRequestLat - instanceDeactivated )
 
             # Restart ONOS node
             main.log.info( "Restart ONOS node " + strNodeNumToKill + " and checking status of restart." )
@@ -279,24 +282,28 @@
                 main.failCounter += 1
                 main.log.warn( "Iteration failed. Failure count: " + str( main.failCounter ) )
             if float( main.failCounter ) / float( main.sampleSize ) >= main.failPercent or criticalError:
-                main.log.error( str( main.failPercent * 100 ) + "% or more of data is invalid, or a critical error has occurred." )
+                main.log.error( str( main.failPercent * 100 )
+                                + "% or more of data is invalid, or a critical error has occurred." )
                 passingResult = False
                 break
 
         utilities.assert_equals( expect=True, actual=passingResult,
-                                 onpass="Node scaling " + str( main.Cluster.numCtrls ) + " data gathering was successful.",
-                                 onfail="Node scaling " + str( main.Cluster.numCtrls ) + " data gathering FAILED. Stopping test.")
+                                 onpass="Node scaling "
+                                        + str( main.Cluster.numCtrls )
+                                        + " data gathering was successful.",
+                                 onfail="Node scaling "
+                                        + str( main.Cluster.numCtrls )
+                                        + " data gathering FAILED. Stopping test." )
         if not passingResult:
             main.cleanAndExit()
 
-
     def CASE3( self, main ):
         """
         Write results to database file.
         Omit this case if you don't want to write to database.
         """
         import numpy
-        result = { 'avg' : {}, 'stddev' : {} }
+        result = { 'avg': {}, 'stddev': {} }
 
         for i in main.latencyData:
             result[ 'avg' ][ i ] = numpy.average( main.latencyData[ i ] )
@@ -305,7 +312,7 @@
         main.log.info( "result: " + str( result ) )
         with open( main.dbFileName, "a" ) as dbFile:
             strToWrite = str( main.Cluster.numCtrls ) + ",'baremetal1'"
-            strToWrite += ",'" + main.commit.split()[ 1 ] + "'"
+            strToWrite += ",'" + main.commit.split()[1] + "'"
             for i in result:
                 for j in result[ i ]:
                     strToWrite += "," + str( result[ i ][ j ] )
diff --git a/TestON/tests/SCPF/SCPFportLat/SCPFportLat.py b/TestON/tests/SCPF/SCPFportLat/SCPFportLat.py
index 0c18564..180d860 100644
--- a/TestON/tests/SCPF/SCPFportLat/SCPFportLat.py
+++ b/TestON/tests/SCPF/SCPFportLat/SCPFportLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,23 +18,23 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
     SCPFportLat test
     Test latency for port status change
     Up & Down:
     PortStatus --- Device --- Link --- Graph
 
     yunpeng@onlab.us
-'''
+"""
 class SCPFportLat:
+
     def __init__( self ):
         self.default = ''
 
     def CASE0( self, main ):
         import os
         import imp
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -42,7 +42,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -87,9 +87,9 @@
             resultsDB.close()
 
             main.portFunc = imp.load_source( main.dependencyFunc,
-                                           main.dependencyPath +
-                                           main.dependencyFunc +
-                                           ".py" )
+                                             main.dependencyPath +
+                                             main.dependencyFunc +
+                                             ".py" )
         except Exception as e:
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
@@ -111,9 +111,9 @@
         time.sleep( 1 )
         main.log.info( "Copy topology file to Mininet" )
         main.ONOSbench.copyMininetFile( main.topoName,
-                                       main.dependencyPath,
-                                       main.Mininet1.user_name,
-                                       main.Mininet1.ip_address )
+                                        main.dependencyPath,
+                                        main.Mininet1.user_name,
+                                        main.Mininet1.ip_address )
         try:
             from tests.dependencies.utils import Utils
         except ImportError:
@@ -140,7 +140,7 @@
         import time
         import numpy
         # dictionary for each node and each timestamps
-        resultDict = { 'up' : {}, 'down' : {} }
+        resultDict = { 'up': {}, 'down': {} }
         for d in resultDict:
             for i in range( 1, main.Cluster.numCtrls + 1 ):
                 resultDict[ d ][ 'node' + str( i ) ] = {}
@@ -152,7 +152,7 @@
                 resultDict[ d ][ 'node' + str( i ) ][ 'LtoG' ] = []
         for i in range( 0, main.sampleSize + main.warmUp ):
             main.log.info( "==========================================" )
-            main.log.info( "================iteration:{}==============".format( str ( i + 1 ) ) )
+            main.log.info( "================iteration:{}==============".format( str( i + 1 ) ) )
             if i >= main.warmUp:
                 # Portdown iteration
                 main.portFunc.capturePortStatusPack( main,
@@ -185,7 +185,7 @@
                                                      True )
 
         # Dictionary for result
-        maxDict  = {}
+        maxDict = {}
         maxDict[ 'down' ] = {}
         maxDict[ 'up' ] = {}
         maxDict[ 'down' ][ 'max' ] = 0
diff --git a/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py b/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py
index f773da3..4c94193 100644
--- a/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py
+++ b/TestON/tests/SCPF/SCPFportLat/dependencies/portFunc.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,15 +18,13 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 import time
 import json
-'''
+"""
     Warp function for SCPFportLat test
-'''
-
+"""
 def capturePortStatusPack( main, deviceName, interface, portStatus, resultDict, warmup ):
-    '''
+    """
     Change device port status and use tshark to capture openflow port package
     Args:
         main: TestON class
@@ -36,10 +34,10 @@
         resultDict: put result to dictionary
         warmup: if warmup, ignore results
 
-    '''
+    """
     main.log.info( "Clean up tshark" )
     with open( main.tsharkResultPath, "w" ) as tshark:
-        tshark.write("")
+        tshark.write( "" )
     main.log.info( "Starting tshark capture" )
     main.ONOSbench.tsharkGrep( main.ofportStatus, main.tsharkResultPath )
     time.sleep( main.measurementSleep )
@@ -55,7 +53,7 @@
         main.log.info( "Capture result:" + resultText )
         resultText = resultText.split( " " )
         if len( resultText ) > 1:
-            tsharkResultTime = int( float( resultText[1] ) * 1000.0 )
+            tsharkResultTime = int( float( resultText[ 1 ] ) * 1000.0 )
             resultFile.close()
             for i in range( 1, main.Cluster.numCtrls + 1 ):
                 main.log.info( "================================================" )
@@ -92,9 +90,9 @@
                 else:
                     # put result to dictionary
                     if not warmup:
-                        resultDict[ portStatus ][ 'node' + str(i) ]['EtoE'].append( EtoE )
-                        resultDict[ portStatus ][ 'node' + str(i) ]['PtoD'].append( PtoD )
-                        resultDict[ portStatus ][ 'node' + str(i) ]['DtoL'].append( DtoL )
-                        resultDict[ portStatus ][ 'node' + str(i) ]['LtoG'].append( LtoG )
+                        resultDict[ portStatus ][ 'node' + str( i ) ][ 'EtoE' ].append( EtoE )
+                        resultDict[ portStatus ][ 'node' + str( i ) ][ 'PtoD' ].append( PtoD )
+                        resultDict[ portStatus ][ 'node' + str( i ) ][ 'DtoL' ].append( DtoL )
+                        resultDict[ portStatus ][ 'node' + str( i ) ][ 'LtoG' ].append( LtoG )
         else:
             main.log.error( "Unexpected tshark output file" )
diff --git a/TestON/tests/SCPF/SCPFportLat/dependencies/topo-perf-2sw.py b/TestON/tests/SCPF/SCPFportLat/dependencies/topo-perf-2sw.py
index 828e44a..7efed0c 100644
--- a/TestON/tests/SCPF/SCPFportLat/dependencies/topo-perf-2sw.py
+++ b/TestON/tests/SCPF/SCPFportLat/dependencies/topo-perf-2sw.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,18 +18,18 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
 Simple 2 switch topology for topologoy performance test
-'''
-
+"""
 from mininet.topo import Topo
 
+
 class MyTopo( Topo ):
-    def __init__(self):
-        Topo.__init__(self)
-        s1 = self.addSwitch( "s1", dpid="0000000000000001")
-        s2 = self.addSwitch( "s2", dpid="0000000000000002")
+
+    def __init__( self ):
+        Topo.__init__( self )
+        s1 = self.addSwitch( "s1", dpid="0000000000000001" )
+        s2 = self.addSwitch( "s2", dpid="0000000000000002" )
 
         h1 = self.addHost( "h1" )
         h2 = self.addHost( "h2" )
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py b/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py
index 0ecee0b..d4740f4 100644
--- a/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,10 +18,10 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # Testing network scalability, this test suite scales up a network topology
 # using mininet and verifies ONOS stability
 
+
 class SCPFscaleTopo:
 
     def __init__( self ):
@@ -81,19 +81,18 @@
             main.homeDir = os.path.expanduser( '~' )
             main.hostsData = {}
 
-
             stepResult = main.testSetUp.envSetup()
-            main.allinfo = {} # The dictionary to record all the data from karaf.log
+            main.allinfo = {}  # The dictionary to record all the data from karaf.log
 
             for i in range( 2 ):
-                main.allinfo[ i ]={}
-                for w in range ( 3 ):
+                main.allinfo[ i ] = {}
+                for w in range( 3 ):
                     # Totaltime: the time from the new switchConnection to its end
                     # swConnection: the time from the first new switchConnection to the last new switchConnection
                     # lastSwToLastRr: the time from the last new switchConnection to the last role request
                     # lastRrToLastTopology: the time form the last role request to the last topology
                     # disconnectRate: the rate that shows how many switch disconnect after connection
-                    main.allinfo[ i ][ 'info' + str( w ) ]= { 'totalTime': 0, 'swConnection': 0, 'lastSwToLastRr': 0, 'lastRrToLastTopology': 0, 'disconnectRate': 0 }
+                    main.allinfo[ i ][ 'info' + str( w ) ] = { 'totalTime': 0, 'swConnection': 0, 'lastSwToLastRr': 0, 'lastRrToLastTopology': 0, 'disconnectRate': 0 }
 
             main.dbFilePath = main.params[ 'DATABASE' ][ 'dbPath' ]
             main.log.info( "Create Database file " + main.dbFilePath )
@@ -149,20 +148,20 @@
         """
             Starting up torus topology
         """
-
         main.case( "Starting up Mininet and verifying topology" )
         main.caseExplanation = "Starting Mininet with a scalling topology and " +\
                 "comparing topology elements between Mininet and ONOS"
         if main.topoScale:
             main.currScale = main.topoScale.pop( 0 )
-        else: main.log.error( "topology scale is empty" )
+        else:
+            main.log.error( "topology scale is empty" )
         main.step( "Starting up TORUS %sx%s topology" % ( main.currScale, main.currScale ) )
 
         main.log.info( "Constructing Mininet command" )
         mnCmd = " mn --custom " + main.Mininet1.home + main.multiovs + \
                 " --switch ovsm --topo " + main.topoName + "," + main.currScale + "," + main.currScale
         for ctrl in main.Cluster.runningNodes:
-                mnCmd += " --controller remote,ip=" + ctrl.ipAddress
+            mnCmd += " --controller remote,ip=" + ctrl.ipAddress
         stepResult = main.Mininet1.startNet( mnCmd=mnCmd )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
@@ -226,7 +225,7 @@
         main.step( "Comparing MN topology to ONOS topology" )
         compareRetry = 0
         while compareRetry < 3:
-            #While loop for retry
+            # While loop for retry
             devices = main.topoRelated.getAll( "devices" )
             ports = main.topoRelated.getAll( "ports" )
             links = main.topoRelated.getAll( "links" )
@@ -240,8 +239,8 @@
                                                             devices, ports )
 
                 currentLinksResult = main.topoRelated.compareBase( links, controller,
-                                                        main.Mininet1.compareLinks,
-                                                        [ mnSwitches, mnLinks ] )
+                                                                   main.Mininet1.compareLinks,
+                                                                   [ mnSwitches, mnLinks ] )
 
                 stepResult = stepResult and currentDevicesResult and currentLinksResult
             if stepResult:
@@ -250,24 +249,24 @@
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass=" Topology match Mininet",
-                                 onfail="ONOS Topology doesn't match Mininet")
+                                 onfail="ONOS Topology doesn't match Mininet" )
 
         if stepResult:
             if main.hostDiscover:
                 hostList = []
                 for i in range( 1, int( main.currScale ) + 1 ):
-                    for j in range( 1, int( main.currScale ) + 1) :
+                    for j in range( 1, int( main.currScale ) + 1 ):
                         # Generate host list
-                        hoststr = "h" + str(i) + "x" + str(j)
-                        hostList.append(hoststr)
-                for i in range( len(hostList) ):
-                    totalHost = main.topo.sendArpPackage( main, hostList[i] )
+                        hoststr = "h" + str( i ) + "x" + str( j )
+                        hostList.append( hoststr )
+                for i in range( len( hostList ) ):
+                    totalHost = main.topo.sendArpPackage( main, hostList[ i ] )
                     time.sleep( main.hostDiscoverSleep )
                     if totalHost < 0:
                         # if totalHost less than 0 which means dependence function has exception.
                         main.log.info( "Error when discover host!" )
                         break
-                if totalHost == int( main.currScale ) *  int( main.currScale ):
+                if totalHost == int( main.currScale ) * int( main.currScale ):
                     main.log.info( "Discovered all hosts" )
                     stepResult = stepResult and main.TRUE
                 else:
@@ -276,18 +275,17 @@
                 utilities.assert_equals( expect=main.TRUE,
                                          actual=stepResult,
                                          onpass=" Topology match Mininet",
-                                         onfail="ONOS Topology doesn't match Mininet")
+                                         onfail="ONOS Topology doesn't match Mininet" )
             main.log.info( "Finished this iteration, continue to scale next topology." )
         else:
             main.log.info( "Clean up and exit TestON. Finished this test." )
             main.cleanAndExit()
 
     def CASE100( self, main ):
-        '''
+        """
            Bring Down node 3
-        '''
-
-        main.case("Bring ONOS node 3 down: TORUS %sx%s" % (main.currScale, main.currScale))
+        """
+        main.case( "Bring ONOS node 3 down: TORUS %sx%s" % ( main.currScale, main.currScale ) )
         main.caseExplanation = "Balance masters to make sure " +\
                         "each controller has some devices and " +\
                         "stop ONOS node 3 service. "
@@ -309,11 +307,10 @@
                                  onfail="Failed to bring down node 3" )
 
     def CASE200( self, main ):
-        '''
+        """
             Bring up onos node
-        '''
-
-        main.case("Bring ONOS node 3 up: TORUS %sx%s" % (main.currScale, main.currScale))
+        """
+        main.case( "Bring ONOS node 3 up: TORUS %sx%s" % ( main.currScale, main.currScale ) )
         main.caseExplanation = "Bring node 3 back up and balance the masters"
         ctrl = main.Cluster.runningNodes[ main.deadNode ]
         node = main.deadNode + 1
@@ -330,15 +327,13 @@
                                  onpass="Successfully brought up onos node %s" % node,
                                  onfail="Failed to bring up onos node %s" % node )
 
-
-        time.sleep(main.nodeSleep)
+        time.sleep( main.nodeSleep )
 
     def CASE300( self, main ):
-        '''
-
+        """
             Balancing Masters
-        '''
-        time.sleep(main.balanceSleep)
+        """
+        time.sleep( main.balanceSleep )
         main.step( "Balancing Masters" )
 
         stepResult = main.FALSE
@@ -353,56 +348,56 @@
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
                                  onpass="Balance masters was successfull",
-                                 onfail="Failed to balance masters")
+                                 onfail="Failed to balance masters" )
         time.sleep( main.balanceSleep )
 
     def CASE1000( self, main ):
-        '''
+        """
             Report errors/warnings/exceptions
-        '''
+        """
         # Compare the slowest Node through total time of each node
         slowestNode = 0
         slowestTotalTime = 0
         # Second capture
         for i in range( 3 ):
             # Calculate total time
-            main.allinfo[ 1 ][ 'info' + str( i )][ 'totalTime' ] = main.scaleTopoFunction.getInfoFromLog( main,
-                                                                                                          main.searchTerm[ 'start' ],
-                                                                                                          'first',
-                                                                                                          main.searchTerm[ 'end' ],
-                                                                                                          'last',
-                                                                                                          index=i,
-                                                                                                          funcMode='TD' )
+            main.allinfo[ 1 ][ 'info' + str( i ) ][ 'totalTime' ] = main.scaleTopoFunction.getInfoFromLog( main,
+                                                                                                           main.searchTerm[ 'start' ],
+                                                                                                           'first',
+                                                                                                           main.searchTerm[ 'end' ],
+                                                                                                           'last',
+                                                                                                           index=i,
+                                                                                                           funcMode='TD' )
             # Compare the total time
             if main.allinfo[ 1 ][ 'info' + str( i ) ][ 'totalTime' ] > slowestTotalTime:
                 slowestTotalTime = main.allinfo[ 1 ][ 'info' + str( i ) ][ 'totalTime' ]
                 slowestNode = i
             # Calculate switch connection time
-            main.allinfo[ 1 ][ 'info' + str( i )][ 'swConnection' ] = main.scaleTopoFunction.getInfoFromLog( main,
-                                                                                                             main.searchTerm[ 'start' ],
-                                                                                                             'first',
-                                                                                                             main.searchTerm[ 'start' ],
-                                                                                                             'last',
-                                                                                                             index=i,
-                                                                                                             funcMode='TD' )
+            main.allinfo[ 1 ][ 'info' + str( i ) ][ 'swConnection' ] = main.scaleTopoFunction.getInfoFromLog( main,
+                                                                                                              main.searchTerm[ 'start' ],
+                                                                                                              'first',
+                                                                                                              main.searchTerm[ 'start' ],
+                                                                                                              'last',
+                                                                                                              index=i,
+                                                                                                              funcMode='TD' )
             # Calculate the time from last switch connection to the last role request
-            main.allinfo[ 1 ][ 'info' + str( i )][ 'lastSwToLastRr' ] = main.scaleTopoFunction.compareTimeDiffWithRoleRequest( main,
-                                                                                                                               main.searchTerm[ 'start' ],
-                                                                                                                               'last',
-                                                                                                                               index=i )
+            main.allinfo[ 1 ][ 'info' + str( i ) ][ 'lastSwToLastRr' ] = main.scaleTopoFunction.compareTimeDiffWithRoleRequest( main,
+                                                                                                                                main.searchTerm[ 'start' ],
+                                                                                                                                'last',
+                                                                                                                                index=i )
             # Calculate the time from the last role request to the last topology
-            main.allinfo[ 1 ][ 'info' + str( i )][ 'lastRrToLastTopology' ] = main.scaleTopoFunction.compareTimeDiffWithRoleRequest( main,
-                                                                                                                                     main.searchTerm[ 'end' ],
-                                                                                                                                     'last',
-                                                                                                                                     index=i )
+            main.allinfo[ 1 ][ 'info' + str( i ) ][ 'lastRrToLastTopology' ] = main.scaleTopoFunction.compareTimeDiffWithRoleRequest( main,
+                                                                                                                                      main.searchTerm[ 'end' ],
+                                                                                                                                      'last',
+                                                                                                                                      index=i )
             # Calculate the disconnecti rate
-            main.allinfo[ 1 ][ 'info' + str( i )][ 'disconnectRate' ] = main.scaleTopoFunction.getInfoFromLog( main,
-                                                                                                               main.searchTerm[ 'Disconnect' ],
-                                                                                                               'num',
-                                                                                                               main.searchTerm[ 'start' ],
-                                                                                                               'num',
-                                                                                                               index=i,
-                                                                                                               funcMode='DR' )
+            main.allinfo[ 1 ][ 'info' + str( i ) ][ 'disconnectRate' ] = main.scaleTopoFunction.getInfoFromLog( main,
+                                                                                                                main.searchTerm[ 'Disconnect' ],
+                                                                                                                'num',
+                                                                                                                main.searchTerm[ 'start' ],
+                                                                                                                'num',
+                                                                                                                index=i,
+                                                                                                                funcMode='DR' )
 
         if ( main.allinfo[ 0 ] != main.allinfo[ 1 ] ):
             main.log.error( "The results of two capture are different!" )
@@ -414,11 +409,11 @@
                 temp = str( main.currScale )
                 temp += ",'baremetal1'"
                 # put result from second capture into data base
-                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode )][ 'totalTime' ] )
-                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode )][ 'swConnection' ] )
-                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode )][ 'lastSwToLastRr' ] )
-                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode )][ 'lastRrToLastTopology' ] )
-                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode )][ 'disconnectRate' ] )
+                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode ) ][ 'totalTime' ] )
+                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode ) ][ 'swConnection' ] )
+                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode ) ][ 'lastSwToLastRr' ] )
+                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode ) ][ 'lastRrToLastTopology' ] )
+                temp += "," + str( "%.2f" % main.allinfo[ 1 ][ 'info' + str( slowestNode ) ][ 'disconnectRate' ] )
                 temp += "\n"
                 dbFile.write( temp )
         else:
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/multiovs.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/multiovs.py
old mode 100755
new mode 100644
index 9849069..e15fe72
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/multiovs.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/multiovs.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Multiple ovsdb OVS!!
 
@@ -32,7 +31,6 @@
 delegated to the ovsdb instance.
 
 """
-
 from mininet.net import Mininet
 from mininet.node import Node, OVSSwitch
 from mininet.node import OVSBridge
@@ -46,7 +44,9 @@
 from itertools import groupby
 from operator import attrgetter
 
+
 class OVSDB( Node ):
+
     "Namespace for an OVSDB instance"
 
     privateDirs = [ '/etc/openvswitch',
@@ -70,7 +70,7 @@
             info( '### Adding NAT for control and data networks'
                   ' (use --nat flush=0 for data network)\n' )
             cls.cnet = cnet
-            cls.nat = cnet.addNAT( 'ovsdbnat0')
+            cls.nat = cnet.addNAT( 'ovsdbnat0' )
             cnet.start()
             info( '### Control network started\n' )
         return cnet
@@ -155,6 +155,7 @@
 
 
 class OVSSwitchNS( OVSSwitch ):
+
     "OVS Switch in shared OVSNS namespace"
 
     isSetup = False
@@ -162,7 +163,7 @@
     @classmethod
     def batchStartup( cls, switches ):
         result = []
-        for ovsdb, switchGroup in groupby( switches, attrgetter( 'ovsdb') ):
+        for ovsdb, switchGroup in groupby( switches, attrgetter( 'ovsdb' ) ):
             switchGroup = list( switchGroup )
             info( '(%s)' % ovsdb )
             result += OVSSwitch.batchStartup( switchGroup, run=ovsdb.cmd )
@@ -171,7 +172,7 @@
     @classmethod
     def batchShutdown( cls, switches ):
         result = []
-        for ovsdb, switchGroup in groupby( switches, attrgetter( 'ovsdb') ):
+        for ovsdb, switchGroup in groupby( switches, attrgetter( 'ovsdb' ) ):
             switchGroup = list( switchGroup )
             info( '(%s)' % ovsdb )
             for switch in switches:
@@ -214,7 +215,7 @@
             # Delegate methods and initialize local vars
             attrs = ( 'cmd', 'cmdPrint', 'sendCmd', 'waitOutput',
                       'monitor', 'write', 'read',
-                      'pid', 'shell', 'stdout',)
+                      'pid', 'shell', 'stdout', )
             for attr in attrs:
                 setattr( self, attr, getattr( ovsdb, attr ) )
         self.defaultIntf().updateIP()
@@ -246,14 +247,14 @@
             super( OVSSwitchNS, self ).terminate( *args, **kwargs )
         else:
             self.pid = None
-            self.shell= None
+            self.shell = None
 
     def defaultIntf( self ):
         return self.ovsdb.defaultIntf()
 
     def __init__( self, *args, **kwargs ):
         """n: number of OVS instances per OVSDB
-           shell: run private shell/bash process? (False)
+           shell: run private shell/bash process? ( False )
            If shell is shared/not private, cmd() and popen() are
            delegated to the OVSDB instance, which is different than
            regular OVSSwitch semantics!!"""
@@ -261,7 +262,9 @@
         self.privateShell = kwargs.pop( 'shell', False )
         super( OVSSwitchNS, self ).__init__( *args, **kwargs )
 
+
 class OVSLinkNS( Link ):
+
     "OVSLink that supports OVSSwitchNS"
 
     def __init__( self, node1, node2, **kwargs ):
@@ -279,6 +282,7 @@
 
 links = { 'ovs': OVSLinkNS }
 
+
 def test():
     "Test OVSNS switch"
     setLogLevel( 'info' )
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/newFuncTopo.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/newFuncTopo.py
old mode 100755
new mode 100644
index 1f1c487..596ff2c
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/newFuncTopo.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/newFuncTopo.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Custom topology for Mininet
 """
@@ -35,19 +34,23 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class VLANHost( Host ):
+
     def config( self, vlan=100, **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ifconfig %s inet 0' % intf )
         self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
-        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params[ 'ip' ] ) )
         newName = '%s.%d' % ( intf, vlan )
         intf.name = newName
         self.nameToIntf[ newName ] = intf
         return r
 
+
 class IPv6Host( Host ):
+
     def config( self, v6Addr='1000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
@@ -55,56 +58,59 @@
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class dualStackHost( Host ):
+
     def config( self, v6Addr='2000:1/64', **params ):
         r = super( Host, self ).config( **params )
         intf = self.defaultIntf()
         self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
         return r
 
+
 class MyTopo( Topo ):
 
     def __init__( self ):
         # Initialize topology
         Topo.__init__( self )
         # Switch S5 Hosts
-        host1=self.addHost( 'h1', ip='10.1.0.2/24' )
-        host2=self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
-        host3=self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
-        #VLAN hosts
-        host4=self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
-        host5=self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host6=self.addHost( 'h6', ip='11.1.0.2/24' )
-        host7=self.addHost( 'h7', ip='12.1.0.2/24' )
-        #Multicast Sender
-        host8=self.addHost( 'h8', ip='10.1.0.4/24' )
+        host1 = self.addHost( 'h1', ip='10.1.0.2/24' )
+        host2 = self.addHost( 'h2', cls=IPv6Host, v6Addr='1000::2/64' )
+        host3 = self.addHost( 'h3', ip='10.1.0.3/24', cls=dualStackHost, v6Addr='2000::2/64' )
+        # VLAN hosts
+        host4 = self.addHost( 'h4', ip='100.1.0.2/24', cls=VLANHost, vlan=100 )
+        host5 = self.addHost( 'h5', ip='200.1.0.2/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host6 = self.addHost( 'h6', ip='11.1.0.2/24' )
+        host7 = self.addHost( 'h7', ip='12.1.0.2/24' )
+        # Multicast Sender
+        host8 = self.addHost( 'h8', ip='10.1.0.4/24' )
 
         # Switch S6 Hosts
-        host9=self.addHost( 'h9', ip='10.1.0.5/24' )
-        host10=self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
-        host11=self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
-        #VLAN hosts
-        host12=self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
-        host13=self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host14=self.addHost( 'h14', ip='11.1.0.3/24' )
-        host15=self.addHost( 'h15', ip='12.1.0.3/24' )
-        #Multicast Receiver
-        host16=self.addHost( 'h16', ip='10.1.0.7/24' )
+        host9 = self.addHost( 'h9', ip='10.1.0.5/24' )
+        host10 = self.addHost( 'h10', cls=IPv6Host, v6Addr='1000::3/64' )
+        host11 = self.addHost( 'h11', ip='10.1.0.6/24', cls=dualStackHost, v6Addr='2000::3/64' )
+        # VLAN hosts
+        host12 = self.addHost( 'h12', ip='100.1.0.3/24', cls=VLANHost, vlan=100 )
+        host13 = self.addHost( 'h13', ip='200.1.0.3/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host14 = self.addHost( 'h14', ip='11.1.0.3/24' )
+        host15 = self.addHost( 'h15', ip='12.1.0.3/24' )
+        # Multicast Receiver
+        host16 = self.addHost( 'h16', ip='10.1.0.7/24' )
 
         # Switch S7 Hosts
-        host17=self.addHost( 'h17', ip='10.1.0.8/24' )
-        host18=self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
-        host19=self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
-        #VLAN hosts
-        host20=self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
-        host21=self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
-        #VPN-1 and VPN-2 Hosts
-        host22=self.addHost( 'h22', ip='11.1.0.4/24' )
-        host23=self.addHost( 'h23', ip='12.1.0.4/24' )
-        #Multicast Receiver
-        host24=self.addHost( 'h24', ip='10.1.0.10/24' )
+        host17 = self.addHost( 'h17', ip='10.1.0.8/24' )
+        host18 = self.addHost( 'h18', cls=IPv6Host, v6Addr='1000::4/64' )
+        host19 = self.addHost( 'h19', ip='10.1.0.9/24', cls=dualStackHost, v6Addr='2000::4/64' )
+        # VLAN hosts
+        host20 = self.addHost( 'h20', ip='100.1.0.4/24', cls=VLANHost, vlan=100 )
+        host21 = self.addHost( 'h21', ip='200.1.0.4/24', cls=VLANHost, vlan=200 )
+        # VPN-1 and VPN-2 Hosts
+        host22 = self.addHost( 'h22', ip='11.1.0.4/24' )
+        host23 = self.addHost( 'h23', ip='12.1.0.4/24' )
+        # Multicast Receiver
+        host24 = self.addHost( 'h24', ip='10.1.0.10/24' )
 
         s1 = self.addSwitch( 's1' )
         s2 = self.addSwitch( 's2' )
@@ -114,56 +120,57 @@
         s6 = self.addSwitch( 's6' )
         s7 = self.addSwitch( 's7' )
 
-        self.addLink(s5,host1)
-        self.addLink(s5,host2)
-        self.addLink(s5,host3)
-        self.addLink(s5,host4)
-        self.addLink(s5,host5)
-        self.addLink(s5,host6)
-        self.addLink(s5,host7)
-        self.addLink(s5,host8)
+        self.addLink( s5, host1 )
+        self.addLink( s5, host2 )
+        self.addLink( s5, host3 )
+        self.addLink( s5, host4 )
+        self.addLink( s5, host5 )
+        self.addLink( s5, host6 )
+        self.addLink( s5, host7 )
+        self.addLink( s5, host8 )
 
-        self.addLink(s6,host9)
-        self.addLink(s6,host10)
-        self.addLink(s6,host11)
-        self.addLink(s6,host12)
-        self.addLink(s6,host13)
-        self.addLink(s6,host14)
-        self.addLink(s6,host15)
-        self.addLink(s6,host16)
+        self.addLink( s6, host9 )
+        self.addLink( s6, host10 )
+        self.addLink( s6, host11 )
+        self.addLink( s6, host12 )
+        self.addLink( s6, host13 )
+        self.addLink( s6, host14 )
+        self.addLink( s6, host15 )
+        self.addLink( s6, host16 )
 
-        self.addLink(s7,host17)
-        self.addLink(s7,host18)
-        self.addLink(s7,host19)
-        self.addLink(s7,host20)
-        self.addLink(s7,host21)
-        self.addLink(s7,host22)
-        self.addLink(s7,host23)
-        self.addLink(s7,host24)
+        self.addLink( s7, host17 )
+        self.addLink( s7, host18 )
+        self.addLink( s7, host19 )
+        self.addLink( s7, host20 )
+        self.addLink( s7, host21 )
+        self.addLink( s7, host22 )
+        self.addLink( s7, host23 )
+        self.addLink( s7, host24 )
 
-        self.addLink(s1,s2)
-        self.addLink(s1,s3)
-        self.addLink(s1,s4)
-        self.addLink(s1,s5)
-        self.addLink(s2,s3)
-        self.addLink(s2,s5)
-        self.addLink(s2,s6)
-        self.addLink(s3,s4)
-        self.addLink(s3,s6)
-        self.addLink(s4,s7)
+        self.addLink( s1, s2 )
+        self.addLink( s1, s3 )
+        self.addLink( s1, s4 )
+        self.addLink( s1, s5 )
+        self.addLink( s2, s3 )
+        self.addLink( s2, s5 )
+        self.addLink( s2, s6 )
+        self.addLink( s3, s4 )
+        self.addLink( s3, s6 )
+        self.addLink( s4, s7 )
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py
index ae30723..7620354 100644
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
     Wrapper function for FuncTopo
     Includes onosclidriver and mininetclidriver functions
@@ -27,13 +26,15 @@
 import json
 import re
 
+
 def __init__( self ):
     self.default = ''
 
+
 def getTimestampFromString( main, targetString ):
-    #Get time string from the target string
+    # Get time string from the target string
     try:
-        assert type( targetString ) is str
+        assert isinstance( targetString, str )
         timeString = targetString.split( ' | ' )
         timeString = timeString[ 0 ]
         from datetime import datetime
@@ -53,10 +54,11 @@
         main.log.error( "Got wrong string from log" )
         return -1
 
+
 def getRoleRequestTimeFromTshark( main ):
     try:
         main.log.info( "Get role request time" )
-        with open(main.tsharkResultPath, "r" ) as resultFile:
+        with open( main.tsharkResultPath, "r" ) as resultFile:
             resultText = resultFile.readlines()
             # select the last role request string
             roleRequestString = resultText[ len( resultText ) - 1 ]
@@ -64,18 +66,19 @@
             # get timestamp from role request string
             roleRequestTime = roleRequestString.split( " " )
             resultFile.close()
-            return float(roleRequestTime[1])
+            return float( roleRequestTime[ 1 ] )
     except IndexError:
-        main.log.error("Got wrong role request string from Tshark file")
+        main.log.error( "Got wrong role request string from Tshark file" )
         return -1
 
-def compareTimeDiffWithRoleRequest(main, term, Mode, index=0 ):
-    '''
+
+def compareTimeDiffWithRoleRequest( main, term, Mode, index=0 ):
+    """
     Description:
         Compare the time difference between the time of target term and the time of role request
         Inclides onosclidriver functions
 
-    '''
+    """
     try:
         termInfo = main.Cluster.active( index ).CLI.logSearch( mode=Mode, searchTerm=term )
         termTime = getTimestampFromString( main, termInfo[ 0 ] )
@@ -91,37 +94,38 @@
         main.writeData = -1
         return -1
 
+
 def getInfoFromLog( main, term1, mode1, term2, mode2, index=0, funcMode='TD' ):
-    '''
+    """
     Description:
         Get needed informations of the search term from karaf.log
         Includes onosclidriver functions
     Function mode:
-        TD (time difference):
+        TD ( time difference ):
             Get time difference between start and end
             Term1: startTerm
             Term2: endTerm
-        DR (disconnect rate):
+        DR ( disconnect rate ):
             Get switch disconnect rate
             Term1: disconnectTerm
             Term2: connectTerm
 
-    '''
+    """
     try:
         termInfo1 = main.Cluster.active( index ).CLI.logSearch( mode=mode1, searchTerm=term1 )
         termInfo2 = main.Cluster.active( index ).CLI.logSearch( mode=mode2, searchTerm=term2 )
         if funcMode == 'TD':
-            startTime = getTimestampFromString( main, termInfo1[0] )
-            endTime = getTimestampFromString ( main, termInfo2[0] )
+            startTime = getTimestampFromString( main, termInfo1[ 0 ] )
+            endTime = getTimestampFromString( main, termInfo2[ 0 ] )
             if startTime == -1 or endTime == -1:
                 main.log.error( "Wrong Time!" )
                 main.writeData = -1
                 return -1
             return endTime - startTime
         if funcMode == 'DR':
-            #In this mode, termInfo1 means the total number of switch disconnection and
-            #termInfo2 means the total number of new switch connection
-            #termInfo2 - termInfo1 means the actual real number of switch connection.
+            # In this mode, termInfo1 means the total number of switch disconnection and
+            # termInfo2 means the total number of new switch connection
+            # termInfo2 - termInfo1 means the actual real number of switch connection.
             disconnection = int( termInfo1 ) * 1.0
             expectConnection = int( main.currScale ) ** 2
             realConnection = int( termInfo2 ) - int( termInfo1 )
@@ -136,6 +140,7 @@
         main.writeData = -1
         return -1
 
+
 def testTopology( main, topoFile='', args='', mnCmd='', timeout=300, clean=True ):
     """
     Description:
@@ -173,16 +178,16 @@
     # Starts topology
     startResult = startNewTopology( main, topoFile, args, mnCmd, timeout=timeout )
     # onos needs time to see the links
-    time.sleep(15)
+    time.sleep( 15 )
 
     # Gets list of switches in mininet
-    #assignSwitch( main )
+    # assignSwitch( main )
 
     testTopoResult = startResult and topoObjectResult
 
-
     return testTopoResult
 
+
 def startNewTopology( main, topoFile='', args='', mnCmd='', timeout=900 ):
     """
     Description:
@@ -215,14 +220,14 @@
         main.log.info( main.topoName + ": Starting topology with '" +
                        mnCmd + "' Mininet command" )
 
-
     result = main.Mininet1.startNet( topoFile=topoFile,
                                      args=args,
                                      mnCmd=mnCmd,
-                                     timeout=timeout)
+                                     timeout=timeout )
 
     return result
 
+
 def stopMininet( main ):
     """
         Stops current topology and execute mn -c basically triggers
@@ -235,9 +240,10 @@
     stopResult = main.Mininet1.stopNet()
     time.sleep( 30 )
     if not stopResult:
-        main.log.info(  main.topoName + ": Did not stop Mininet topology" )
+        main.log.info( main.topoName + ": Did not stop Mininet topology" )
     return stopResult
 
+
 def compareTopo( main ):
     """
         Compare topology( devices, links, ports, hosts ) between ONOS and
@@ -254,13 +260,14 @@
         main.topoRelated = Topology()
     return main.topoRelated.compareTopos( main.Mininet1 )
 
+
 def assignSwitch( main ):
     """
         Returns switch list using getSwitch in Mininet driver
     """
     switchList = []
     assignResult = main.TRUE
-    switchList =  main.Mininet1.getSwitch()
+    switchList = main.Mininet1.getSwitch()
     assignResult = main.Mininet1.assignSwController( sw=switchList,
                                                      ip=main.Cluster.active( 0 ).ipAddress,
                                                      port=6633 )
@@ -274,6 +281,7 @@
 
     return switchList
 
+
 def connectivity( main, timeout=900, shortCircuit=True, acceptableFailed=20 ):
     """
         Use fwd app and pingall to discover all the hosts
@@ -309,6 +317,7 @@
 
     return pingResult
 
+
 def getHostsData( main ):
     """
         Use fwd app and pingall to discover all the hosts
@@ -369,6 +378,7 @@
 
     return getDataResult
 
+
 def reinstallOnos( main ):
     """
     Description:
@@ -422,8 +432,4 @@
     if cliResult != main.TRUE:
         restartResult = main.FALSE
 
-
     return restartResult
-
-
-
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/spine.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/spine.py
index 973385a..32c8419 100644
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/spine.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/spine.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Custom topology for Mininet
 Author: kelvin@onlab.us
@@ -45,7 +44,9 @@
 totalSwitches = 0
 totalEndSwitches = 0
 totalHosts = 0
-endSwitchCount = 0 # total count of end switch in each row in gui
+endSwitchCount = 0  # total count of end switch in each row in gui
+
+
 class spineTopo( Topo ):
 
     def __init__( self, **opts ):
@@ -71,8 +72,8 @@
         global endSwitchCount
         endSwitchCount = e
 
-        print "Creating topology with", s,"spine", l,"leaf", c,"core",\
-                e,"end switches and",h,"host for each end switches"
+        print "Creating topology with", s, "spine", l, "leaf", c, "core",\
+                e, "end switches and", h, "host for each end switches"
 
         self.addCore( c )
         self.addSpine( s )
@@ -89,7 +90,6 @@
         deviceData = self.createSwitchDict()
         self.genCfgJson( deviceData )
 
-
     def addCore( self, numSwitch ):
         global totalSwitches
         global coreSwitches
@@ -134,7 +134,6 @@
 
         return host
 
-
     def linkHosts( self, numHosts ):
         global endSwitches
         switches = sorted( endSwitches.values() )
@@ -143,7 +142,6 @@
             for i in xrange( numHosts ):
                 self.addLink( sw, self.addEndHosts() )
 
-
     def linkLayer( self, topLayer, botLayer ):
         """
         Description:
@@ -156,7 +154,6 @@
                        layer below
             botLater - Layer that is below the upper layer to be linked at
         """
-
         topSwitches = sorted( topLayer.keys() )
         botSwitches = sorted( botLayer.keys() )
 
@@ -164,7 +161,6 @@
             for botSw in botSwitches:
                 self.addLink( topLayer.get( topSw ), botLayer.get( botSw ) )
 
-
     def linkEndSwitch( self, numSwitch, leafLayer ):
         global totalSwitches
         global totalEndSwitches
@@ -182,7 +178,7 @@
                     self.addLink( leaf[ i ], endSw )
                     self.addLink( leaf[ i + 1 ], endSw )
                 break
-            if i == ( len( leafSwitches ) - 1 ) and len( leafSwitches )%2:
+            if i == ( len( leafSwitches ) - 1 ) and len( leafSwitches ) % 2:
                 for j in xrange( numSwitch ):
                     self.addLink( leaf[ i ], self.addEnd() )
                 break
@@ -194,7 +190,7 @@
                 continue
             if i == 1:
                 continue
-            if i%2 == 0:
+            if i % 2 == 0:
                 for j in xrange( numSwitch ):
                     endSw = self.addEnd()
                     self.addLink( leaf[ i ], endSw )
@@ -206,11 +202,9 @@
         configJson[ "devices" ] = deviceData
         with open( 'spine.json', 'w+' ) as outfile:
             json.dump( configJson, outfile )
-        #cfgFile = open( "spine.json" , 'w+' )
-        #cfgFile.write( configJson )
-        #cfgFile.close()
-
-
+        # cfgFile = open( "spine.json" , 'w+' )
+        # cfgFile.write( configJson )
+        # cfgFile.close()
 
     def createSwitchDict( self ):
         global allSwitches
@@ -222,18 +216,18 @@
         spineLong = -80
         leafLong = -90
         endLat = 30
-        rowCount = 0 # count of end switches or rows
-        colOffSet = 0 # off set for end switches; longitude
+        rowCount = 0  # count of end switches or rows
+        colOffSet = 0  # off set for end switches; longitude
 
-        #for i in xrange( len( allSwitches ) ):
+        # for i in xrange( len( allSwitches ) ):
         deviceList = []
         deviceDict = {}
         for sw in allSwitches:
             tempSw = allSwitches.get( sw )
-            uri = str( "{0:0>16}".format( str( hex( int( tempSw[ 1: ] ) )\
-                            ).split( "x" )[ 1 ] ) )
-            mac = str( "{0:0>12}".format( str( hex( int( tempSw[ 1: ] ) )\
-                            ).split( "x" )[ 1 ] ) )
+            uri = str( "{0:0>16}".format( str( hex( int( tempSw[ 1: ] ) )
+                                               ).split( "x" )[ 1 ] ) )
+            mac = str( "{0:0>12}".format( str( hex( int( tempSw[ 1: ] ) )
+                                               ).split( "x" )[ 1 ] ) )
 
             if "core" in sw:
                 latitude = 45
@@ -259,7 +253,7 @@
                 endLat -= 1
                 rowCount += 1
 
-            tempItem = { "alias": allSwitches.get( sw ) ,
+            tempItem = { "alias": allSwitches.get( sw ),
                          "uri": "of:" + uri,
                          "mac": mac,
                          "annotations": { "name": sw,
@@ -269,21 +263,22 @@
             deviceList.append( tempItem )
 
         return deviceList
-    #def createHostsJson( hostDict ):
+    # def createHostsJson( hostDict ):
 
 topos = { 'spine': ( lambda s=2, l=3, c=1, e=5, h=1: spineTopo( s=s,
                                                                 l=l,
                                                                 c=c,
                                                                 e=e,
-                                                                h=h) ) }
+                                                                h=h ) ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = spineTopo()
-    #if controller_ip == '':
-        #controller_ip = '10.0.2.2';
+    # if controller_ip == '':
+    # controller_ip = '10.0.2.2';
     #    controller_ip = '127.0.0.1';
     network = Mininet( topo=topo,
                        autoSetMacs=True,
@@ -294,5 +289,5 @@
 
 if __name__ == '__main__':
     setLogLevel( 'info' )
-    #setLogLevel('debug')
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/topo.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/topo.py
index c5c1f88..373ed2b 100644
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/topo.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/topo.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,15 +18,14 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
     These functions can be used for topology comparisons
 """
-
 import time
 import os
 import json
 
+
 def sendArpPackage( main, hostList ):
     import json
     import time
@@ -35,10 +34,10 @@
         return the total hosts number from Onos
     """
     main.log.info( "Sending Arping package..." )
-    if isinstance(hostList, list):
+    if isinstance( hostList, list ):
         for h in hostList:
             main.Mininet1.arping( srcHost=h, dstHost="10.0.0.1", output=main.FALSE, noResult=True )
-            time.sleep(0.5)
+            time.sleep( 0.5 )
     else:
         main.Mininet1.arping( srcHost=hostList, dstHost="10.0.0.1", output=main.FALSE, noResult=True )
     try:
@@ -46,8 +45,8 @@
         summaryStr = json.loads( main.Cluster.active( 0 ).CLI.summary().encode() )
         hostNum = summaryStr.get( 'hosts' )
 
-    except (TypeError, ValueError):
-        main.log.exception( " Object not as expected: {!r}".format( summaryStr) )
+    except ( TypeError, ValueError ):
+        main.log.exception( " Object not as expected: {!r}".format( summaryStr ) )
         return -1
     except Exception:
         main.log.exception( self.name + ": Uncaught exception!" )
diff --git a/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py b/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py
index 9ee512c..1633c44 100644
--- a/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py
+++ b/TestON/tests/SCPF/SCPFscalingMaxIntents/SCPFscalingMaxIntents.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,12 +18,11 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 import sys
 import json
 import time
 import os
-'''
+"""
 SCPFscalingMaxIntents
 Push test Intents to onos
 CASE10: set up Null Provider
@@ -31,8 +30,9 @@
 Check flows number, if flows number is not as except, finished this test iteration
 Scale up when reach the Limited
 Start from 1 nodes, 8 devices. Then Scale up to 3,5,7 nodes
-'''
+"""
 class SCPFscalingMaxIntents:
+
     def __init__( self ):
         self.default = ''
 
@@ -63,7 +63,7 @@
             main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
             main.installSleep = int( main.params[ 'SLEEP' ][ 'install' ] )
             main.verifySleep = int( main.params[ 'SLEEP' ][ 'verify' ] )
-            main.rerouteSleep = int ( main.params[ 'SLEEP' ][ 'reroute' ] )
+            main.rerouteSleep = int( main.params[ 'SLEEP' ][ 'reroute' ] )
             main.intentConfigRegiCfg = main.params[ 'CFG' ][ 'intentConfigRegi' ]
             main.nullProviderCfg = main.params[ 'CFG' ][ 'nullProvider' ]
             main.linkCollectionIntentCfg = main.params[ 'CFG' ][ 'linkCollectionIntent' ]
@@ -97,6 +97,7 @@
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
         main.commit = main.commit.split( " " )[ 1 ]
+
     def CASE1( self ):
         copyResult = main.ONOSbench.copyMininetFile( main.topology,
                                                      main.dependencyPath,
@@ -133,25 +134,24 @@
         # Setup the null-provider
         main.step( "Configuring null-provider" )
         cfgStatus = utilities.retry( main.ONOSbench.onosCfgSet,
-                                    main.FALSE,
-                                    [ main.Cluster.active( 0 ).ipAddress,
-                                      main.nullProviderCfg, 'deviceCount 8' ],
-                                    sleep=main.verifySleep,
-                                    attempts = main.verifyAttempts )
+                                     main.FALSE,
+                                     [ main.Cluster.active( 0 ).ipAddress,
+                                       main.nullProviderCfg, 'deviceCount 8' ],
+                                     sleep=main.verifySleep,
+                                     attempts=main.verifyAttempts )
         cfgStatus = cfgStatus and utilities.retry( main.ONOSbench.onosCfgSet,
                                                    main.FALSE,
                                                    [ main.Cluster.active( 0 ).ipAddress,
                                                      main.nullProviderCfg, 'topoShape reroute' ],
                                                    sleep=main.verifySleep,
-                                                   attempts = main.verifyAttempts )
+                                                   attempts=main.verifyAttempts )
 
         cfgStatus = cfgStatus and utilities.retry( main.ONOSbench.onosCfgSet,
                                                    main.FALSE,
                                                    [ main.Cluster.active( 0 ).ipAddress,
                                                      main.nullProviderCfg, 'enabled true' ],
                                                    sleep=main.verifySleep,
-                                                   attempts = main.verifyAttempts )
-
+                                                   attempts=main.verifyAttempts )
 
         utilities.assert_equals( expect=main.TRUE,
                                  actual=cfgStatus,
@@ -197,9 +197,9 @@
             main.setupSkipped = True
 
     def CASE11( self, main ):
-        '''
+        """
             Setting up mininet
-        '''
+        """
         import json
         import time
         devices = []
@@ -210,10 +210,10 @@
         time.sleep( main.startUpSleep )
         if main.flowObj:
             main.Cluster.active( 0 ).CLI.setCfg( main.intentConfigRegiCfg,
-                                "useFlowObjectives", value="true" )
+                                                 "useFlowObjectives", value="true" )
             main.Cluster.active( 0 ).CLI.setCfg( main.intentConfigRegiCfg,
-                                "defaultFlowObjectiveCompiler",
-                                value=main.linkCollectionIntentCfg )
+                                                 "defaultFlowObjectiveCompiler",
+                                                 value=main.linkCollectionIntentCfg )
         main.step( 'Starting mininet topology' )
         mnStatus = main.Mininet1.startNet( topoFile='~/mininet/custom/rerouteTopo.py' )
         utilities.assert_equals( expect=main.TRUE,
@@ -277,8 +277,6 @@
         if not caseResult:
             main.setupSkipped = True
 
-
-
     def CASE20( self, main ):
         try:
             from tests.dependencies.utils import Utils
@@ -330,9 +328,9 @@
 
         # make sure the checkInterval divisible batchSize
         main.checkInterval = int( int( main.checkInterval / main.batchSize ) * main.batchSize )
-        flowTemp=0
+        flowTemp = 0
         intentVerifyTemp = 0
-        totalFlows=0
+        totalFlows = 0
         for i in range( limit ):
 
             # Threads pool
@@ -352,8 +350,8 @@
                                  kwargs={ "offset": offtmp,
                                           "options": "-i",
                                           "timeout": main.timeout,
-                                          "background":False,
-                                          "noExit":True } )
+                                          "background": False,
+                                          "noExit": True } )
                 pool.append( t )
                 t.start()
                 main.threadID = main.threadID + 1
@@ -420,10 +418,10 @@
                     main.log.info( "Total Intents: {}".format( verifyTotalIntents ) )
                     break
 
-        utilities.assert_equals( expect = main.TRUE,
-                                 actual = intentsState,
-                                 onpass = "Successfully pushed and verified intents",
-                                 onfail = "Failed to push and verify intents" )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=intentsState,
+                                 onpass="Successfully pushed and verified intents",
+                                 onfail="Failed to push and verify intents" )
 
         main.log.info( "Total Intents Installed before crash: {}".format( totalIntents ) )
         main.log.info( "Total Flows ADDED before crash: {}".format( totalFlows ) )
diff --git a/TestON/tests/SCPF/SCPFscalingMaxIntents/dependencies/rerouteTopo.py b/TestON/tests/SCPF/SCPFscalingMaxIntents/dependencies/rerouteTopo.py
old mode 100755
new mode 100644
index dace730..a5336f0
--- a/TestON/tests/SCPF/SCPFscalingMaxIntents/dependencies/rerouteTopo.py
+++ b/TestON/tests/SCPF/SCPFscalingMaxIntents/dependencies/rerouteTopo.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Custom topology for Mininet
 """
@@ -34,19 +33,20 @@
 from mininet.util import dumpNodeConnections
 from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
 
+
 class MyTopo( Topo ):
 
     def __init__( self ):
         # Initialize topology
         Topo.__init__( self )
 
-        host1 = self.addHost('h1', ip='10.1.0.1/24')
-        host2 = self.addHost('h2', ip='10.1.0.2/24')
-        host3 = self.addHost('h3', ip='10.1.0.3/24')
-        host4 = self.addHost('h4', ip='10.1.0.4/24')
-        host5 = self.addHost('h5', ip='10.1.0.5/24')
-        host6 = self.addHost('h6', ip='10.1.0.6/24')
-        host7 = self.addHost('h7', ip='10.1.0.7/24')
+        host1 = self.addHost( 'h1', ip='10.1.0.1/24' )
+        host2 = self.addHost( 'h2', ip='10.1.0.2/24' )
+        host3 = self.addHost( 'h3', ip='10.1.0.3/24' )
+        host4 = self.addHost( 'h4', ip='10.1.0.4/24' )
+        host5 = self.addHost( 'h5', ip='10.1.0.5/24' )
+        host6 = self.addHost( 'h6', ip='10.1.0.6/24' )
+        host7 = self.addHost( 'h7', ip='10.1.0.7/24' )
 
         s1 = self.addSwitch( 's1' )
         s2 = self.addSwitch( 's2' )
@@ -57,39 +57,37 @@
         s7 = self.addSwitch( 's7' )
         s8 = self.addSwitch( 's8' )
 
+        self.addLink( s1, host1 )
+        self.addLink( s2, host2 )
+        self.addLink( s3, host3 )
+        self.addLink( s4, host4 )
+        self.addLink( s5, host5 )
+        self.addLink( s6, host6 )
+        self.addLink( s7, host7 )
 
-        self.addLink(s1, host1)
-        self.addLink(s2, host2)
-        self.addLink(s3, host3)
-        self.addLink(s4, host4)
-        self.addLink(s5, host5)
-        self.addLink(s6, host6)
-        self.addLink(s7, host7)
-
-
-
-        self.addLink(s1,s2)
-        self.addLink(s2,s3)
-        self.addLink(s3,s4)
-        self.addLink(s4,s5)
-        self.addLink(s5,s6)
-        self.addLink(s6,s7)
-        self.addLink(s4,s8)
-        self.addLink(s8,s5)
+        self.addLink( s1, s2 )
+        self.addLink( s2, s3 )
+        self.addLink( s3, s4 )
+        self.addLink( s4, s5 )
+        self.addLink( s5, s6 )
+        self.addLink( s6, s7 )
+        self.addLink( s4, s8 )
+        self.addLink( s8, s5 )
 
         topos = { 'mytopo': ( lambda: MyTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
+
 def setupNetwork():
     "Create network"
     topo = MyTopo()
-    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network = Mininet( topo=topo, autoSetMacs=True, controller=None )
     network.start()
     CLI( network )
     network.stop()
 
 if __name__ == '__main__':
-    setLogLevel('info')
-    #setLogLevel('debug')
+    setLogLevel( 'info' )
+    # setLogLevel( 'debug' )
     setupNetwork()
diff --git a/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.py b/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.py
index 66b3dc0..fa168f6 100644
--- a/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.py
+++ b/TestON/tests/SCPF/SCPFswitchLat/SCPFswitchLat.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,8 +18,7 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
     SCPFswitchLat
     Test Switch add/remove latency
     calculate package latency between switch and ONOS
@@ -27,8 +26,7 @@
     TCP -- Feature Reply -- Role Request -- Role Reply -- Device -- Graph
     Siwtch Down:
     Openflow FIN/ACK -- ACK -- Device -- Graph
-'''
-
+"""
 class SCPFswitchLat:
 
     def __init__( self ):
@@ -37,7 +35,7 @@
     def CASE0( self, main ):
         import os
         import imp
-        '''
+        """
         - GIT
         - BUILDING ONOS
             Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
@@ -45,7 +43,7 @@
             test env. We want Jenkins jobs to pull&build for flexibility to handle
             different versions of ONOS.
         - Construct tests variables
-        '''
+        """
         try:
             from tests.dependencies.ONOSSetup import ONOSSetup
             main.testSetUp = ONOSSetup()
@@ -56,10 +54,10 @@
         stepResult = main.FALSE
         try:
             # The dictionary to record different type of wrongs
-            main.wrong = { 'totalWrong': 0, 'skipDown' : 0, 'TsharkValueIncorrect': 0,
-                    'TypeError' : 0, 'decodeJasonError': 0,
-                    'checkResultIncorrect': 0 }
-            main.maxWrong = int( main.params[ 'TEST' ] [ 'MaxWrong' ] )
+            main.wrong = { 'totalWrong': 0, 'skipDown': 0, 'TsharkValueIncorrect': 0,
+                           'TypeError': 0, 'decodeJasonError': 0,
+                           'checkResultIncorrect': 0 }
+            main.maxWrong = int( main.params[ 'TEST' ][ 'MaxWrong' ] )
             main.resultRange = main.params[ 'TEST' ][ 'ResultRange' ]
             main.searchTerm = main.params[ 'TEST' ][ 'SearchTerm' ]
             main.MN1Ip = main.params[ 'MN' ][ 'ip1' ]
@@ -72,7 +70,7 @@
             main.scale = ( main.params[ 'SCALE' ] ).split( "," )
 
             main.ofPackage = main.params[ 'TSHARK' ]
-            main.defaultTopoCfg = main.params [ 'CFG' ][ 'defaultTopo' ]
+            main.defaultTopoCfg = main.params[ 'CFG' ][ 'defaultTopo' ]
             main.tsharkResultPath = main.params[ 'TEST' ][ 'tsharkResultPath' ]
             main.sampleSize = int( main.params[ 'TEST' ][ 'sampleSize' ] )
             main.warmUp = int( main.params[ 'TEST' ][ 'warmUp' ] )
@@ -90,9 +88,9 @@
             resultsDB.close()
 
             main.switchFunc = imp.load_source( main.dependencyFunc,
-                                           main.dependencyPath +
-                                           main.dependencyFunc +
-                                           ".py" )
+                                               main.dependencyPath +
+                                               main.dependencyFunc +
+                                               ".py" )
         except Exception as e:
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
@@ -144,26 +142,26 @@
         import json
         import numpy
 
-        resultDict = { 'up' : {}, 'down' : {} }
+        resultDict = { 'up': {}, 'down': {} }
         for i in range( 1, main.Cluster.numCtrls + 1 ):
             resultDict[ 'up' ][ 'node' + str( i ) ] = {}
             resultDict[ 'up' ][ 'node' + str( i ) ][ 'Ave' ] = {}
             resultDict[ 'up' ][ 'node' + str( i ) ][ 'Std' ] = {}
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'T_F' ] = []#TCP to Feature
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'F_R' ] = []#Feature to Role
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'RQ_RR' ] = []#role request to role reply
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'RR_D' ] = []#role reply to Device
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'D_G' ] = []#Device to Graph
-            resultDict[ 'up' ][ 'node' + str( i ) ][ 'E_E' ] = []#TCP to Graph
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'T_F' ] = []  # TCP to Feature
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'F_R' ] = []  # Feature to Role
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'RQ_RR' ] = []  # role request to role reply
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'RR_D' ] = []  # role reply to Device
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'D_G' ] = []  # Device to Graph
+            resultDict[ 'up' ][ 'node' + str( i ) ][ 'E_E' ] = []  # TCP to Graph
 
         for i in range( 1, main.Cluster.numCtrls + 1 ):
             resultDict[ 'down' ][ 'node' + str( i ) ] = {}
             resultDict[ 'down' ][ 'node' + str( i ) ][ 'Ave' ] = {}
             resultDict[ 'down' ][ 'node' + str( i ) ][ 'Std' ] = {}
-            resultDict[ 'down' ][ 'node' + str( i ) ][ 'FA_A' ] = []#Fin_ack to ACK
-            resultDict[ 'down' ][ 'node' + str( i ) ][ 'A_D' ] = []#Ack to Device
-            resultDict[ 'down' ][ 'node' + str( i ) ][ 'D_G' ] = []#Device to Graph
-            resultDict[ 'down' ][ 'node' + str( i ) ][ 'E_E' ] = []#fin_ack to Graph
+            resultDict[ 'down' ][ 'node' + str( i ) ][ 'FA_A' ] = []  # Fin_ack to ACK
+            resultDict[ 'down' ][ 'node' + str( i ) ][ 'A_D' ] = []  # Ack to Device
+            resultDict[ 'down' ][ 'node' + str( i ) ][ 'D_G' ] = []  # Device to Graph
+            resultDict[ 'down' ][ 'node' + str( i ) ][ 'E_E' ] = []  # fin_ack to Graph
         for i in range( 0, main.sampleSize + main.warmUp ):
             main.log.info( "************************************************************" )
             main.log.info( "************************ Iteration: {} **********************" .format( str( i + 1 ) ) )
@@ -176,12 +174,12 @@
             else:
                 main.switchFunc.captureOfPack( main, main.device, main.ofPackage,
                                                "up", resultDict, False )
-                main.switchFunc.captureOfPack ( main, main.device, main.ofPackage,
-                                               "down", resultDict, False )
+                main.switchFunc.captureOfPack( main, main.device, main.ofPackage,
+                                                "down", resultDict, False )
                 main.Cluster.active( 0 ).CLI.removeDevice( "of:0000000000000001" )
 
         # Dictionary for result
-        maxDict  = {}
+        maxDict = {}
         maxDict[ 'down' ] = {}
         maxDict[ 'up' ] = {}
         maxDict[ 'down' ][ 'max' ] = 0
diff --git a/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py b/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py
index cde275e..7a159ba 100644
--- a/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py
+++ b/TestON/tests/SCPF/SCPFswitchLat/dependencies/switchFunc.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,29 +18,29 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
     Wrapper function for SCPFswitchLat test
     Assign switch and capture openflow package
     remove switch and caputer openflow package
     calculate latency
-'''
+"""
 import time
 import json
 
+
 def getTimestampFromLog( index, searchTerm ):
-    '''
+    """
     Get timestamp value of the search term from log.
     Args:
         index: the index of cli
         searchTerm: the key term of timestamp
 
-    '''
+    """
     lines = main.Cluster.active( index ).CLI.logSearch( mode='last', searchTerm=searchTerm )
     try:
-        assert lines != None
-        logString = lines[ len ( lines ) - 1 ]
-        #get the target value
+        assert lines is not None
+        logString = lines[ len( lines ) - 1 ]
+        # get the target value
         line = logString.split( "time = " )
         key = line[ 1 ].split( " " )
         return int( key[ 0 ] )
@@ -51,13 +51,14 @@
         main.log.warn( "Search Term Not Found" )
         return 0
 
+
 def processPackage( package ):
-    '''
+    """
     split package information to dictionary
     Args:
         package: Package String
 
-    '''
+    """
     pacakge = package.split( " " )
     dic = {}
     for s in pacakge:
@@ -68,28 +69,30 @@
             continue
     return dic
 
+
 def findSeqBySeqAck( seq, packageList ):
-    '''
+    """
     Find specific Seq of package in packageList
     Args:
         seq: seq from last TCP package
         packageList: find package in packageList
 
-    '''
+    """
     for l in packageList:
         temp = processPackage( l )
         tA = temp[ 'Ack' ]
         if int( seq ) + 1 == int( tA ):
             return temp[ 'Seq' ]
 
+
 def arrangeTsharkFile( switchStatus, keyTerm ):
-    '''
+    """
     Arrange different tshark messeage from overall file to different specific files
     Args:
         switchStatus: switch up or down
         keyTerm: A dictionary that store the path name as value and the searchTerm as key
 
-    '''
+    """
     with open( main.tsharkResultPath[ switchStatus ][ 'ALL' ], 'r' ) as resultFile:
         resultText = resultFile.readlines()
         resultFile.close()
@@ -102,13 +105,14 @@
                     outputfile.write( line )
                     outputfile.close()
 
+
 def checkResult( result1, result2, result3 ):
-    '''
+    """
     Check if the inputs meet the requirement
     Returns:
             1 means the results are right, 0 means the results are wrong
 
-    '''
+    """
     result = check( result1 ) + check( result2 ) + check( result3 )
     if result < 3:
         # if any result is wrong, increase the main wrong number
@@ -118,32 +122,34 @@
         return 0
     return 1
 
+
 def check( result ):
-    '''
+    """
     Check the single input.
     Returns:
             1 means the input is good, 0 means the input is wrong
 
-    '''
+    """
     if result < int( main.resultRange[ 'Min' ] ) or result > int( main.resultRange[ 'Max' ] ):
         main.log.debug( str( result ) + " is not meet the requirement" )
         return 0
     return 1
 
+
 def checkTotalWrongNum():
-    '''
+    """
     Check if the total wrong number is bigger than the max wrong number. If it is, then exit the
     test.
 
-    '''
+    """
     # if there are too many wrongs in this test, then exit
-    if main.wrong['totalWrong'] > main.maxWrong:
+    if main.wrong[ 'totalWrong' ] > main.maxWrong:
         main.log.error( "The total wrong number exceeds %d, test terminated" % main.maxWrong )
         main.cleanAndExit()
 
-def captureOfPack( main, deviceName, ofPack, switchStatus, resultDict, warmup ):
-    '''
 
+def captureOfPack( main, deviceName, ofPack, switchStatus, resultDict, warmup ):
+    """
     Args:
         main: TestON class
         deviceName: device name
@@ -152,7 +158,7 @@
         resultDict: dictionary to contain result
         warmup: warm up boolean
 
-    '''
+    """
     main.log.debug( "TOTAL WRONG: " + str( main.wrong ) )
     for d in ofPack[ switchStatus ]:
         main.log.info( "Clean up Tshark" )
@@ -168,14 +174,14 @@
         cleanTerm = ofPack[ switchStatus ][ d ].replace( '\\', '' )
         keyTerm[ cleanTerm ] = d
     # Delete the last '|'
-    grepString = grepString[:-1]
+    grepString = grepString[ :-1 ]
     # open tshark
     main.log.info( "starting tshark capture" )
     main.ONOSbench.tsharkGrep( grepString, main.tsharkResultPath[ switchStatus ][ 'ALL' ], grepOptions='-E' )
     if switchStatus == 'up':
         # if up, assign switch to controller
         time.sleep( main.measurementSleep )
-        main.log.info( 'Assigning {} to controller'.format( deviceName ))
+        main.log.info( 'Assigning {} to controller'.format( deviceName ) )
         main.Mininet1.assignSwController( sw=deviceName, ip=main.Cluster.active( 0 ).ipAddress )
         time.sleep( main.measurementSleep )
     if switchStatus == 'down':
@@ -208,8 +214,8 @@
                 main.log.info( "Capture result:" + resultText )
                 resultText = resultText.strip()
                 resultText = resultText.split( " " )
-                if len(resultText) > 1:
-                    tempResultDict[d]= int( ( float( resultText[ 1 ] ) * 1000 ) )
+                if len( resultText ) > 1:
+                    tempResultDict[ d ] = int( ( float( resultText[ 1 ] ) * 1000 ) )
                 resultFile.close()
     elif switchStatus == 'down':
         # if state is down, we should capture Fin/Ack and ACK package
@@ -220,7 +226,7 @@
             resultFile.close()
         FinAckSeq = processPackage( FinAckText )[ 'Seq' ]
         FinAckOFseq = findSeqBySeqAck( FinAckSeq, resultText )
-        if FinAckOFseq == None:
+        if FinAckOFseq is None:
             main.log.warn( "Tshark Result was incorrect!" )
             main.log.warn( resultText )
             main.wrong[ 'TsharkValueIncorrect' ] += 1
@@ -269,7 +275,7 @@
                 return
             if not warmup:
                 resultDict[ switchStatus ][ d ][ 'T_F' ].append( T_Ftemp )
-                resultDict[ switchStatus ][ d ][ 'F_R' ].append( F_Rtemp  )
+                resultDict[ switchStatus ][ d ][ 'F_R' ].append( F_Rtemp )
                 resultDict[ switchStatus ][ d ][ 'RQ_RR' ].append( RQ_RRtemp )
 
             main.log.info( "{} TCP to Feature: {}".format( d, str( T_Ftemp ) ) )
@@ -284,7 +290,7 @@
             # get onos metrics timestamps
             try:
                 response = json.loads( main.Cluster.active( i - 1 ).CLI.topologyEventsMetrics() )
-                DeviceTime = getTimestampFromLog( i - 1, searchTerm=main.searchTerm[switchStatus] )
+                DeviceTime = getTimestampFromLog( i - 1, searchTerm=main.searchTerm[ switchStatus ] )
                 main.log.info( "ONOS{} device Event timestamp: {}".format( i, "%.2f" % DeviceTime ) )
                 GraphTime = int( response.get( "topologyGraphEventTimestamp" ).get( "value" ) )
                 main.log.info( "ONOS{} Graph Event timestamp: {}".format( i, GraphTime ) )
@@ -331,14 +337,14 @@
                     checkTotalWrongNum()
                     break
                 if not warmup and check == 1:
-                    resultDict[ switchStatus ][ 'node' + str( i )][ 'RR_D' ].append( RR_Dtemp )
-                    resultDict[ switchStatus ][ 'node' + str( i )][ 'D_G' ].append( D_Gtemp )
-                    resultDict[ switchStatus ][ 'node' + str( i )][ 'E_E' ].append( E_Etemp )
+                    resultDict[ switchStatus ][ 'node' + str( i ) ][ 'RR_D' ].append( RR_Dtemp )
+                    resultDict[ switchStatus ][ 'node' + str( i ) ][ 'D_G' ].append( D_Gtemp )
+                    resultDict[ switchStatus ][ 'node' + str( i ) ][ 'E_E' ].append( E_Etemp )
             else:
-                main.wrong['checkResultIncorrect'] += 1
+                main.wrong[ 'checkResultIncorrect' ] += 1
                 main.wrong[ 'totalWrong' ] += 1
                 checkTotalWrongNum()
-                main.log.debug("Skip this iteration due to the None Devicetime")
+                main.log.debug( "Skip this iteration due to the None Devicetime" )
 
     if switchStatus == "down":
         # down Latency
@@ -389,7 +395,7 @@
                     check = checkResult( A_Dtemp, D_Gtemp, E_Etemp )
                     if check == 1:
                         main.log.info( "ACK to device: {}".format( A_Dtemp ) )
-                        main.log.info( "Device to Graph: {}".format( D_Gtemp )  )
+                        main.log.info( "Device to Graph: {}".format( D_Gtemp ) )
                         main.log.info( "End to End: {}".format( E_Etemp ) )
                         main.log.info( "================================================" )
                 except KeyError:
@@ -417,8 +423,7 @@
                     resultDict[ switchStatus ][ 'node' + str( i ) ][ 'E_E' ].append( E_Etemp )
 
             else:
-                main.wrong['checkResultIncorrect'] += 1
-                main.wrong['totalWrong'] += 1
+                main.wrong[ 'checkResultIncorrect' ] += 1
+                main.wrong[ 'totalWrong' ] += 1
                 checkTotalWrongNum()
-                main.log.debug("Skip this iteration due to the None Devicetime")
-
+                main.log.debug( "Skip this iteration due to the None Devicetime" )
diff --git a/TestON/tests/SCPF/SCPFswitchLat/dependencies/topo-perf-1sw.py b/TestON/tests/SCPF/SCPFswitchLat/dependencies/topo-perf-1sw.py
index 1793e2b..3652c82 100644
--- a/TestON/tests/SCPF/SCPFswitchLat/dependencies/topo-perf-1sw.py
+++ b/TestON/tests/SCPF/SCPFswitchLat/dependencies/topo-perf-1sw.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,17 +18,17 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-'''
+"""
 Simple 1 switch topology for topologoy performance test
-'''
-
+"""
 from mininet.topo import Topo
 
-class MyTopo( Topo ):
-    def __init__(self):
-        Topo.__init__(self)
 
-        s3 = self.addSwitch( "s3", dpid="0000000000000001")
+class MyTopo( Topo ):
+
+    def __init__( self ):
+        Topo.__init__( self )
+
+        s3 = self.addSwitch( "s3", dpid="0000000000000001" )
 
 topos = { 'mytopo': ( lambda: MyTopo() ) }
diff --git a/TestON/tests/USECASE/SegmentRouting/SRClusterRestart/SRClusterRestart.py b/TestON/tests/USECASE/SegmentRouting/SRClusterRestart/SRClusterRestart.py
old mode 100755
new mode 100644
index 5735c9d..ce3020c
--- a/TestON/tests/USECASE/SegmentRouting/SRClusterRestart/SRClusterRestart.py
+++ b/TestON/tests/USECASE/SegmentRouting/SRClusterRestart/SRClusterRestart.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,12 +18,13 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # CASE1: 2x2 topo + 3-node ONOS CLUSTER + IP connectivity test + CLUSTER restart
 # CASE2: 4x4 topo + 3-node ONOS CLUSTER + IP connectivity test + CLUSTER restart
 # CASE3: Single switch + 3-node ONOS CLUSTER + IP connectivity test + CLUSTER restart
 
+
 class SRClusterRestart:
+
     def __init__( self ):
         self.default = ''
 
diff --git a/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.py b/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.py
old mode 100755
new mode 100644
index 44f704e..1af681c
--- a/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.py
+++ b/TestON/tests/USECASE/SegmentRouting/SRDynamic/SRDynamic.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # CASE1: 2x2 Leaf-Spine topo and test IP connectivity
 # CASE2: 4x4 topo + IP connectivity test
 # CASE3: Single switch topo + IP connectivity test
@@ -26,7 +25,9 @@
 # CASE5: 4x4 topo + 3-node ONOS CLUSTER + IP connectivity test
 # CASE6: Single switch + 3-node ONOS CLUSTER + IP connectivity test
 
+
 class SRDynamic:
+
     def __init__( self ):
         self.default = ''
 
diff --git a/TestON/tests/USECASE/SegmentRouting/SRHighAvailability/SRHighAvailability.py b/TestON/tests/USECASE/SegmentRouting/SRHighAvailability/SRHighAvailability.py
index ba0242d..f84b39c 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRHighAvailability/SRHighAvailability.py
+++ b/TestON/tests/USECASE/SegmentRouting/SRHighAvailability/SRHighAvailability.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,17 +18,15 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # In this test we perform several failures and then test for connectivity
 # CASE1: 2x2 topo + 3 ONOS + | ONOS failure + IP connectivity test | x failures
-# CASE2: 2x2 topo + 3 ONOS + | ONOS (random instance) failure + IP connectivity test | x failures
+# CASE2: 2x2 topo + 3 ONOS + | ONOS ( random instance ) failure + IP connectivity test | x failures
 # CASE3: 4x4 topo + 3 ONOS + | ONOS failure + IP connectivity test | x failures
-# CASE4: 4x4 topo + 3 ONOS + | ONOS (random instance) failure + IP connectivity test | x failures
+# CASE4: 4x4 topo + 3 ONOS + | ONOS ( random instance ) failure + IP connectivity test | x failures
 # CASE5: 2x2 topo + 3 ONOS + | ONOS failure + Spine failure + IP connectivity test | x failures
-# CASE6: 2x2 topo + 3 ONOS + | ONOS (random instance) failure + Spine (random switch) failure + IP connectivity test | x failures
+# CASE6: 2x2 topo + 3 ONOS + | ONOS ( random instance ) failure + Spine ( random switch ) failure + IP connectivity test | x failures
 # CASE7: 4x4 topo + 3 ONOS + | ONOS failure + Spine failure + IP connectivity test | x failures
-# CASE8: 4x4 topo + 3 ONOS + | ONOS (random instance) failure + Spine (random switch) failure + IP connectivity test | x failures
-
+# CASE8: 4x4 topo + 3 ONOS + | ONOS ( random instance ) failure + Spine ( random switch ) failure + IP connectivity test | x failures
 
 
 class SRHighAvailability:
@@ -38,12 +36,12 @@
 
     def CASE1( self, main ):
         """
-        1) Sets up 3-nodes Onos-cluster
-        2) Start 2x2 Leaf-Spine topology
-        3) Pingall
-        4) Cause sequential ONOS failure
-        5) Pingall
-        6) Repeat 3), 4), 5) 'failures' times
+        1 ) Sets up 3-nodes Onos-cluster
+        2 ) Start 2x2 Leaf-Spine topology
+        3 ) Pingall
+        4 ) Cause sequential ONOS failure
+        5 ) Pingall
+        6 ) Repeat 3 ), 4 ), 5 ) 'failures' times
         """
         from tests.USECASE.SegmentRouting.dependencies.Testcaselib import \
             Testcaselib as run
@@ -52,29 +50,29 @@
 
         description = "High Availability tests - ONOS failures with 2x2 Leaf-spine "
         main.case( description )
-        run.config(main, '2x2')
+        run.config( main, '2x2' )
         run.installOnos( main )
         run.startMininet( main, 'cord_fabric.py' )
         # pre-configured routing and bridging test
         run.checkFlows( main, minFlowCount=116 )
         run.pingAll( main )
-        for i in range(0, main.failures):
+        for i in range( 0, main.failures ):
             toKill = i % main.Cluster.numCtrls
             run.killOnos( main, [ toKill ], '4', '8', '2' )
-            run.pingAll( main, 'CASE1_Failure%d' % (i+1) )
+            run.pingAll( main, 'CASE1_Failure%d' % ( i + 1 ) )
             run.recoverOnos( main, [ toKill ], '4', '8', '3' )
             run.checkFlows( main, minFlowCount=116 )
-            run.pingAll( main, 'CASE1_Recovery%d' % (i+1) )
+            run.pingAll( main, 'CASE1_Recovery%d' % ( i + 1 ) )
         run.cleanup( main )
 
     def CASE2( self, main ):
         """
-        1) Sets up 3-nodes Onos-cluster
-        2) Start 2x2 Leaf-Spine topology
-        3) Pingall
-        4) Cause random ONOS failure
-        5) Pingall
-        6) Repeat 3), 4), 5) 'failures' times
+        1 ) Sets up 3-nodes Onos-cluster
+        2 ) Start 2x2 Leaf-Spine topology
+        3 ) Pingall
+        4 ) Cause random ONOS failure
+        5 ) Pingall
+        6 ) Repeat 3 ), 4 ), 5 ) 'failures' times
         """
         from tests.USECASE.SegmentRouting.dependencies.Testcaselib import \
             Testcaselib as run
@@ -86,30 +84,30 @@
 
         description = "High Availability tests - ONOS random failures with 2x2 Leaf-spine "
         main.case( description )
-        run.config(main, '2x2')
+        run.config( main, '2x2' )
         run.installOnos( main )
         run.startMininet( main, 'cord_fabric.py' )
         # pre-configured routing and bridging test
         run.checkFlows( main, minFlowCount=116 )
         run.pingAll( main )
-        random.seed(datetime.now())
-        for i in range(0, main.failures):
+        random.seed( datetime.now() )
+        for i in range( 0, main.failures ):
             toKill = randint( 0, ( main.Cluster.numCtrls - 1 ) )
             run.killOnos( main, [ toKill ], '4', '8', '2' )
-            run.pingAll( main, 'CASE2_Failure%d' % (i+1) )
+            run.pingAll( main, 'CASE2_Failure%d' % ( i + 1 ) )
             run.recoverOnos( main, [ toKill ], '4', '8', '3' )
             run.checkFlows( main, minFlowCount=116 )
-            run.pingAll( main, 'CASE2_Recovery%d' % (i+1) )
+            run.pingAll( main, 'CASE2_Recovery%d' % ( i + 1 ) )
         run.cleanup( main )
 
     def CASE3( self, main ):
         """
-        1) Sets up 3-nodes Onos-cluster
-        2) Start 4x4 Leaf-Spine topology
-        3) Pingall
-        4) Cause sequential ONOS failure
-        5) Pingall
-        6) Repeat 3), 4), 5) 'failures' times
+        1 ) Sets up 3-nodes Onos-cluster
+        2 ) Start 4x4 Leaf-Spine topology
+        3 ) Pingall
+        4 ) Cause sequential ONOS failure
+        5 ) Pingall
+        6 ) Repeat 3 ), 4 ), 5 ) 'failures' times
         """
         from tests.USECASE.SegmentRouting.dependencies.Testcaselib import \
             Testcaselib as run
@@ -118,29 +116,29 @@
 
         description = "High Availability tests - ONOS failures with 4x4 Leaf-spine "
         main.case( description )
-        run.config(main, '4x4')
+        run.config( main, '4x4' )
         run.installOnos( main )
         run.startMininet( main, 'cord_fabric.py', args="--leaf=4 --spine=4" )
         # pre-configured routing and bridging test
         run.checkFlows( main, minFlowCount=350 )
         run.pingAll( main )
-        for i in range(0, main.failures):
+        for i in range( 0, main.failures ):
             toKill = i % main.Cluster.numCtrls
             run.killOnos( main, [ toKill ], '8', '32', '2' )
-            run.pingAll( main, 'CASE3_Failure%d' % (i+1) )
+            run.pingAll( main, 'CASE3_Failure%d' % ( i + 1 ) )
             run.recoverOnos( main, [ toKill ], '8', '32', '3' )
             run.checkFlows( main, minFlowCount=350 )
-            run.pingAll( main, 'CASE3_Recovery%d' % (i+1) )
+            run.pingAll( main, 'CASE3_Recovery%d' % ( i + 1 ) )
         run.cleanup( main )
 
     def CASE4( self, main ):
         """
-        1) Sets up 3-nodes Onos-cluster
-        2) Start 4x4 Leaf-Spine topology
-        3) Pingall
-        4) Cause random ONOS failure
-        5) Pingall
-        6) Repeat 3), 4), 5) 'failures' times
+        1 ) Sets up 3-nodes Onos-cluster
+        2 ) Start 4x4 Leaf-Spine topology
+        3 ) Pingall
+        4 ) Cause random ONOS failure
+        5 ) Pingall
+        6 ) Repeat 3 ), 4 ), 5 ) 'failures' times
         """
         from tests.USECASE.SegmentRouting.dependencies.Testcaselib import \
             Testcaselib as run
@@ -152,32 +150,32 @@
 
         description = "High Availability tests - ONOS random failures with 4x4 Leaf-spine "
         main.case( description )
-        run.config(main, '4x4')
+        run.config( main, '4x4' )
         run.installOnos( main )
         run.startMininet( main, 'cord_fabric.py', args="--leaf=4 --spine=4" )
         # pre-configured routing and bridging test
         run.checkFlows( main, minFlowCount=350 )
         run.pingAll( main )
-        random.seed(datetime.now())
-        for i in range(0, main.failures):
+        random.seed( datetime.now() )
+        for i in range( 0, main.failures ):
             toKill = randint( 0, ( main.Cluster.numCtrls - 1 ) )
             run.killOnos( main, [ toKill ], '8', '32', '2' )
-            run.pingAll( main, 'CASE4_Failure%d' % (i+1) )
+            run.pingAll( main, 'CASE4_Failure%d' % ( i + 1 ) )
             run.recoverOnos( main, [ toKill ], '8', '32', '3' )
             run.checkFlows( main, minFlowCount=350 )
-            run.pingAll( main, 'CASE4_Recovery%d' % (i+1) )
+            run.pingAll( main, 'CASE4_Recovery%d' % ( i + 1 ) )
         run.cleanup( main )
 
     def CASE5( self, main ):
         """
-        1) Sets up 3-nodes Onos-cluster
-        2) Start 2x2 Leaf-Spine topology
-        3) Pingall
-        4) Cause sequential ONOS failure
-        5) Pingall
-        6) Cause sequential Spine failure
-        7) Pingall
-        8) Repeat 3), 4), 5), 6), 7), 'failures' times
+        1 ) Sets up 3-nodes Onos-cluster
+        2 ) Start 2x2 Leaf-Spine topology
+        3 ) Pingall
+        4 ) Cause sequential ONOS failure
+        5 ) Pingall
+        6 ) Cause sequential Spine failure
+        7 ) Pingall
+        8 ) Repeat 3 ), 4 ), 5 ), 6 ), 7 ), 'failures' times
         """
         from tests.USECASE.SegmentRouting.dependencies.Testcaselib import \
             Testcaselib as run
@@ -187,38 +185,38 @@
 
         description = "High Availability tests - ONOS failures and Switch failures with 2x2 Leaf-spine "
         main.case( description )
-        run.config(main, '2x2')
+        run.config( main, '2x2' )
         run.installOnos( main )
         run.startMininet( main, 'cord_fabric.py' )
         # pre-configured routing and bridging test
         run.checkFlows( main, minFlowCount=116 )
         run.pingAll( main )
-        for i in range(0, main.failures):
+        for i in range( 0, main.failures ):
             onosToKill = i % main.Cluster.numCtrls
-            switchToKill = i % len(main.spines)
+            switchToKill = i % len( main.spines )
             run.killOnos( main, [ onosToKill ], '4', '8', '2' )
-            run.pingAll( main, 'CASE5_ONOS_Failure%d' % (i+1) )
-            run.killSwitch( main, main.spines[switchToKill]['name'], switches='3', links='4' )
+            run.pingAll( main, 'CASE5_ONOS_Failure%d' % ( i + 1 ) )
+            run.killSwitch( main, main.spines[ switchToKill ][ 'name' ], switches='3', links='4' )
             time.sleep( main.switchSleep )
-            run.pingAll( main, "CASE5_SWITCH_Failure%d" % (i+1) )
-            run.recoverSwitch( main, main.spines[switchToKill]['name'], switches='4', links='8' )
+            run.pingAll( main, "CASE5_SWITCH_Failure%d" % ( i + 1 ) )
+            run.recoverSwitch( main, main.spines[ switchToKill ][ 'name' ], switches='4', links='8' )
             run.checkFlows( main, minFlowCount=116 )
-            run.pingAll( main, "CASE5_SWITCH_Recovery%d" % (i+1) )
+            run.pingAll( main, "CASE5_SWITCH_Recovery%d" % ( i + 1 ) )
             run.recoverOnos( main, [ onosToKill ], '4', '8', '3' )
             run.checkFlows( main, minFlowCount=116 )
-            run.pingAll( main, 'CASE5_ONOS_Recovery%d' % (i+1) )
+            run.pingAll( main, 'CASE5_ONOS_Recovery%d' % ( i + 1 ) )
         run.cleanup( main )
 
     def CASE6( self, main ):
         """
-        1) Sets up 3-nodes Onos-cluster
-        2) Start 2x2 Leaf-Spine topology
-        3) Pingall
-        4) Cause random ONOS failure
-        5) Pingall
-        6) Cause random Spine failure
-        7) Pingall
-        8) Repeat 3), 4), 5), 6), 7) 'failures' times
+        1 ) Sets up 3-nodes Onos-cluster
+        2 ) Start 2x2 Leaf-Spine topology
+        3 ) Pingall
+        4 ) Cause random ONOS failure
+        5 ) Pingall
+        6 ) Cause random Spine failure
+        7 ) Pingall
+        8 ) Repeat 3 ), 4 ), 5 ), 6 ), 7 ) 'failures' times
         """
         from tests.USECASE.SegmentRouting.dependencies.Testcaselib import \
             Testcaselib as run
@@ -231,38 +229,38 @@
 
         description = "High Availability tests - ONOS random failures and Switch random failures with 2x2 Leaf-spine "
         main.case( description )
-        run.config(main, '2x2')
+        run.config( main, '2x2' )
         run.installOnos( main )
         run.startMininet( main, 'cord_fabric.py' )
         # pre-configured routing and bridging test
         run.checkFlows( main, minFlowCount=116 )
         run.pingAll( main )
-        for i in range(0, main.failures):
+        for i in range( 0, main.failures ):
             onosToKill = randint( 0, ( main.Cluster.numCtrls - 1 ) )
-            switchToKill = randint(0, 1)
+            switchToKill = randint( 0, 1 )
             run.killOnos( main, [ onosToKill ], '4', '8', '2' )
-            run.pingAll( main, 'CASE6_ONOS_Failure%d' % (i+1) )
-            run.killSwitch( main, main.spines[switchToKill]['name'], switches='3', links='4' )
+            run.pingAll( main, 'CASE6_ONOS_Failure%d' % ( i + 1 ) )
+            run.killSwitch( main, main.spines[ switchToKill ][ 'name' ], switches='3', links='4' )
             time.sleep( main.switchSleep )
-            run.pingAll( main, "CASE6_SWITCH_Failure%d" % (i+1) )
-            run.recoverSwitch( main, main.spines[switchToKill]['name'], switches='4', links='8' )
+            run.pingAll( main, "CASE6_SWITCH_Failure%d" % ( i + 1 ) )
+            run.recoverSwitch( main, main.spines[ switchToKill ][ 'name' ], switches='4', links='8' )
             run.checkFlows( main, minFlowCount=116 )
-            run.pingAll( main, "CASE6_SWITCH_Recovery%d" % (i+1) )
+            run.pingAll( main, "CASE6_SWITCH_Recovery%d" % ( i + 1 ) )
             run.recoverOnos( main, [ onosToKill ], '4', '8', '3' )
             run.checkFlows( main, minFlowCount=116 )
-            run.pingAll( main, 'CASE6_ONOS_Recovery%d' % (i+1) )
+            run.pingAll( main, 'CASE6_ONOS_Recovery%d' % ( i + 1 ) )
         run.cleanup( main )
 
     def CASE7( self, main ):
         """
-        1) Sets up 3-nodes Onos-cluster
-        2) Start 4x4 Leaf-Spine topology
-        3) Pingall
-        4) Cause sequential ONOS failure
-        5) Pingall
-        6) Cause sequential Spine failure
-        7) Pingall
-        8) Repeat 3), 4), 5), 6), 7), 'failures' times
+        1 ) Sets up 3-nodes Onos-cluster
+        2 ) Start 4x4 Leaf-Spine topology
+        3 ) Pingall
+        4 ) Cause sequential ONOS failure
+        5 ) Pingall
+        6 ) Cause sequential Spine failure
+        7 ) Pingall
+        8 ) Repeat 3 ), 4 ), 5 ), 6 ), 7 ), 'failures' times
         """
         from tests.USECASE.SegmentRouting.dependencies.Testcaselib import \
             Testcaselib as run
@@ -272,38 +270,38 @@
 
         description = "High Availability tests - ONOS failures and Switch failures with 4x4 Leaf-spine "
         main.case( description )
-        run.config(main, '4x4')
+        run.config( main, '4x4' )
         run.installOnos( main )
         run.startMininet( main, 'cord_fabric.py', args="--leaf=4 --spine=4" )
         # pre-configured routing and bridging test
         run.checkFlows( main, minFlowCount=350 )
         run.pingAll( main )
-        for i in range(0, main.failures):
+        for i in range( 0, main.failures ):
             onosToKill = i % main.Cluster.numCtrls
-            switchToKill = i % len(main.spines)
+            switchToKill = i % len( main.spines )
             run.killOnos( main, [ onosToKill ], '8', '32', '2' )
-            run.pingAll( main, 'CASE7_ONOS_Failure%d' % (i+1) )
-            run.killSwitch( main, main.spines[switchToKill]['name'], switches='7', links='24' )
+            run.pingAll( main, 'CASE7_ONOS_Failure%d' % ( i + 1 ) )
+            run.killSwitch( main, main.spines[ switchToKill ][ 'name' ], switches='7', links='24' )
             time.sleep( main.switchSleep )
-            run.pingAll( main, "CASE7_SWITCH_Failure%d" % (i+1) )
-            run.recoverSwitch( main, main.spines[switchToKill]['name'], switches='8', links='32' )
+            run.pingAll( main, "CASE7_SWITCH_Failure%d" % ( i + 1 ) )
+            run.recoverSwitch( main, main.spines[ switchToKill ][ 'name' ], switches='8', links='32' )
             run.checkFlows( main, minFlowCount=350 )
-            run.pingAll( main, "CASE7_SWITCH_Recovery%d" % (i+1) )
+            run.pingAll( main, "CASE7_SWITCH_Recovery%d" % ( i + 1 ) )
             run.recoverOnos( main, [ onosToKill ], '8', '32', '3' )
             run.checkFlows( main, minFlowCount=350 )
-            run.pingAll( main, 'CASE7_ONOS_Recovery%d' % (i+1) )
+            run.pingAll( main, 'CASE7_ONOS_Recovery%d' % ( i + 1 ) )
         run.cleanup( main )
 
     def CASE8( self, main ):
         """
-        1) Sets up 3-nodes Onos-cluster
-        2) Start 4x4 Leaf-Spine topology
-        3) Pingall
-        4) Cause random ONOS failure
-        5) Pingall
-        6) Cause random Spine failure
-        7) Pingall
-        8) Repeat 3), 4), 5), 6), 7), 'failures' times
+        1 ) Sets up 3-nodes Onos-cluster
+        2 ) Start 4x4 Leaf-Spine topology
+        3 ) Pingall
+        4 ) Cause random ONOS failure
+        5 ) Pingall
+        6 ) Cause random Spine failure
+        7 ) Pingall
+        8 ) Repeat 3 ), 4 ), 5 ), 6 ), 7 ), 'failures' times
         """
         from tests.USECASE.SegmentRouting.dependencies.Testcaselib import \
             Testcaselib as run
@@ -316,24 +314,24 @@
 
         description = "High Availability tests - ONOS random failures and Switch random failures with 4x4 Leaf-spine "
         main.case( description )
-        run.config(main, '4x4')
+        run.config( main, '4x4' )
         run.installOnos( main )
         run.startMininet( main, 'cord_fabric.py', args="--leaf=4 --spine=4" )
         # pre-configured routing and bridging test
         run.checkFlows( main, minFlowCount=350 )
         run.pingAll( main )
-        for i in range(0, main.failures):
+        for i in range( 0, main.failures ):
             onosToKill = randint( 0, ( main.Cluster.numCtrls - 1 ) )
-            switchToKill = randint(0, 3)
+            switchToKill = randint( 0, 3 )
             run.killOnos( main, [ onosToKill ], '8', '32', '2' )
-            run.pingAll( main, 'CASE8_ONOS_Failure%d' % (i+1) )
-            run.killSwitch( main, main.spines[switchToKill]['name'], switches='7', links='24' )
+            run.pingAll( main, 'CASE8_ONOS_Failure%d' % ( i + 1 ) )
+            run.killSwitch( main, main.spines[ switchToKill ][ 'name' ], switches='7', links='24' )
             time.sleep( main.switchSleep )
-            run.pingAll( main, "CASE8_SWITCH_Failure%d" % (i+1) )
-            run.recoverSwitch( main, main.spines[switchToKill]['name'], switches='8', links='32' )
+            run.pingAll( main, "CASE8_SWITCH_Failure%d" % ( i + 1 ) )
+            run.recoverSwitch( main, main.spines[ switchToKill ][ 'name' ], switches='8', links='32' )
             run.checkFlows( main, minFlowCount=350 )
-            run.pingAll( main, "CASE8_SWITCH_Recovery%d" % (i+1) )
+            run.pingAll( main, "CASE8_SWITCH_Recovery%d" % ( i + 1 ) )
             run.recoverOnos( main, [ onosToKill ], '8', '32', '3' )
             run.checkFlows( main, minFlowCount=350 )
-            run.pingAll( main, 'CASE8_ONOS_Recovery%d' % (i+1) )
+            run.pingAll( main, 'CASE8_ONOS_Recovery%d' % ( i + 1 ) )
         run.cleanup( main )
diff --git a/TestON/tests/USECASE/SegmentRouting/SRLinkFailure/SRLinkFailure.py b/TestON/tests/USECASE/SegmentRouting/SRLinkFailure/SRLinkFailure.py
old mode 100755
new mode 100644
index cb95b18..e8b6cf7
--- a/TestON/tests/USECASE/SegmentRouting/SRLinkFailure/SRLinkFailure.py
+++ b/TestON/tests/USECASE/SegmentRouting/SRLinkFailure/SRLinkFailure.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,14 +18,15 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # In this test we perform a link failure and then test for connectivity
 # CASE1: 2x2 topo + link failure + IP connectivity test
 # CASE2: 4x4 topo + link failure + IP connectivity test
 # CASE4: 2x2 topo + 3-node ONOS CLUSTER + link failure + IP connectivity test
 # CASE5: 4x4 topo + 3-node ONOS CLUSTER + link failure + IP connectivity test
 
+
 class SRLinkFailure:
+
     def __init__( self ):
         self.default = ''
 
diff --git a/TestON/tests/USECASE/SegmentRouting/SROnosFailure/SROnosFailure.py b/TestON/tests/USECASE/SegmentRouting/SROnosFailure/SROnosFailure.py
old mode 100755
new mode 100644
index f0383ae..6c972b2
--- a/TestON/tests/USECASE/SegmentRouting/SROnosFailure/SROnosFailure.py
+++ b/TestON/tests/USECASE/SegmentRouting/SROnosFailure/SROnosFailure.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,12 +18,13 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # CASE1: 2x2 topo + 3-node ONOS CLUSTER + IP connectivity test + Control plane resilience
 # CASE2: 4x4 topo + 3-node ONOS CLUSTER + IP connectivity test + Control plane resilience
 # CASE3: Single switch + 3-node ONOS CLUSTER + IP connectivity test + Control plane resilience
 
+
 class SROnosFailure:
+
     def __init__( self ):
         self.default = ''
 
diff --git a/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.py b/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.py
old mode 100755
new mode 100644
index 435683e..2919500
--- a/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.py
+++ b/TestON/tests/USECASE/SegmentRouting/SRSanity/SRSanity.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # CASE1: 2x2 Leaf-Spine topo and test IP connectivity
 # CASE2: 4x4 topo + IP connectivity test
 # CASE3: Single switch topo + IP connectivity test
@@ -26,7 +25,9 @@
 # CASE5: 4x4 topo + 3-node ONOS CLUSTER + IP connectivity test
 # CASE6: Single switch + 3-node ONOS CLUSTER + IP connectivity test
 
+
 class SRSanity:
+
     def __init__( self ):
         self.default = ''
 
diff --git a/TestON/tests/USECASE/SegmentRouting/SRSwitchFailure/SRSwitchFailure.py b/TestON/tests/USECASE/SegmentRouting/SRSwitchFailure/SRSwitchFailure.py
old mode 100755
new mode 100644
index 1b0968c..d0d79c8
--- a/TestON/tests/USECASE/SegmentRouting/SRSwitchFailure/SRSwitchFailure.py
+++ b/TestON/tests/USECASE/SegmentRouting/SRSwitchFailure/SRSwitchFailure.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,14 +18,15 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # In this test we perform a switch failure and then test for connectivity
 # CASE1: 2x2 topo + swtich failure + IP connectivity test
 # CASE2: 4x4 topo + switch failure + IP connectivity test
 # CASE4: 2x2 topo + 3-node ONOS CLUSTER + switch failure + IP connectivity test
 # CASE5: 4x4 topo + 3-node ONOS CLUSTER + switch failure + IP connectivity test
 
+
 class SRSwitchFailure:
+
     def __init__( self ):
         self.default = ''
 
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py b/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
old mode 100755
new mode 100644
index d83585a..f542554
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 import os
 import imp
 import time
@@ -29,7 +28,7 @@
 
 class Testcaselib:
 
-    useSSH=True
+    useSSH = True
 
     @staticmethod
     def initTest( main ):
@@ -60,7 +59,7 @@
             main.dependencyPath = main.path + "/../dependencies/"
             main.topology = main.params[ 'DEPENDENCY' ][ 'topology' ]
             wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
-            main.scale = (main.params[ 'SCALE' ][ 'size' ]).split( "," )
+            main.scale = ( main.params[ 'SCALE' ][ 'size' ] ).split( "," )
             main.maxNodes = int( main.params[ 'SCALE' ][ 'max' ] )
             # main.ONOSport = main.params[ 'CTRL' ][ 'port' ]
             main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
@@ -76,8 +75,6 @@
             main.testSetUp.envSetupException( e )
         main.testSetUp.evnSetupConclusion( stepResult )
 
-
-
     @staticmethod
     def installOnos( main, vlanCfg=True ):
         """
@@ -119,7 +116,7 @@
         cliResult = main.TRUE
         main.step( "Checking if ONOS CLI is ready" )
         for ctrl in main.Cluster.runningNodes:
-            ctrl.CLI.startCellCli( )
+            ctrl.CLI.startCellCli()
             cliResult = cliResult and ctrl.CLI.startOnosCli( ctrl.ipAddress,
                                                              commandlineTimeout=60,
                                                              onosStartTimeout=100 )
@@ -139,10 +136,10 @@
                                  onfail="ONOS summary command failed" )
 
         with open( "%s/json/%s.json" % (
-                main.dependencyPath, main.cfgName) ) as cfg:
+                main.dependencyPath, main.cfgName ) ) as cfg:
             main.Cluster.active( 0 ).REST.setNetCfg( json.load( cfg ) )
         with open( "%s/json/%s.chart" % (
-                main.dependencyPath, main.cfgName) ) as chart:
+                main.dependencyPath, main.cfgName ) ) as chart:
             main.pingChart = json.load( chart )
         if not ready:
             main.log.error( "ONOS startup failed!" )
@@ -157,7 +154,7 @@
     @staticmethod
     def startMininet( main, topology, args="" ):
         main.step( "Starting Mininet Topology" )
-        arg = "--onos %d %s" % (main.Cluster.numCtrls, args)
+        arg = "--onos %d %s" % ( main.Cluster.numCtrls, args )
         main.topology = topology
         topoResult = main.Mininet1.startNet(
                 topoFile=main.Mininet1.home + main.topology, args=arg )
@@ -172,44 +169,44 @@
 
     @staticmethod
     def config( main, cfgName ):
-        main.spines     = []
+        main.spines = []
 
-        main.failures   = int(main.params[ 'failures' ])
-        main.cfgName    = cfgName
+        main.failures = int( main.params[ 'failures' ] )
+        main.cfgName = cfgName
 
-        if main.cfgName == '2x2' :
-            spine           = {}
-            spine[ 'name' ] = main.params['switches'][ 'spine1' ]
-            spine[ 'dpid' ] = main.params['switches'][ 'spinedpid1' ]
-            main.spines.append(spine)
+        if main.cfgName == '2x2':
+            spine = {}
+            spine[ 'name' ] = main.params[ 'switches' ][ 'spine1' ]
+            spine[ 'dpid' ] = main.params[ 'switches' ][ 'spinedpid1' ]
+            main.spines.append( spine )
 
-            spine           = {}
-            spine[ 'name' ] = main.params['switches'][ 'spine2' ]
-            spine[ 'dpid' ] = main.params['switches'][ 'spinedpid2' ]
-            main.spines.append(spine)
+            spine = {}
+            spine[ 'name' ] = main.params[ 'switches' ][ 'spine2' ]
+            spine[ 'dpid' ] = main.params[ 'switches' ][ 'spinedpid2' ]
+            main.spines.append( spine )
 
-        elif main.cfgName == '4x4' :
-            spine           = {}
-            spine[ 'name' ] = main.params['switches'][ 'spine1' ]
-            spine[ 'dpid' ] = main.params['switches'][ 'spinedpid1' ]
-            main.spines.append(spine)
+        elif main.cfgName == '4x4':
+            spine = {}
+            spine[ 'name' ] = main.params[ 'switches' ][ 'spine1' ]
+            spine[ 'dpid' ] = main.params[ 'switches' ][ 'spinedpid1' ]
+            main.spines.append( spine )
 
-            spine           = {}
-            spine[ 'name' ] = main.params['switches'][ 'spine2' ]
-            spine[ 'dpid' ] = main.params['switches'][ 'spinedpid2' ]
-            main.spines.append(spine)
+            spine = {}
+            spine[ 'name' ] = main.params[ 'switches' ][ 'spine2' ]
+            spine[ 'dpid' ] = main.params[ 'switches' ][ 'spinedpid2' ]
+            main.spines.append( spine )
 
-            spine           = {}
-            spine[ 'name' ] = main.params['switches'][ 'spine3' ]
-            spine[ 'dpid' ] = main.params['switches'][ 'spinedpid3' ]
-            main.spines.append(spine)
+            spine = {}
+            spine[ 'name' ] = main.params[ 'switches' ][ 'spine3' ]
+            spine[ 'dpid' ] = main.params[ 'switches' ][ 'spinedpid3' ]
+            main.spines.append( spine )
 
-            spine           = {}
-            spine[ 'name' ] = main.params['switches'][ 'spine4' ]
-            spine[ 'dpid' ] = main.params['switches'][ 'spinedpid4' ]
-            main.spines.append(spine)
+            spine = {}
+            spine[ 'name' ] = main.params[ 'switches' ][ 'spine4' ]
+            spine[ 'dpid' ] = main.params[ 'switches' ][ 'spinedpid4' ]
+            main.spines.append( spine )
 
-        else :
+        else:
             main.log.error( "Configuration failed!" )
             main.cleanAndExit()
 
@@ -222,9 +219,9 @@
                                  kwargs={ 'min': minFlowCount },
                                  attempts=10,
                                  sleep=10 )
-        utilities.assertEquals( \
+        utilities.assertEquals(
                 expect=True,
-                actual=(count > 0),
+                actual=( count > 0 ),
                 onpass="Flow count looks correct: " + str( count ),
                 onfail="Flow count looks wrong: " + str( count ) )
 
@@ -234,7 +231,7 @@
                                      kwargs={ 'isPENDING': False },
                                      attempts=2,
                                      sleep=10 )
-        utilities.assertEquals( \
+        utilities.assertEquals(
                 expect=main.TRUE,
                 actual=flowCheck,
                 onpass="Flow status is correct!",
@@ -253,11 +250,11 @@
     def pingAll( main, tag="", dumpflows=True ):
         main.log.report( "Check full connectivity" )
         print main.pingChart
-        for entry in main.pingChart.itervalues( ):
+        for entry in main.pingChart.itervalues():
             print entry
             hosts, expect = entry[ 'hosts' ], entry[ 'expect' ]
             expect = main.TRUE if expect else main.FALSE
-            main.step( "Connectivity for %s %s" % (str( hosts ), tag) )
+            main.step( "Connectivity for %s %s" % ( str( hosts ), tag ) )
             pa = main.Mininet1.pingallHosts( hosts )
             utilities.assert_equals( expect=expect, actual=pa,
                                      onpass="IP connectivity successfully tested",
@@ -280,7 +277,7 @@
         Kill a link and verify ONOS can see the proper link change
         """
         main.linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
-        main.step( "Kill link between %s and %s" % (end1, end2) )
+        main.step( "Kill link between %s and %s" % ( end1, end2 ) )
         LinkDown = main.Mininet1.link( END1=end1, END2=end2, OPTION="down" )
         LinkDown = main.Mininet1.link( END2=end1, END1=end2, OPTION="down" )
         main.log.info(
@@ -308,7 +305,7 @@
             switches, links: number of expected switches and links after linkDown, ex.: '4', '6'
         Kill a link and verify ONOS can see the proper link change
         """
-        main.step( "Restore link between %s and %s" % (end1, end2) )
+        main.step( "Restore link between %s and %s" % ( end1, end2 ) )
         result = False
         count = 0
         while True:
@@ -319,7 +316,7 @@
                     "Waiting %s seconds for link up to be discovered" % main.linkSleep )
             time.sleep( main.linkSleep )
 
-            for i in range(0, main.Cluster.numCtrls):
+            for i in range( 0, main.Cluster.numCtrls ):
                 ctrl = main.Cluster.runningNodes[ i ]
                 onosIsUp = main.ONOSbench.isup( ctrl.ipAddress )
                 if onosIsUp == main.TRUE:
@@ -347,7 +344,7 @@
         main.Mininet1.switch( SW=switch, OPTION="stop" )
         # todo make this repeatable
         main.log.info( "Waiting %s seconds for switch down to be discovered" % (
-            main.switchSleep) )
+            main.switchSleep ) )
         time.sleep( main.switchSleep )
         topology = utilities.retry( main.Cluster.active( 0 ).CLI.checkStatus,
                                     main.FALSE,
@@ -370,7 +367,7 @@
         main.log.info( "Starting" + switch )
         main.Mininet1.switch( SW=switch, OPTION="start" )
         main.log.info( "Waiting %s seconds for switch up to be discovered" % (
-            main.switchSleep) )
+            main.switchSleep ) )
         time.sleep( main.switchSleep )
         topology = utilities.retry( main.Cluster.active( 0 ).CLI.checkStatus,
                                     main.FALSE,
@@ -413,7 +410,6 @@
         switches, links, nodes: number of expected switches, links and nodes after KillOnos, ex.: '4', '6'
         Completely Kill an ONOS instance and verify the ONOS cluster can see the proper change
         """
-
         main.step( "Killing ONOS instance" )
 
         for i in nodes:
@@ -484,7 +480,7 @@
         main.step( "Checking ONOS nodes" )
         nodeResults = utilities.retry( Testcaselib.nodesCheck,
                                        False,
-                                       args=[nodes],
+                                       args=[ nodes ],
                                        attempts=5,
                                        sleep=10 )
         utilities.assert_equals( expect=True, actual=nodeResults,
@@ -527,15 +523,15 @@
     def addHostCfg( main ):
         """
         Adds Host Configuration to ONOS
-        Updates expected state of the network (pingChart)
+        Updates expected state of the network ( pingChart )
         """
         import json
-        hostCfg = { }
+        hostCfg = {}
         with open( main.dependencyPath + "/json/extra.json" ) as template:
             hostCfg = json.load( template )
         main.pingChart[ 'ip' ][ 'hosts' ] += [ 'in1' ]
         main.step( "Pushing new configuration" )
-        mac, cfg = hostCfg[ 'hosts' ].popitem( )
+        mac, cfg = hostCfg[ 'hosts' ].popitem()
         main.Cluster.active( 0 ).REST.setNetCfg( cfg[ 'basic' ],
                                                  subjectClass="hosts",
                                                  subjectKey=urllib.quote( mac,
@@ -543,17 +539,17 @@
                                                  configKey="basic" )
         main.pingChart[ 'ip' ][ 'hosts' ] += [ 'out1' ]
         main.step( "Pushing new configuration" )
-        mac, cfg = hostCfg[ 'hosts' ].popitem( )
+        mac, cfg = hostCfg[ 'hosts' ].popitem()
         main.Cluster.active( 0 ).REST.setNetCfg( cfg[ 'basic' ],
                                                  subjectClass="hosts",
                                                  subjectKey=urllib.quote( mac,
                                                                           safe='' ),
-                                             configKey="basic" )
+                                                 configKey="basic" )
         main.pingChart.update( { 'vlan1': { "expect": "True",
                                             "hosts": [ "olt1", "vsg1" ] } } )
         main.pingChart[ 'vlan5' ][ 'expect' ] = 0
         main.pingChart[ 'vlan10' ][ 'expect' ] = 0
-        ports = "[%s,%s]" % (5, 6)
+        ports = "[%s,%s]" % ( 5, 6 )
         cfg = '{"of:0000000000000001":[{"vlan":1,"ports":%s,"name":"OLT 1"}]}' % ports
         main.Cluster.active( 0 ).REST.setNetCfg( json.loads( cfg ),
                                                  subjectClass="apps",
@@ -564,15 +560,15 @@
     def delHostCfg( main ):
         """
         Removest Host Configuration from ONOS
-        Updates expected state of the network (pingChart)
+        Updates expected state of the network ( pingChart )
         """
         import json
-        hostCfg = { }
+        hostCfg = {}
         with open( main.dependencyPath + "/json/extra.json" ) as template:
             hostCfg = json.load( template )
         main.step( "Removing host configuration" )
         main.pingChart[ 'ip' ][ 'expect' ] = 0
-        mac, cfg = hostCfg[ 'hosts' ].popitem( )
+        mac, cfg = hostCfg[ 'hosts' ].popitem()
         main.Cluster.active( 0 ).REST.removeNetCfg( subjectClass="hosts",
                                                     subjectKey=urllib.quote(
                                                             mac,
@@ -580,7 +576,7 @@
                                                     configKey="basic" )
         main.step( "Removing configuration" )
         main.pingChart[ 'ip' ][ 'expect' ] = 0
-        mac, cfg = hostCfg[ 'hosts' ].popitem( )
+        mac, cfg = hostCfg[ 'hosts' ].popitem()
         main.Cluster.active( 0 ).REST.removeNetCfg( subjectClass="hosts",
                                                     subjectKey=urllib.quote(
                                                             mac,
@@ -591,20 +587,20 @@
         main.Cluster.active( 0 ).REST.removeNetCfg( subjectClass="apps",
                                                     subjectKey="org.onosproject.segmentrouting",
                                                     configKey="xconnect" )
+
     @staticmethod
     def nodesCheck( nodes ):
         results = True
         nodesOutput = main.Cluster.command( "nodes", specificDriver=2 )
-        ips = main.Cluster.getIps( activeOnly=True )
-        ips.sort()
+        ips = sorted( main.Cluster.getIps( activeOnly=True ) )
         for i in nodesOutput:
             try:
                 current = json.loads( i )
                 activeIps = []
                 currentResult = False
                 for node in current:
-                    if node['state'] == 'READY':
-                        activeIps.append( node['ip'] )
+                    if node[ 'state' ] == 'READY':
+                        activeIps.append( node[ 'ip' ] )
                 currentResult = True
                 for ip in ips:
                     if ip not in activeIps:
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/cord_fabric.py b/TestON/tests/USECASE/SegmentRouting/dependencies/cord_fabric.py
old mode 100755
new mode 100644
index 1c7e258..1012fef
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/cord_fabric.py
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/cord_fabric.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,7 +20,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 import os
 import re
 import math
@@ -35,9 +34,9 @@
 
 
 # Parse command line options and dump results
-def parseOptions( ):
-    """Parse command line options"""
-    parser = OptionParser( )
+def parseOptions():
+    "Parse command line options"
+    parser = OptionParser()
     parser.add_option( '--spine', dest='spine', type='int', default=2,
                        help='number of spine switches, default=2' )
     parser.add_option( '--leaf', dest='leaf', type='int', default=2,
@@ -50,52 +49,54 @@
                        help='vid of cross connect, default=-1, -1 means utilize default value' )
     parser.add_option( '--ipv6', action="store_true", dest='ipv6',
                        help='hosts are capable to use also ipv6' )
-    (options, args) = parser.parse_args( )
+    ( options, args ) = parser.parse_args()
     return options, args
 
 
-opts, args = parseOptions( )
+opts, args = parseOptions()
 
 IP6_SUBNET_CLASS = 120
 IP4_SUBNET_CLASS = 24
 
+
 class LeafAndSpine6( Topo ):
+
     """
     Create Leaf and Spine Topology for IPv4/IPv6 tests.
     """
     def __init__( self, spine=2, leaf=2, fanout=2, **opts ):
         Topo.__init__( self, **opts )
-        spines          = {}
-        leafs           = {}
+        spines = {}
+        leafs = {}
         """
         We calculate the offset from /120 and from /24 in order to have
         a number of /120 and /24 subnets == leaf
         """
-        offset          = int(math.ceil(math.sqrt( leaf )))
+        offset = int( math.ceil( math.sqrt( leaf ) ) )
         """
         We calculate the subnets to use and set options
         """
-        ipv6SubnetClass = unicode('2000::/%s' % (IP6_SUBNET_CLASS - offset))
-        ipv6Subnets     = list(IPv6Network(ipv6SubnetClass).subnets( new_prefix = IP6_SUBNET_CLASS ))
-        ipv4SubnetClass = unicode('10.0.0.0/%s' % (IP4_SUBNET_CLASS - offset))
-        ipv4Subnets     = list(IPv4Network(ipv4SubnetClass).subnets( new_prefix = IP4_SUBNET_CLASS ))
-        linkopts        = dict( bw=100 )
+        ipv6SubnetClass = unicode( '2000::/%s' % ( IP6_SUBNET_CLASS - offset ) )
+        ipv6Subnets = list( IPv6Network( ipv6SubnetClass ).subnets( new_prefix=IP6_SUBNET_CLASS ) )
+        ipv4SubnetClass = unicode( '10.0.0.0/%s' % ( IP4_SUBNET_CLASS - offset ) )
+        ipv4Subnets = list( IPv4Network( ipv4SubnetClass ).subnets( new_prefix=IP4_SUBNET_CLASS ) )
+        linkopts = dict( bw=100 )
         """
         We create the spine switches
         """
         for s in range( spine ):
-            spines[ s ] = self.addSwitch( 'spine10%s' % (s + 1),
-                                          dpid="00000000010%s" % (s + 1) )
+            spines[ s ] = self.addSwitch( 'spine10%s' % ( s + 1 ),
+                                          dpid="00000000010%s" % ( s + 1 ) )
         """
         We create the leaf switches
         """
         for ls in range( leaf ):
-            leafs[ ls ] = self.addSwitch( 'leaf%s' % (ls + 1),
-                                          dpid="00000000000%s" % (1 + ls) )
-            ipv6Subnet  = ipv6Subnets[ ls ]
-            ipv6Hosts   = list(ipv6Subnet.hosts())
-            ipv4Subnet  = ipv4Subnets[ ls ]
-            ipv4Hosts   = list(ipv4Subnet.hosts())
+            leafs[ ls ] = self.addSwitch( 'leaf%s' % ( ls + 1 ),
+                                          dpid="00000000000%s" % ( 1 + ls ) )
+            ipv6Subnet = ipv6Subnets[ ls ]
+            ipv6Hosts = list( ipv6Subnet.hosts() )
+            ipv4Subnet = ipv4Subnets[ ls ]
+            ipv4Hosts = list( ipv4Subnet.hosts() )
             """
             We add the hosts
             """
@@ -105,13 +106,13 @@
                 ipv4 = ipv4Hosts[ f ]
                 ipv4Gateway = ipv4Hosts[ len( ipv4Hosts ) - 1 ]
                 host = self.addHost(
-                    name='h%s' % (ls * fanout + f + 1),
+                    name='h%s' % ( ls * fanout + f + 1 ),
                     cls=Ipv6Host,
-                    ip="%s/%s" %(ipv4, IP4_SUBNET_CLASS),
+                    ip="%s/%s" % ( ipv4, IP4_SUBNET_CLASS ),
                     gateway='%s' % ipv4Gateway,
-                    ipv6="%s/%s" %(ipv6, IP6_SUBNET_CLASS),
+                    ipv6="%s/%s" % ( ipv6, IP6_SUBNET_CLASS ),
                     ipv6Gateway="%s" % ipv6Gateway
-                    )
+                )
                 self.addLink( host, leafs[ ls ], **linkopts )
             """
             Connect leaf to all spines
@@ -120,45 +121,45 @@
                 switch = spines[ s ]
                 self.addLink( leafs[ ls ], switch, **linkopts )
 
+
 class LeafAndSpine( Topo ):
+
     def __init__( self, spine=2, leaf=2, fanout=2, **opts ):
         "Create Leaf and Spine Topo."
         Topo.__init__( self, **opts )
         # Add spine switches
-        spines = { }
-        leafs = { }
+        spines = {}
+        leafs = {}
         for s in range( spine ):
-            spines[ s ] = self.addSwitch( 'spine10%s' % (s + 1),
-                                          dpid="00000000010%s" % (s + 1) )
+            spines[ s ] = self.addSwitch( 'spine10%s' % ( s + 1 ),
+                                          dpid="00000000010%s" % ( s + 1 ) )
         # Set link speeds to 100Mb/s
         linkopts = dict( bw=100 )
         # Add Leaf switches
         for ls in range( leaf ):
-            leafs[ ls ] = self.addSwitch( 'leaf%s' % (ls + 1),
-                                          dpid="00000000000%s" % (1 + ls) )
+            leafs[ ls ] = self.addSwitch( 'leaf%s' % ( ls + 1 ),
+                                          dpid="00000000000%s" % ( 1 + ls ) )
             # Add hosts under a leaf, fanout hosts per leaf switch
             for f in range( fanout ):
-                host = self.addHost( 'h%s' % (ls * fanout + f + 1),
+                host = self.addHost( 'h%s' % ( ls * fanout + f + 1 ),
                                      cls=IpHost,
-                                     ip='10.0.%s.%s/24' % ((ls + 1), (f + 1)),
-                                     gateway='10.0.%s.254' % (ls + 1) )
+                                     ip='10.0.%s.%s/24' % ( ( ls + 1 ), ( f + 1 ) ),
+                                     gateway='10.0.%s.254' % ( ls + 1 ) )
                 self.addLink( host, leafs[ ls ], **linkopts )
                 # Add Xconnect simulation
             if ls is 0:
                 in1 = self.addHost( 'in1', cls=IpHost, ip='10.0.1.9/24', mac="00:00:00:00:00:09" )
-                self.addLink( in1, leafs[0], **linkopts )
+                self.addLink( in1, leafs[ 0 ], **linkopts )
                 out1 = self.addHost( 'out1', cls=IpHost, ip='10.0.9.1/24', mac="00:00:00:00:09:01" )
-                self.addLink( out1, leafs[0], **linkopts )
+                self.addLink( out1, leafs[ 0 ], **linkopts )
                 br1 = self.addSwitch( 'br1', cls=OVSBridge )
                 self.addLink( br1, leafs[ 0 ], **linkopts )
                 vlans = [ 1, 5, 10 ]
                 for vid in vlans:
                     olt = self.addHost( 'olt%s' % vid, cls=VLANHost, vlan=vid,
-                                        ip="10.%s.0.1/24" % vid
-                                        , mac="00:00:%02d:00:00:01" % vid )
+                                        ip="10.%s.0.1/24" % vid, mac="00:00:%02d:00:00:01" % vid )
                     vsg = self.addHost( 'vsg%s' % vid, cls=VLANHost, vlan=vid,
-                                        ip="10.%s.0.2/24" % vid
-                                        , mac="00:00:%02d:00:00:02" % vid )
+                                        ip="10.%s.0.2/24" % vid, mac="00:00:%02d:00:00:02" % vid )
                     self.addLink( olt, leafs[ 0 ], **linkopts )
                     self.addLink( vsg, br1, **linkopts )
             # Connect leaf to all spines
@@ -166,12 +167,14 @@
                 switch = spines[ s ]
                 self.addLink( leafs[ ls ], switch, **linkopts )
 
+
 class IpHost( Host ):
+
     def __init__( self, name, *args, **kwargs ):
         super( IpHost, self ).__init__( name, *args, **kwargs )
-        gateway = re.split('\.|/', kwargs['ip'])
-        gateway[3] = '254'
-        self.gateway = '.'.join(gateway[0:4])
+        gateway = re.split( '\.|/', kwargs[ 'ip' ] )
+        gateway[ 3 ] = '254'
+        self.gateway = '.'.join( gateway[ 0:4 ] )
 
     def config( self, **kwargs ):
         Host.config( self, **kwargs )
@@ -179,77 +182,84 @@
         self.cmd( mtu )
         self.cmd( 'ip route add default via %s' % self.gateway )
 
+
 class Ipv6Host( IpHost ):
+
     """
     Abstraction to model an augmented host with a ipv6
     functionalities as well
     """
     def __init__( self, name, *args, **kwargs ):
-        IpHost.__init__(self, name, *args, **kwargs)
+        IpHost.__init__( self, name, *args, **kwargs )
 
     def config( self, **kwargs ):
         IpHost.config( self, **kwargs )
-        ipv6Cmd         = 'ifconfig %s-eth0 inet6 add %s' % (self.name, kwargs['ipv6'])
-        ipv6GatewayCmd  = 'ip -6 route add default via %s' % kwargs['ipv6Gateway']
-        ipv6MtuCmd      = 'ifconfig %s-eth0 inet6 mtu 1490' % (self.name)
+        ipv6Cmd = 'ifconfig %s-eth0 inet6 add %s' % ( self.name, kwargs[ 'ipv6' ] )
+        ipv6GatewayCmd = 'ip -6 route add default via %s' % kwargs[ 'ipv6Gateway' ]
+        ipv6MtuCmd = 'ifconfig %s-eth0 inet6 mtu 1490' % ( self.name )
         self.cmd( ipv6Cmd )
         self.cmd( ipv6GatewayCmd )
         self.cmd( ipv6MtuCmd )
 
+
 class VLANHost( Host ):
+
     "Host connected to VLAN interface"
 
     def config( self, vlan=100, **params ):
-        """Configure VLANHost according to (optional) parameters:
+        """Configure VLANHost according to ( optional ) parameters:
            vlan: VLAN ID for default interface"""
         r = super( VLANHost, self ).config( **params )
-        intf = self.defaultIntf( )
+        intf = self.defaultIntf()
         # remove IP from default, "physical" interface
         self.cmd( 'ifconfig %s inet 0' % intf )
-        intf = self.defaultIntf( )
+        intf = self.defaultIntf()
         # create VLAN interface
-        self.cmd( 'vconfig add %s %d' % (intf, vlan) )
-        self.cmd( 'ifconfig %s.%d %s' % (intf, vlan, params[ 'ip' ]) )
+        self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
+        self.cmd( 'ifconfig %s.%d %s' % ( intf, vlan, params[ 'ip' ] ) )
         # update the intf name and host's intf map
-        self.cmd( 'ifconfig %s.%d mtu 1480' % (intf, vlan) )
-        newName = '%s.%d' % (intf, vlan)
-        # update the (Mininet) interface to refer to VLAN interface name
+        self.cmd( 'ifconfig %s.%d mtu 1480' % ( intf, vlan ) )
+        newName = '%s.%d' % ( intf, vlan )
+        # update the ( Mininet ) interface to refer to VLAN interface name
         intf.name = newName
         # add VLAN interface to host's name to intf map
         self.nameToIntf[ newName ] = intf
 
+
 class ExtendedCLI( CLI ):
+
     """
     Extends mininet CLI with the following commands:
     addvlanhost
     addiphost
     """
     def do_addhost( self, line ):
-        #Parsing args from CLI
-        args = line.split( )
-        if len( args ) < 3 or len( args ) :
+        # Parsing args from CLI
+        args = line.split()
+        if len( args ) < 3 or len( args ):
             "usage: addhost hostname switch **params"
-        hostname, switch = args[0],  args[1]
-        params = eval(line.split( ' ', 3 )[2])
+        hostname, switch = args[ 0 ], args[ 1 ]
+        params = eval( line.split( ' ', 3 )[ 2 ] )
         if 'cls' in params:
-            params['cls'] = eval( params[ 'cls' ] )
+            params[ 'cls' ] = eval( params[ 'cls' ] )
         if hostname in self.mn:
-            #error( '%s already exists!\n' % hostname )
+            # error( '%s already exists!\n' % hostname )
             return
         if switch not in self.mn:
-            #error( '%s does not exist!\n' % switch )
+            # error( '%s does not exist!\n' % switch )
             return
         print params
         host = self.mn.addHostCfg( hostname, **params )
-        #switch.attach( link.intf2 )
-        #host.config()
+        # switch.attach( link.intf2 )
+        # host.config()
         link = self.mn.addLink( host, switch )
-        host.config(**params)
+        host.config( **params )
 
     def do_pingall6( self, line ):
         "Ping6 between all hosts."
         self.mn.pingAll6( line )
 
+
 def config( opts ):
     spine = opts.spine
     leaf = opts.leaf
@@ -257,7 +267,7 @@
     vlan = opts.vlan
     ipv6 = opts.ipv6
     controllers = [ os.environ[ 'OC%s' % i ] for i in
-                    range( 1, opts.onos + 1 ) ] if (opts.onos) else [
+                    range( 1, opts.onos + 1 ) ] if ( opts.onos ) else [
         '127.0.0.1' ]
     if not ipv6:
         topo = LeafAndSpine(
@@ -265,7 +275,7 @@
             leaf=leaf,
             fanout=fanout,
             vlan=vlan,
-            )
+        )
     else:
         topo = LeafAndSpine6(
             spine=spine,
@@ -273,20 +283,20 @@
             fanout=fanout,
             vlan=vlan,
             ipv6=ipv6
-            )
+        )
     net = Mininet( topo=topo, link=TCLink, build=False,
                    switch=UserSwitch, controller=None, autoSetMacs=True )
     i = 0
     for ip in controllers:
-        net.addController( "c%s" % (i), controller=RemoteController, ip=ip )
-        i += 1;
-    net.build( )
-    net.start( )
+        net.addController( "c%s" % ( i ), controller=RemoteController, ip=ip )
+        i += 1
+    net.build()
+    net.start()
     if not ipv6:
         out1 = net.get( 'out1' )
-        out1.cmd( "arp -s 10.0.9.254 10:00:00:00:00:01 -i %s " % (out1.intf()) )
-    ExtendedCLI(net)
-    net.stop( )
+        out1.cmd( "arp -s 10.0.9.254 10:00:00:00:00:01 -i %s " % ( out1.intf() ) )
+    ExtendedCLI( net )
+    net.stop()
 
 if __name__ == '__main__':
     setLogLevel( 'info' )
diff --git a/TestON/tests/USECASE/USECASE_SdnipFunction/USECASE_SdnipFunction.py b/TestON/tests/USECASE/USECASE_SdnipFunction/USECASE_SdnipFunction.py
index 93f0735..a45bdef 100644
--- a/TestON/tests/USECASE/USECASE_SdnipFunction/USECASE_SdnipFunction.py
+++ b/TestON/tests/USECASE/USECASE_SdnipFunction/USECASE_SdnipFunction.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,8 +18,9 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # Testing the functionality of SDN-IP with single ONOS instance
+
+
 class USECASE_SdnipFunction:
 
     def __init__( self ):
@@ -50,7 +51,7 @@
 
         # connect all switches to controller
         swResult = main.TRUE
-        for i in range ( 1, int( main.params['config']['switchNum'] ) + 1 ):
+        for i in range( 1, int( main.params[ 'config' ][ 'switchNum' ] ) + 1 ):
             sw = "sw%s" % ( i )
             swResult = swResult and \
                        main.Mininet.assignSwController( sw, main.Cluster.active( 0 ).ipAddress )
@@ -73,7 +74,7 @@
                                  actual=( "PasswordAuthentication" in tunnelResult ),
                                  onpass="Created tunnel succeeded",
                                  onfail="Create tunnel failed" )
-        if ("PasswordAuthentication" not in tunnelResult) :
+        if ( "PasswordAuthentication" not in tunnelResult ):
             main.cleanAndExit()
 
     def CASE101( self, main ):
@@ -106,7 +107,7 @@
 
         main.case( "Activate sdn-ip application" )
         main.log.info( "waiting link discovery......" )
-        time.sleep( int( main.params['timers']['TopoDiscovery'] ) )
+        time.sleep( int( main.params[ 'timers' ][ 'TopoDiscovery' ] ) )
 
         main.log.info( "Get links in the network" )
         summaryResult = main.Cluster.active( 0 ).CLI.summary()
@@ -115,7 +116,7 @@
         main.log.info( listResult )
         if linkNum < 100:
             main.log.error( "Link number is wrong!" )
-            time.sleep( int( main.params['timers']['TopoDiscovery'] ) )
+            time.sleep( int( main.params[ 'timers' ][ 'TopoDiscovery' ] ) )
             listResult = main.Cluster.active( 0 ).CLI.links( jsonFormat=False )
             main.log.info( listResult )
             main.cleanAndExit()
@@ -130,7 +131,6 @@
             main.log.info( "Activate SDN-IP failed!" )
             main.cleanAndExit()
 
-
         main.log.info( "Wait SDN-IP to finish installing connectivity intents \
         and the BGP paths in data plane are ready..." )
         time.sleep( int( main.params[ 'timers' ][ 'SdnIpSetup' ] ) )
@@ -139,11 +139,10 @@
         time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
         time.sleep( int( main.params[ 'timers' ][ 'PathAvailable' ] ) )
 
-
     def CASE102( self, main ):
-        '''
+        """
         This test case is to load the methods from other Python files.
-        '''
+        """
         import imp
 
         main.case( "Loading methods from other Python file" )
@@ -154,12 +153,10 @@
                                           wrapperFile +
                                           ".py" )
 
-
     def CASE1( self, main ):
-        '''
+        """
         ping test from 7 bgp peers to BGP speaker
-        '''
-
+        """
         main.case( "Ping tests between BGP peers and speakers" )
         main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
                                           peers=[ "p64514", "p64515", "p64516" ],
@@ -174,16 +171,15 @@
                                           expectAllSuccess=True )
 
     def CASE2( self, main ):
-        '''
+        """
         point-to-point intents test for each BGP peer and BGP speaker pair
-        '''
+        """
         main.sdnBase.pToPIntentTest( 6 )
 
-
     def CASE3( self, main ):
-        '''
+        """
         routes and intents check to all BGP peers
-        '''
+        """
         main.case( "Check routes and M2S intents to all BGP peers" )
 
         allRoutesExpected = []
@@ -197,17 +193,16 @@
 
         main.sdnBase.routeAndIntentCheck( allRoutesExpected, 7 )
 
-
     def CASE4( self, main ):
-        '''
+        """
         Ping test in data plane for each route
-        '''
+        """
         main.case( "Ping test for each route, all hosts behind BGP peers" )
-        #No vlan
+        # No vlan
         main.Functions.pingHostToHost( main,
                                        hosts=[ "h64514", "h64515", "h64516" ],
                                        expectAllSuccess=True )
-        #vlan 10
+        # vlan 10
         main.Functions.pingHostToHost( main,
                                        hosts=[ "h64519", "h64520" ],
                                        expectAllSuccess=True )
@@ -218,28 +213,27 @@
                                        expectAllSuccess=True )
 
     def CASE5( self, main ):
-        '''
+        """
         Cut links to peers one by one, check routes/intents
-        '''
+        """
         main.sdnBase.linkUpDownCheck( "p64514", "p64515", "p64516",
                                       6, 6, 5, 5, 4, 4,
                                       "spk1", [ "h64514", "h64515", "h64516" ],
                                       "down" )
 
-
     def CASE6( self, main ):
-        '''
+        """
         Recover links to peers one by one, check routes/intents
-        '''
+        """
         main.sdnBase.linkUpDownCheck( "p64514", "p64515", "p64516",
                                       5, 5, 6, 6, 7, 7,
                                       "spk1", [ "h64514", "h64515", "h64516" ],
                                       "up" )
 
     def CASE7( self, main ):
-        '''
+        """
         Shut down a edge switch, check P-2-P and M-2-S intents, ping test
-        '''
+        """
         import time
         main.case( "Stop edge sw32,check P-2-P and M-2-S intents, ping test" )
         main.step( "Stop sw32" )
@@ -250,9 +244,9 @@
 
         if result == main.TRUE:
             time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
-            main.Functions.checkRouteNum( main, 6 ) #stop one sw, which bring one link between peer and sw down.
+            main.Functions.checkRouteNum( main, 6 )  # stop one sw, which bring one link between peer and sw down.
             main.Functions.checkM2SintentNum( main, 6 )
-            main.Functions.checkP2PintentNum( main, 36 ) #6 intents from sw to speakers x 6 intents to sw x 2 intents between them
+            main.Functions.checkP2PintentNum( main, 36 )  # 6 intents from sw to speakers x 6 intents to sw x 2 intents between them
         else:
             main.log.error( "Stopping switch failed!" )
             main.cleanAndExit()
@@ -268,7 +262,7 @@
                                  onpass="Ping test result is correct",
                                  onfail="Ping test result is wrong" )
 
-        if pingResult1 == False:
+        if not pingResult1:
             main.cleanAndExit()
 
         main.step( "Check ping between BGP peers and speakers" )
@@ -282,38 +276,37 @@
                                  onpass="Speaker1 ping peers successful",
                                  onfail="Speaker1 ping peers NOT successful" )
 
-        if pingResult2 == False:
+        if not pingResult2:
             main.cleanAndExit()
 
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
-        utilities.assertEquals( \
+        utilities.assertEquals(
             expect=main.TRUE,
             actual=flowCheck,
             onpass="Flow status is correct!",
             onfail="Flow status is wrong!" )
 
-
     def CASE8( self, main ):
-        '''
-        Bring up the edge switch (sw32) which was shut down in CASE7,
+        """
+        Bring up the edge switch ( sw32 ) which was shut down in CASE7,
         check P-2-P and M-2-S intents, ping test
-        '''
+        """
         import time
         main.case( "Start the edge sw32, check P-2-P and M-2-S intents, ping test" )
         main.step( "Start sw32" )
         result1 = main.Mininet.switch( SW="sw32", OPTION="start" )
-        utilities.assertEquals( \
+        utilities.assertEquals(
             expect=main.TRUE,
             actual=result1,
             onpass="Starting switch succeeded!",
             onfail="Starting switch failed!" )
 
         result2 = main.Mininet.assignSwController( "sw32", main.Cluster.active( 0 ).ipAddress )
-        utilities.assertEquals( \
+        utilities.assertEquals(
             expect=main.TRUE,
             actual=result2,
             onpass="Connect switch to ONOS succeeded!",
@@ -331,28 +324,27 @@
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
-        utilities.assertEquals( \
+        utilities.assertEquals(
             expect=main.TRUE,
             actual=flowCheck,
             onpass="Flow status is correct!",
             onfail="Flow status is wrong!" )
 
         # Ping test
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk1"],
-                       peers=["p64514", "p64515", "p64516"],
-                       expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
+                                          peers=[ "p64514", "p64515", "p64516" ],
+                                          expectAllSuccess=True )
         main.Functions.pingHostToHost( main,
-                        hosts=["h64514", "h64515", "h64516"],
-                        expectAllSuccess=True )
-
+                                       hosts=[ "h64514", "h64515", "h64516" ],
+                                       expectAllSuccess=True )
 
     def CASE9( self, main ):
-        '''
+        """
         Bring down a switch in best path, check:
         route number, P2P intent number, M2S intent number, ping test
-        '''
+        """
         main.case( "Stop sw11 located in best path, \
         check route number, P2P intent number, M2S intent number, ping test" )
 
@@ -382,27 +374,26 @@
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
-        utilities.assertEquals( \
+        utilities.assertEquals(
             expect=main.TRUE,
             actual=flowCheck,
             onpass="Flow status is correct!",
             onfail="Flow status is wrong!" )
         # Ping test
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk1"],
-                       peers=["p64514", "p64515", "p64516"],
-                       expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
+                                          peers=[ "p64514", "p64515", "p64516" ],
+                                          expectAllSuccess=True )
         main.Functions.pingHostToHost( main,
-                        hosts=["h64514", "h64515", "h64516"],
-                        expectAllSuccess=True )
-
+                                       hosts=[ "h64514", "h64515", "h64516" ],
+                                       expectAllSuccess=True )
 
     def CASE10( self, main ):
-        '''
+        """
         Bring up the switch which was stopped in CASE9, check:
         route number, P2P intent number, M2S intent number, ping test
-        '''
+        """
         main.case( "Start sw11 which was stopped in CASE9, \
         check route number, P2P intent number, M2S intent number, ping test" )
 
@@ -437,17 +428,17 @@
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
-        utilities.assertEquals( \
+        utilities.assertEquals(
             expect=main.TRUE,
             actual=flowCheck,
             onpass="Flow status is correct!",
             onfail="Flow status is wrong!" )
         # Ping test
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk1"],
-                       peers=["p64514", "p64515", "p64516"],
-                       expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
+                                          peers=[ "p64514", "p64515", "p64516" ],
+                                          expectAllSuccess=True )
         main.Functions.pingHostToHost( main,
-                        hosts=["h64514", "h64515", "h64516"],
-                        expectAllSuccess=True )
+                                       hosts=[ "h64514", "h64515", "h64516" ],
+                                       expectAllSuccess=True )
diff --git a/TestON/tests/USECASE/USECASE_SdnipFunction/dependencies/Functions.py b/TestON/tests/USECASE/USECASE_SdnipFunction/dependencies/Functions.py
index a284213..81d2d96 100644
--- a/TestON/tests/USECASE/USECASE_SdnipFunction/dependencies/Functions.py
+++ b/TestON/tests/USECASE/USECASE_SdnipFunction/dependencies/Functions.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,11 +18,10 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 def checkRouteNum( main, routeNumExpected ):
     import time
     main.step( "Check routes installed" )
-    wait = int( main.params['timers']['PathAvailable'] )
+    wait = int( main.params[ 'timers' ][ 'PathAvailable' ] )
     main.log.info( "Route number expected:" )
     main.log.info( routeNumExpected )
     main.log.info( "Route number from ONOS CLI:" )
@@ -32,85 +31,88 @@
         time.sleep( wait )
         routeNumActual = main.Cluster.active( 0 ).CLI.ipv4RouteNumber()
     main.log.info( routeNumActual )
-    utilities.assertEquals( \
-        expect = routeNumExpected, actual = routeNumActual,
-        onpass = "Route number is correct!",
-        onfail = "Route number is wrong!" )
+    utilities.assertEquals(
+        expect=routeNumExpected, actual=routeNumActual,
+        onpass="Route number is correct!",
+        onfail="Route number is wrong!" )
+
 
 def checkM2SintentNum( main, intentNumExpected ):
     import time
     main.step( "Check M2S intents installed" )
-    wait = int( main.params['timers']['PathAvailable'] )
-    jsonResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat = True, summary = True,
-                                                       TYPE = "multiPointToSinglePoint" )
+    wait = int( main.params[ 'timers' ][ 'PathAvailable' ] )
+    jsonResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat=True, summary=True,
+                                                       TYPE="multiPointToSinglePoint" )
     try:
-        intentNumActual = jsonResult['installed']
+        intentNumActual = jsonResult[ 'installed' ]
     except TypeError as e:
         intentNumActual = -1
         main.log.error( e )
     if intentNumActual != intentNumExpected:
         time.sleep( wait )
-        jsonResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat = True, summary = True,
-                                                           TYPE = "multiPointToSinglePoint" )
+        jsonResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat=True, summary=True,
+                                                           TYPE="multiPointToSinglePoint" )
         try:
-            intentNumActual = jsonResult['installed']
+            intentNumActual = jsonResult[ 'installed' ]
         except TypeError as e:
             intentNumActual = -1
             main.log.error( e )
     main.log.info( "Intent number expected: {}".format( intentNumExpected ) )
     main.log.info( "Intent number from ONOS CLI: {}".format( intentNumActual ) )
-    utilities.assertEquals( \
-        expect = intentNumExpected, actual = intentNumActual,
-        onpass = "M2S intent number is correct!",
-        onfail = "M2S intent number is wrong!" )
+    utilities.assertEquals(
+        expect=intentNumExpected, actual=intentNumActual,
+        onpass="M2S intent number is correct!",
+        onfail="M2S intent number is wrong!" )
+
 
 def checkP2PintentNum( main, intentNumExpected ):
     import time
     main.step( "Check P2P intents installed" )
-    wait = int( main.params['timers']['PathAvailable'] )
-    jsonResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat = True, summary = True,
-                                                       TYPE = "pointToPoint" )
+    wait = int( main.params[ 'timers' ][ 'PathAvailable' ] )
+    jsonResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat=True, summary=True,
+                                                       TYPE="pointToPoint" )
     try:
-        intentNumActual = jsonResult['installed']
+        intentNumActual = jsonResult[ 'installed' ]
     except TypeError as e:
         intentNumActual = -1
         main.log.error( e )
 
     if intentNumActual != intentNumExpected:
         time.sleep( wait )
-        jsonResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat = True, summary = True,
-                                                           TYPE = "pointToPoint" )
+        jsonResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat=True, summary=True,
+                                                           TYPE="pointToPoint" )
         try:
-            intentNumActual = jsonResult['installed']
+            intentNumActual = jsonResult[ 'installed' ]
         except TypeError as e:
             intentNumActual = -1
             main.log.error( e )
     main.log.info( "Intent number expected: {}".format( intentNumExpected ) )
     main.log.info( "Intent number from ONOS CLI: {}".format( intentNumActual ) )
-    utilities.assertEquals( \
-        expect = intentNumExpected, actual = intentNumActual,
-        onpass = "P2P intent number is correct!",
-        onfail = "P2P intent number is wrong!" )
+    utilities.assertEquals(
+        expect=intentNumExpected, actual=intentNumActual,
+        onpass="P2P intent number is correct!",
+        onfail="P2P intent number is wrong!" )
+
 
 def checkFlowNum( main, switch, flowNumExpected ):
     import time
     main.step( "Check flow entry number in " + switch )
-    wait = int( main.params['timers']['PathAvailable'] )
+    wait = int( main.params[ 'timers' ][ 'PathAvailable' ] )
     main.log.info( "Flow number expected: {}".format( flowNumExpected ) )
     flowNumActual = main.Mininet.getSwitchFlowCount( switch )
-    if flowNumActual != flowNumExpected :
+    if flowNumActual != flowNumExpected:
         time.sleep( wait )
         flowNumActual = main.Mininet.getSwitchFlowCount( switch )
     main.log.info( "Flow number actual: {}".format( flowNumActual ) )
-    utilities.assertEquals( \
-        expect = flowNumExpected, actual = flowNumActual,
-        onpass = "Flow number in " + switch + " is correct!",
-        onfail = "Flow number in " + switch + " is wrong!" )
+    utilities.assertEquals(
+        expect=flowNumExpected, actual=flowNumActual,
+        onpass="Flow number in " + switch + " is correct!",
+        onfail="Flow number in " + switch + " is wrong!" )
 
 
-def pingSpeakerToPeer( main, speakers = [ "spk1" ],
-                       peers = [ "peer64514", "peer64515", "peer64516" ],
-                       expectAllSuccess = True ):
+def pingSpeakerToPeer( main, speakers=[ "spk1" ],
+                       peers=[ "peer64514", "peer64515", "peer64516" ],
+                       expectAllSuccess=True ):
     """
     Carry out ping test between each BGP speaker and peer pair
     Optional argument:
@@ -135,26 +137,26 @@
     if expectAllSuccess:
         for speaker in speakers:
             for peer in peers:
-                tmpResult = main.Mininet.pingHost( src = speaker,
-                                                   target = peer )
+                tmpResult = main.Mininet.pingHost( src=speaker,
+                                                   target=peer )
                 result = result and ( tmpResult == main.TRUE )
     else:
         for speaker in speakers:
             for peer in peers:
-                tmpResult = main.Mininet.pingHost( src = speaker,
-                                                   target = peer )
+                tmpResult = main.Mininet.pingHost( src=speaker,
+                                                   target=peer )
 
-    utilities.assert_equals( expect = True, actual = result,
-                             onpass = "Ping test results are expected",
-                             onfail = "Ping test results are Not expected" )
+    utilities.assert_equals( expect=True, actual=result,
+                             onpass="Ping test results are expected",
+                             onfail="Ping test results are Not expected" )
 
-    if result == False:
+    if not result:
         main.cleanAndExit()
 
 
 def pingHostToHost( main,
-                    hosts = [ "h64514", "h64515", "h64516" ],
-                expectAllSuccess = True ):
+                    hosts=[ "h64514", "h64515", "h64516" ],
+                    expectAllSuccess=True ):
     """
     Carry out ping test between each BGP host pair
     Optional argument:
@@ -173,23 +175,22 @@
         for srcHost in hosts:
             for targetHost in hosts:
                 if srcHost != targetHost:
-                    tmpResult = main.Mininet.pingHost( src = srcHost,
-                                                       target = targetHost )
+                    tmpResult = main.Mininet.pingHost( src=srcHost,
+                                                       target=targetHost )
                     result = result and ( tmpResult == main.TRUE )
     else:
         for srcHost in hosts:
             for targetHost in hosts:
                 if srcHost != targetHost:
-                    tmpResult = main.Mininet.pingHost( src = srcHost,
-                                                       target = targetHost )
+                    tmpResult = main.Mininet.pingHost( src=srcHost,
+                                                       target=targetHost )
                     result = result and ( tmpResult == main.FALSE )
 
-    utilities.assert_equals( expect = True, actual = result,
-                             onpass = "Ping test results are expected",
-                             onfail = "Ping test results are Not expected" )
+    utilities.assert_equals( expect=True, actual=result,
+                             onpass="Ping test results are expected",
+                             onfail="Ping test results are Not expected" )
 
-    '''
+    """
     if result == False:
         main.cleanAndExit()
-    '''
-
+    """
diff --git a/TestON/tests/USECASE/USECASE_SdnipFunction/dependencies/USECASE_SdnipI2MN.py b/TestON/tests/USECASE/USECASE_SdnipFunction/dependencies/USECASE_SdnipI2MN.py
old mode 100755
new mode 100644
index deced6b..23607ad
--- a/TestON/tests/USECASE/USECASE_SdnipFunction/dependencies/USECASE_SdnipI2MN.py
+++ b/TestON/tests/USECASE/USECASE_SdnipFunction/dependencies/USECASE_SdnipI2MN.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,18 +20,15 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Set up the SDN-IP topology as same as it on Internet2
 """
-
 """
-AS 64513, (SDN AS)
+AS 64513, ( SDN AS )
 AS 64514, reachable by 10.0.4.1
 AS 64515, reachable by 10.0.5.1
 AS 64516, reachable by 10.0.6.1
 """
-
 from mininet.net import Mininet
 from mininet.log import setLogLevel, info
 from mininet.cli import CLI
@@ -45,13 +42,15 @@
 # onos1IP = '10.254.1.201'
 numSw = 39
 
+
 class VLANHost( Host ):
+
     def config( self, vlan=100, intfName=None, **params ):
         r = super( Host, self ).config( **params )
         intf = self.intf( intfName )
         self.cmd( 'ifconfig %s inet 0' % intf )
         self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
-        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params[ 'ip' ] ) )
         newName = '%s.%d' % ( intf, vlan )
         intf.name = newName
         self.nameToIntf[ newName ] = intf
@@ -59,6 +58,7 @@
 
 
 class SDNTopo( Topo ):
+
     "SDN Topology"
 
     def __init__( self, *args, **kwargs ):
@@ -75,107 +75,105 @@
         p64519 = self.addHost( 'p64519', cls=VLANHost, vlan=10 )
         p64520 = self.addHost( 'p64520', cls=VLANHost, vlan=10 )
 
-        '''
-        sw1 = self.addSwitch( 'SEAT', dpid = '00000000000000a1' )
-        sw2 = self.addSwitch( 'PORT', dpid = '00000000000000a2' )
-        sw3 = self.addSwitch( 'SUNN', dpid = '00000000000000a3' )
-        sw4 = self.addSwitch( 'RENO', dpid = '00000000000000a4' )
-        sw5 = self.addSwitch( 'LOSA', dpid = '00000000000000a5' )
-        sw6 = self.addSwitch( 'MISS', dpid = '00000000000000a6' )
-        sw7 = self.addSwitch( 'LASV', dpid = '00000000000000a7' )
-        sw8 = self.addSwitch( 'SALT', dpid = '00000000000000a8' )
-        sw9 = self.addSwitch( 'PHOE', dpid = '00000000000000a9' )
-        sw10 = self.addSwitch( 'TUCS', dpid = '0000000000000a10' )
-        sw11 = self.addSwitch( 'DENV', dpid = '0000000000000a11' )
-        sw12 = self.addSwitch( 'ELPA', dpid = '0000000000000a12' )
-        sw13 = self.addSwitch( 'MINN', dpid = '0000000000000a13' )
-        sw14 = self.addSwitch( 'KANS', dpid = '0000000000000a14' )
-        sw15 = self.addSwitch( 'TULS', dpid = '0000000000000a15' )
-        sw16 = self.addSwitch( 'DALL', dpid = '0000000000000a16' )
-        sw17 = self.addSwitch( 'HOUH', dpid = '0000000000000a17' )
-        sw18 = self.addSwitch( 'COLU', dpid = '0000000000000a18' )
-        sw19 = self.addSwitch( 'JCSN', dpid = '0000000000000a19' )
-        sw20 = self.addSwitch( 'BATO', dpid = '0000000000000a20' )
-        sw21 = self.addSwitch( 'EQCH', dpid = '0000000000000a21' )
-        sw22 = self.addSwitch( 'STAR', dpid = '0000000000000a22' )
-        sw23 = self.addSwitch( 'CHIC', dpid = '0000000000000a23' )
-        sw24 = self.addSwitch( 'INDI', dpid = '0000000000000a24' )
-        sw25 = self.addSwitch( 'CINC', dpid = '0000000000000a25' )
-        sw26 = self.addSwitch( 'LOUI', dpid = '0000000000000a26' )
-        sw27 = self.addSwitch( 'ATLA', dpid = '0000000000000a27' )
-        sw28 = self.addSwitch( 'JACK', dpid = '0000000000000a28' )
-        sw29 = self.addSwitch( 'CLEV', dpid = '0000000000000a29' )
-        sw30 = self.addSwitch( 'PITT', dpid = '0000000000000a30' )
-        sw31 = self.addSwitch( 'ASHB', dpid = '0000000000000a31' )
-        sw32 = self.addSwitch( 'WASH', dpid = '0000000000000a32' )
-        sw33 = self.addSwitch( 'RALE', dpid = '0000000000000a33' )
-        sw34 = self.addSwitch( 'CHAR', dpid = '0000000000000a34' )
-        sw35 = self.addSwitch( 'ALBA', dpid = '0000000000000a35' )
-        sw36 = self.addSwitch( 'BOST', dpid = '0000000000000a36' )
-        sw37 = self.addSwitch( 'HART', dpid = '0000000000000a37' )
-        sw38 = self.addSwitch( 'NEWY', dpid = '0000000000000a38' )
-        sw39 = self.addSwitch( 'PHIL', dpid = '0000000000000a39' )
-        '''
-        sw1 = self.addSwitch( 'sw1', dpid = '00000000000000a1' )
-        sw2 = self.addSwitch( 'sw2', dpid = '00000000000000a2' )
-        sw3 = self.addSwitch( 'sw3', dpid = '00000000000000a3' )
-        sw4 = self.addSwitch( 'sw4', dpid = '00000000000000a4' )
-        sw5 = self.addSwitch( 'sw5', dpid = '00000000000000a5' )
-        sw6 = self.addSwitch( 'sw6', dpid = '00000000000000a6' )
-        sw7 = self.addSwitch( 'sw7', dpid = '00000000000000a7' )
-        sw8 = self.addSwitch( 'sw8', dpid = '00000000000000a8' )
-        sw9 = self.addSwitch( 'sw9', dpid = '00000000000000a9' )
-        sw10 = self.addSwitch( 'sw10', dpid = '0000000000000a10' )
-        sw11 = self.addSwitch( 'sw11', dpid = '0000000000000a11' )
-        sw12 = self.addSwitch( 'sw12', dpid = '0000000000000a12' )
-        sw13 = self.addSwitch( 'sw13', dpid = '0000000000000a13' )
-        sw14 = self.addSwitch( 'sw14', dpid = '0000000000000a14' )
-        sw15 = self.addSwitch( 'sw15', dpid = '0000000000000a15' )
-        sw16 = self.addSwitch( 'sw16', dpid = '0000000000000a16' )
-        sw17 = self.addSwitch( 'sw17', dpid = '0000000000000a17' )
-        sw18 = self.addSwitch( 'sw18', dpid = '0000000000000a18' )
-        sw19 = self.addSwitch( 'sw19', dpid = '0000000000000a19' )
-        sw20 = self.addSwitch( 'sw20', dpid = '0000000000000a20' )
-        sw21 = self.addSwitch( 'sw21', dpid = '0000000000000a21' )
-        sw22 = self.addSwitch( 'sw22', dpid = '0000000000000a22' )
-        sw23 = self.addSwitch( 'sw23', dpid = '0000000000000a23' )
-        sw24 = self.addSwitch( 'sw24', dpid = '0000000000000a24' )
-        sw25 = self.addSwitch( 'sw25', dpid = '0000000000000a25' )
-        sw26 = self.addSwitch( 'sw26', dpid = '0000000000000a26' )
-        sw27 = self.addSwitch( 'sw27', dpid = '0000000000000a27' )
-        sw28 = self.addSwitch( 'sw28', dpid = '0000000000000a28' )
-        sw29 = self.addSwitch( 'sw29', dpid = '0000000000000a29' )
-        sw30 = self.addSwitch( 'sw30', dpid = '0000000000000a30' )
-        sw31 = self.addSwitch( 'sw31', dpid = '0000000000000a31' )
-        sw32 = self.addSwitch( 'sw32', dpid = '0000000000000a32' )
-        sw33 = self.addSwitch( 'sw33', dpid = '0000000000000a33' )
-        sw34 = self.addSwitch( 'sw34', dpid = '0000000000000a34' )
-        sw35 = self.addSwitch( 'sw35', dpid = '0000000000000a35' )
-        sw36 = self.addSwitch( 'sw36', dpid = '0000000000000a36' )
-        sw37 = self.addSwitch( 'sw37', dpid = '0000000000000a37' )
-        sw38 = self.addSwitch( 'sw38', dpid = '0000000000000a38' )
-        sw39 = self.addSwitch( 'sw39', dpid = '0000000000000a39' )
-
+        """
+        sw1 = self.addSwitch( 'SEAT', dpid='00000000000000a1' )
+        sw2 = self.addSwitch( 'PORT', dpid='00000000000000a2' )
+        sw3 = self.addSwitch( 'SUNN', dpid='00000000000000a3' )
+        sw4 = self.addSwitch( 'RENO', dpid='00000000000000a4' )
+        sw5 = self.addSwitch( 'LOSA', dpid='00000000000000a5' )
+        sw6 = self.addSwitch( 'MISS', dpid='00000000000000a6' )
+        sw7 = self.addSwitch( 'LASV', dpid='00000000000000a7' )
+        sw8 = self.addSwitch( 'SALT', dpid='00000000000000a8' )
+        sw9 = self.addSwitch( 'PHOE', dpid='00000000000000a9' )
+        sw10 = self.addSwitch( 'TUCS', dpid='0000000000000a10' )
+        sw11 = self.addSwitch( 'DENV', dpid='0000000000000a11' )
+        sw12 = self.addSwitch( 'ELPA', dpid='0000000000000a12' )
+        sw13 = self.addSwitch( 'MINN', dpid='0000000000000a13' )
+        sw14 = self.addSwitch( 'KANS', dpid='0000000000000a14' )
+        sw15 = self.addSwitch( 'TULS', dpid='0000000000000a15' )
+        sw16 = self.addSwitch( 'DALL', dpid='0000000000000a16' )
+        sw17 = self.addSwitch( 'HOUH', dpid='0000000000000a17' )
+        sw18 = self.addSwitch( 'COLU', dpid='0000000000000a18' )
+        sw19 = self.addSwitch( 'JCSN', dpid='0000000000000a19' )
+        sw20 = self.addSwitch( 'BATO', dpid='0000000000000a20' )
+        sw21 = self.addSwitch( 'EQCH', dpid='0000000000000a21' )
+        sw22 = self.addSwitch( 'STAR', dpid='0000000000000a22' )
+        sw23 = self.addSwitch( 'CHIC', dpid='0000000000000a23' )
+        sw24 = self.addSwitch( 'INDI', dpid='0000000000000a24' )
+        sw25 = self.addSwitch( 'CINC', dpid='0000000000000a25' )
+        sw26 = self.addSwitch( 'LOUI', dpid='0000000000000a26' )
+        sw27 = self.addSwitch( 'ATLA', dpid='0000000000000a27' )
+        sw28 = self.addSwitch( 'JACK', dpid='0000000000000a28' )
+        sw29 = self.addSwitch( 'CLEV', dpid='0000000000000a29' )
+        sw30 = self.addSwitch( 'PITT', dpid='0000000000000a30' )
+        sw31 = self.addSwitch( 'ASHB', dpid='0000000000000a31' )
+        sw32 = self.addSwitch( 'WASH', dpid='0000000000000a32' )
+        sw33 = self.addSwitch( 'RALE', dpid='0000000000000a33' )
+        sw34 = self.addSwitch( 'CHAR', dpid='0000000000000a34' )
+        sw35 = self.addSwitch( 'ALBA', dpid='0000000000000a35' )
+        sw36 = self.addSwitch( 'BOST', dpid='0000000000000a36' )
+        sw37 = self.addSwitch( 'HART', dpid='0000000000000a37' )
+        sw38 = self.addSwitch( 'NEWY', dpid='0000000000000a38' )
+        sw39 = self.addSwitch( 'PHIL', dpid='0000000000000a39' )
+        """
+        sw1 = self.addSwitch( 'sw1', dpid='00000000000000a1' )
+        sw2 = self.addSwitch( 'sw2', dpid='00000000000000a2' )
+        sw3 = self.addSwitch( 'sw3', dpid='00000000000000a3' )
+        sw4 = self.addSwitch( 'sw4', dpid='00000000000000a4' )
+        sw5 = self.addSwitch( 'sw5', dpid='00000000000000a5' )
+        sw6 = self.addSwitch( 'sw6', dpid='00000000000000a6' )
+        sw7 = self.addSwitch( 'sw7', dpid='00000000000000a7' )
+        sw8 = self.addSwitch( 'sw8', dpid='00000000000000a8' )
+        sw9 = self.addSwitch( 'sw9', dpid='00000000000000a9' )
+        sw10 = self.addSwitch( 'sw10', dpid='0000000000000a10' )
+        sw11 = self.addSwitch( 'sw11', dpid='0000000000000a11' )
+        sw12 = self.addSwitch( 'sw12', dpid='0000000000000a12' )
+        sw13 = self.addSwitch( 'sw13', dpid='0000000000000a13' )
+        sw14 = self.addSwitch( 'sw14', dpid='0000000000000a14' )
+        sw15 = self.addSwitch( 'sw15', dpid='0000000000000a15' )
+        sw16 = self.addSwitch( 'sw16', dpid='0000000000000a16' )
+        sw17 = self.addSwitch( 'sw17', dpid='0000000000000a17' )
+        sw18 = self.addSwitch( 'sw18', dpid='0000000000000a18' )
+        sw19 = self.addSwitch( 'sw19', dpid='0000000000000a19' )
+        sw20 = self.addSwitch( 'sw20', dpid='0000000000000a20' )
+        sw21 = self.addSwitch( 'sw21', dpid='0000000000000a21' )
+        sw22 = self.addSwitch( 'sw22', dpid='0000000000000a22' )
+        sw23 = self.addSwitch( 'sw23', dpid='0000000000000a23' )
+        sw24 = self.addSwitch( 'sw24', dpid='0000000000000a24' )
+        sw25 = self.addSwitch( 'sw25', dpid='0000000000000a25' )
+        sw26 = self.addSwitch( 'sw26', dpid='0000000000000a26' )
+        sw27 = self.addSwitch( 'sw27', dpid='0000000000000a27' )
+        sw28 = self.addSwitch( 'sw28', dpid='0000000000000a28' )
+        sw29 = self.addSwitch( 'sw29', dpid='0000000000000a29' )
+        sw30 = self.addSwitch( 'sw30', dpid='0000000000000a30' )
+        sw31 = self.addSwitch( 'sw31', dpid='0000000000000a31' )
+        sw32 = self.addSwitch( 'sw32', dpid='0000000000000a32' )
+        sw33 = self.addSwitch( 'sw33', dpid='0000000000000a33' )
+        sw34 = self.addSwitch( 'sw34', dpid='0000000000000a34' )
+        sw35 = self.addSwitch( 'sw35', dpid='0000000000000a35' )
+        sw36 = self.addSwitch( 'sw36', dpid='0000000000000a36' )
+        sw37 = self.addSwitch( 'sw37', dpid='0000000000000a37' )
+        sw38 = self.addSwitch( 'sw38', dpid='0000000000000a38' )
+        sw39 = self.addSwitch( 'sw39', dpid='0000000000000a39' )
 
         # Add a layer2 switch for control plane connectivity
         # This switch isn't part of the SDN topology
         # We'll use the ovs-controller to turn this into a learning switch
-        swCtl100 = self.addSwitch( 'swCtl100', dpid = '0000000000000100' )
-
+        swCtl100 = self.addSwitch( 'swCtl100', dpid='0000000000000100' )
 
         # BGP speaker hosts
         spk1 = self.addHost( 'spk1' )
         spk2 = self.addHost( 'spk2', cls=VLANHost, vlan=20 )
         spk3 = self.addHost( 'spk3', cls=VLANHost, vlan=10 )
 
-        root = self.addHost( 'root', inNamespace = False , ip = '0' )
+        root = self.addHost( 'root', inNamespace=False, ip='0' )
 
         # hosts behind each AS
         h64514 = self.addHost( 'h64514' )
         h64515 = self.addHost( 'h64515' )
         h64516 = self.addHost( 'h64516' )
 
-        #VLAN hosts behind each AS
+        # VLAN hosts behind each AS
         h64517 = self.addHost( 'h64517', cls=VLANHost, vlan=20 )
         h64518 = self.addHost( 'h64518', cls=VLANHost, vlan=20 )
         h64519 = self.addHost( 'h64519', cls=VLANHost, vlan=10 )
@@ -257,7 +255,6 @@
         self.addLink( p64519, h64519 )
         self.addLink( p64520, h64520 )
 
-
         # Internal Connection To Hosts
         self.addLink( swCtl100, p64514 )
         self.addLink( swCtl100, p64515 )
@@ -272,7 +269,6 @@
         self.addLink( swCtl100, spk2 )
         self.addLink( swCtl100, spk3 )
 
-
         # add h64514 to control plane for ping test
         self.addLink( swCtl100, h64514 )
         self.addLink( swCtl100, h64517 )
@@ -289,23 +285,26 @@
     host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
     info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
 
-def startsshds ( hosts ):
+
+def startsshds( hosts ):
     for h in hosts:
         startsshd( h )
 
+
 def stopsshd():
     "Stop *all* sshd processes with a custom banner"
     info( '*** Shutting down stale sshd/Banner processes ',
           quietRun( "pkill -9 -f Banner" ), '\n' )
 
+
 def startquagga( host, num, config_file ):
     info( '*** Starting Quagga on %s\n' % host )
     host.cmd( "cd %s" % QUAGGA_CONFIG_DIR )
     zebra_cmd = \
-    '%s/zebra -d -f  ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid'\
+        '%s/zebra -d -f  ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid'\
      % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
     quagga_cmd = '%s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' \
-    % ( QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
+        % ( QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
 
     print zebra_cmd
     print quagga_cmd
@@ -313,32 +312,34 @@
     host.cmd( zebra_cmd )
     host.cmd( quagga_cmd )
 
+
 def startquaggahost5( host, num ):
     info( '*** Starting Quagga on %s\n' % host )
     zebra_cmd = \
-    '%s/zebra -d -f  ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' \
-    % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
+        '%s/zebra -d -f  ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' \
+        % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
     quagga_cmd = \
-    '%s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid'\
+        '%s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid'\
      % ( QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
 
     host.cmd( zebra_cmd )
     host.cmd( quagga_cmd )
 
+
 def stopquagga():
     quietRun( 'sudo pkill -9 -f bgpd' )
     quietRun( 'sudo pkill -9 -f zebra' )
 
+
 def sdn1net():
     topo = SDNTopo()
     info( '*** Creating network\n' )
-   # time.sleep( 30 )
-    net = Mininet( topo = topo, controller = RemoteController )
-
+    # time.sleep( 30 )
+    net = Mininet( topo=topo, controller=RemoteController )
 
     spk1, spk2, spk3, p64514, p64515, p64516, p64517, p64518, p64519, p64520 = \
-    net.get( 'spk1', 'spk2', 'spk3',
-             'p64514', 'p64515', 'p64516', 'p64517', 'p64518', 'p64519', 'p64520' )
+        net.get( 'spk1', 'spk2', 'spk3',
+                 'p64514', 'p64515', 'p64516', 'p64517', 'p64518', 'p64519', 'p64520' )
 
     # Adding addresses to host64513_1 interface connected to sw24
     # for BGP peering
@@ -405,7 +406,6 @@
     p64520.setIP( "20.0.0.254", 8, "p64520-eth1.10" )
     p64520.setMAC( '00:00:00:00:00:20', 'p64520-eth1.10' )
 
-
     # enable forwarding on BGP peer hosts
     p64514.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
     p64515.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
@@ -428,7 +428,7 @@
 
     # Setup hosts in each non-SDN AS
     h64514, h64515, h64516, h64517, h64518, h64519, h64520 = \
-    net.get( 'h64514', 'h64515', 'h64516', 'h64517', 'h64518', 'h64519', 'h64520' )
+        net.get( 'h64514', 'h64515', 'h64516', 'h64517', 'h64518', 'h64519', 'h64520' )
     h64514.cmd( 'ifconfig h64514-eth0 4.0.0.1 up' )
     h64514.cmd( 'ip route add default via 4.0.0.254' )
     h64514.setIP( '192.168.0.44', 24, 'h64514-eth1' )  # for control plane
@@ -455,16 +455,16 @@
     swCtl100.cmd( 'ovs-vsctl set-fail-mode swCtl100 standalone' )
 
     # connect all switches to controller
-    '''
+    """
     for i in range ( 1, numSw + 1 ):
         swX = net.get( 'sw%s' % ( i ) )
         swX.cmd( 'ovs-vsctl set-controller sw%s tcp:%s:6653' % ( i, onos1IP ) )
-    '''
+    """
     # Start Quagga as the external BGP routers
-    '''
+    """
     for i in range ( 64514, 64516 + 1 ):
         startquagga( 'peer%s' % ( i ), i, 'quagga%s.conf' % ( i ) )
-    '''
+    """
     startquagga( p64514, 64514, 'quagga64514.conf' )
     startquagga( p64515, 64515, 'quagga64515.conf' )
     startquagga( p64516, 64516, 'quagga64516.conf' )
@@ -491,19 +491,18 @@
     stopsshd()
 
     hosts = [ p64514, p64515, p64516, p64517, p64518, p64519, p64520,
-              h64514, h64517, h64519 ];
+              h64514, h64517, h64519 ]
     startsshds( hosts )
     #
-    '''
+    """
     forwarding1 = '%s:2000:%s:2000' % ( '1.1.1.2', onos1IP )
     root.cmd( 'ssh -nNT -o "PasswordAuthentication no" \
     -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % ( forwarding1, onos1IP ) )
 
-    '''
+    """
     # time.sleep( 3000000000 )
     CLI( net )
 
-
     stopsshd()
     stopquagga()
     net.stop()
diff --git a/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/USECASE_SdnipFunctionCluster.py b/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/USECASE_SdnipFunctionCluster.py
index d058a85..499df34 100644
--- a/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/USECASE_SdnipFunctionCluster.py
+++ b/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/USECASE_SdnipFunctionCluster.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,8 +18,9 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # Testing the functionality of SDN-IP with single ONOS instance
+
+
 class USECASE_SdnipFunctionCluster:
 
     def __init__( self ):
@@ -50,7 +51,7 @@
 
         # connect all switches to controllers
         swResult = main.TRUE
-        for i in range ( 1, int( main.params['config']['switchNum'] ) + 1 ):
+        for i in range( 1, int( main.params[ 'config' ][ 'switchNum' ] ) + 1 ):
             sw = "sw%s" % ( i )
             swResult = swResult and \
                        main.Mininet.assignSwController( sw, main.Cluster.getIps() )
@@ -61,7 +62,6 @@
         if not swResult:
             main.cleanAndExit()
 
-
     def CASE101( self, main ):
         """
            Package ONOS and install it
@@ -98,7 +98,7 @@
     def CASE200( self, main ):
         main.case( "Activate sdn-ip application" )
         main.log.info( "waiting link discovery......" )
-        time.sleep( int( main.params['timers']['TopoDiscovery'] ) )
+        time.sleep( int( main.params[ 'timers' ][ 'TopoDiscovery' ] ) )
 
         main.step( "Get links in the network" )
         summaryResult = main.Cluster.active( 0 ).CLI.summary()
@@ -106,7 +106,7 @@
         main.log.info( "Expected 100 links, actual number is: {}".format( linkNum ) )
         if linkNum < 100:
             main.log.error( "Link number is wrong! Retrying..." )
-            time.sleep( int( main.params['timers']['TopoDiscovery'] ) )
+            time.sleep( int( main.params[ 'timers' ][ 'TopoDiscovery' ] ) )
             summaryResult = main.Cluster.active( 0 ).CLI.summary()
             linkNum = json.loads( summaryResult )[ "links" ]
         main.log.info( "Expected 100 links, actual number is: {}".format( linkNum ) )
@@ -128,10 +128,10 @@
             main.cleanAndExit()
 
     def CASE102( self, main ):
-        '''
+        """
         This test case is to load the methods from other Python files, and create
         tunnels from mininet host to onos nodes.
-        '''
+        """
         import time
         main.case( "Load methods from other Python file and create tunnels" )
         # load the methods from other file
@@ -141,7 +141,7 @@
                                           wrapperFile1 +
                                           ".py" )
         # Create tunnels
-        for i in range ( main.Cluster.numCtrls ):
+        for i in range( main.Cluster.numCtrls ):
             main.Functions.setupTunnel( main,
                                         '1.1.1.' + str( ( i + 1 ) * 2 ),
                                         2000,
@@ -156,16 +156,15 @@
         time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
 
     def CASE1( self, main ):
-        '''
+        """
         ping test from 3 bgp peers to BGP speaker
-        '''
-
+        """
         main.case( "Ping between BGP peers and speakers" )
         main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
                                           peers=[ "p64514", "p64515", "p64516" ],
                                           expectAllSuccess=True )
 
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk2"],
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk2" ],
                                           peers=[ p64514, p64515, p64516 ],
                                           expectAllSuccess=True )
 
@@ -178,15 +177,15 @@
                                           expectAllSuccess=True )
 
     def CASE2( self, main ):
-        '''
+        """
         point-to-point intents test for each BGP peer and BGP speaker pair
-        '''
+        """
         main.sdnBase.pToPIntentTest( 12 )
 
     def CASE3( self, main ):
-        '''
+        """
         routes and intents check to all BGP peers
-        '''
+        """
         import time
         main.case( "Check routes and M2S intents to all BGP peers" )
 
@@ -202,44 +201,43 @@
 
         main.sdnBase.routeAndIntentCheck( allRoutesExpected, 7 )
 
-
     def CASE4( self, main ):
-        '''
+        """
         Ping test in data plane for each route
-        '''
+        """
         main.case( "Ping test for each route, all hosts behind BGP peers" )
         main.Functions.pingHostToHost( main,
-                        hosts=["h64514", "h64515", "h64516"],
-                        expectAllSuccess=True )
-        main.Functions.pingHostToHost(main,
-                                      hosts=["h64517", "h64518"],
-                                      expectAllSuccess=True)
+                                       hosts=[ "h64514", "h64515", "h64516" ],
+                                       expectAllSuccess=True )
+        main.Functions.pingHostToHost( main,
+                                       hosts=[ "h64517", "h64518" ],
+                                       expectAllSuccess=True )
         main.Functions.pingHostToHost( main,
                                        hosts=[ "h64519", "h64520" ],
                                        expectAllSuccess=True )
 
     def CASE5( self, main ):
-        '''
+        """
         Cut links to peers one by one, check routes/intents
-        '''
+        """
         main.sdnBase.linkUpDownCheck( "p64514", "p64515", "p64516",
                                       6, 6, 5, 5, 4, 4,
                                       "spk1", [ "h64514", "h64515", "h64516" ],
                                       "down" )
 
     def CASE6( self, main ):
-        '''
+        """
         Recover links to peers one by one, check routes/intents
-        '''
+        """
         main.sdnBase.linkUpDownCheck( "p64514", "p64515", "p64516",
                                       5, 5, 6, 6, 7, 7,
                                       "spk1", [ "h64514", "h64515", "h64516" ],
                                       "up" )
 
     def CASE7( self, main ):
-        '''
+        """
         Shut down a edge switch, check P-2-P and M-2-S intents, ping test
-        '''
+        """
         import time
         main.case( "Stop edge sw32,check P-2-P and M-2-S intents, ping test" )
         main.step( "Stop sw32" )
@@ -252,7 +250,7 @@
             time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
             main.Functions.checkRouteNum( main, 6 )
             main.Functions.checkM2SintentNum( main, 6 )
-            main.Functions.checkP2PintentNum( main, 48 ) #14 * 2
+            main.Functions.checkP2PintentNum( main, 48 )  # 14 * 2
         else:
             main.log.error( "Stopping switch failed!" )
             main.cleanAndExit()
@@ -268,7 +266,7 @@
                                  onpass="Ping test result is correct",
                                  onfail="Ping test result is wrong" )
 
-        if pingResult1 == False:
+        if not pingResult1:
             main.cleanAndExit()
 
         main.step( "Check ping between BGP peers and spk1" )
@@ -282,7 +280,7 @@
                                  onpass="Speaker1 ping peers successful",
                                  onfail="Speaker1 ping peers NOT successful" )
 
-        if pingResult2 == False:
+        if not pingResult2:
             main.cleanAndExit()
 
         main.step( "Check ping between BGP peers and spk2" )
@@ -297,13 +295,13 @@
                                  onpass="Speaker2 ping peers successful",
                                  onfail="Speaker2 ping peers NOT successful" )
 
-        if pingResult3 == False:
+        if not pingResult3:
             main.cleanAndExit()
 
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=flowCheck,
@@ -311,10 +309,10 @@
                                  onfail="Flow status is wrong!" )
 
     def CASE8( self, main ):
-        '''
-        Bring up the edge switch (sw32) which was shut down in CASE7,
+        """
+        Bring up the edge switch ( sw32 ) which was shut down in CASE7,
         check P-2-P and M-2-S intents, ping test
-        '''
+        """
         import time
         main.case( "Start the edge sw32, check P-2-P and M-2-S intents, ping test" )
         main.step( "Start sw32" )
@@ -334,7 +332,7 @@
             time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
             main.Functions.checkRouteNum( main, 7 )
             main.Functions.checkM2SintentNum( main, 7 )
-            main.Functions.checkP2PintentNum( main, 30 * 2 ) # 18*2
+            main.Functions.checkP2PintentNum( main, 30 * 2 )  # 18*2
         else:
             main.log.error( "Starting switch failed!" )
             main.cleanAndExit()
@@ -342,7 +340,7 @@
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=flowCheck,
@@ -351,7 +349,7 @@
 
         # Ping test
         main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
-                                          peers=["p64514", "p64515", "p64516"],
+                                          peers=[ "p64514", "p64515", "p64516" ],
                                           expectAllSuccess=True )
 
         main.Functions.pingSpeakerToPeer( main, speakers=[ "spk2" ],
@@ -363,10 +361,10 @@
                                        expectAllSuccess=True )
 
     def CASE9( self, main ):
-        '''
+        """
         Bring down a switch in best path, check:
         route number, P2P intent number, M2S intent number, ping test
-        '''
+        """
         main.case( "Stop sw11 located in best path, \
         check route number, P2P intent number, M2S intent number, ping test" )
 
@@ -388,7 +386,7 @@
             time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
             main.Functions.checkRouteNum( main, 7 )
             main.Functions.checkM2SintentNum( main, 7 )
-            main.Functions.checkP2PintentNum( main, 30 * 2 ) #18 * 2
+            main.Functions.checkP2PintentNum( main, 30 * 2 )  # 18 * 2
         else:
             main.log.error( "Stopping switch failed!" )
             main.cleanAndExit()
@@ -396,29 +394,28 @@
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=flowCheck,
                                  onpass="Flow status is correct!",
                                  onfail="Flow status is wrong!" )
         # Ping test
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk1"],
-                       peers=["p64514", "p64515", "p64516"],
-                       expectAllSuccess=True )
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk2"],
-                       peers=[p64514, p64515, p64516],
-                       expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
+                                          peers=[ "p64514", "p64515", "p64516" ],
+                                          expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk2" ],
+                                          peers=[ p64514, p64515, p64516 ],
+                                          expectAllSuccess=True )
         main.Functions.pingHostToHost( main,
-                        hosts=["h64514", "h64515", "h64516"],
-                        expectAllSuccess=True )
-
+                                       hosts=[ "h64514", "h64515", "h64516" ],
+                                       expectAllSuccess=True )
 
     def CASE10( self, main ):
-        '''
+        """
         Bring up the switch which was stopped in CASE9, check:
         route number, P2P intent number, M2S intent number, ping test
-        '''
+        """
         main.case( "Start sw11 which was stopped in CASE9, \
         check route number, P2P intent number, M2S intent number, ping test" )
 
@@ -453,25 +450,24 @@
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=flowCheck,
                                  onpass="Flow status is correct!",
                                  onfail="Flow status is wrong!" )
         # Ping test
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk1"],
-                       peers=["p64514", "p64515", "p64516"],
-                       expectAllSuccess=True )
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk2"],
-                       peers=[p64514, p64515, p64516],
-                       expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
+                                          peers=[ "p64514", "p64515", "p64516" ],
+                                          expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk2" ],
+                                          peers=[ p64514, p64515, p64516 ],
+                                          expectAllSuccess=True )
         main.Functions.pingHostToHost( main,
-                        hosts=["h64514", "h64515", "h64516"],
-                        expectAllSuccess=True )
+                                       hosts=[ "h64514", "h64515", "h64516" ],
+                                       expectAllSuccess=True )
 
-
-    def CASE11(self, main):
+    def CASE11( self, main ):
         import time
         main.case( "Kill spk1, check:\
         route number, P2P intent number, M2S intent number, ping test" )
@@ -482,22 +478,22 @@
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=flowCheck,
                                  onpass="Flow status is correct!",
                                  onfail="Flow status is wrong!" )
 
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk1"],
-                       peers=["p64514", "p64515", "p64516"],
-                       expectAllSuccess=True )
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk2"],
-                       peers=[p64514, p64515, p64516],
-                       expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
+                                          peers=[ "p64514", "p64515", "p64516" ],
+                                          expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk2" ],
+                                          peers=[ p64514, p64515, p64516 ],
+                                          expectAllSuccess=True )
         main.Functions.pingHostToHost( main,
-                        hosts=["h64514", "h64515", "h64516"],
-                        expectAllSuccess=True )
+                                       hosts=[ "h64514", "h64515", "h64516" ],
+                                       expectAllSuccess=True )
 
         main.step( "Kill spk1" )
         command1 = "ps -e | grep bgp -c"
@@ -519,7 +515,7 @@
                                  actual=( "4" in result3 ),
                                  onpass="Kill spk1 succeeded",
                                  onfail="Kill spk1 failed" )
-        if ( "4" not in result3 ) :
+        if ( "4" not in result3 ):
             main.log.info( result3 )
             main.cleanAndExit()
 
@@ -531,25 +527,24 @@
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=flowCheck,
                                  onpass="Flow status is correct!",
                                  onfail="Flow status is wrong!" )
 
-        '''
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk1"],
-                       peers=["p64514", "p64515", "p64516"],
+        """
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
+                       peers=[ "p64514", "p64515", "p64516" ],
                        expectAllSuccess=False )
-        '''
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk2"],
-                       peers=[p64514, p64515, p64516],
-                       expectAllSuccess=True )
+        """
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk2" ],
+                                          peers=[ p64514, p64515, p64516 ],
+                                          expectAllSuccess=True )
         main.Functions.pingHostToHost( main,
-                        hosts=["h64514", "h64515", "h64516"],
-                        expectAllSuccess=True )
-
+                                       hosts=[ "h64514", "h64515", "h64516" ],
+                                       expectAllSuccess=True )
 
     def CASE12( self, main ):
         import time
@@ -561,8 +556,8 @@
         jsonResult = json.loads( result )
         leaderIP = ""
         for entry in jsonResult:
-            if entry["topic"] == "org.onosproject.sdnip":
-                leaderIP = entry["leader"]
+            if entry[ "topic" ] == "org.onosproject.sdnip":
+                leaderIP = entry[ "leader" ]
                 main.log.info( "leaderIP is: " )
                 main.log.info( leaderIP )
 
@@ -587,7 +582,7 @@
             main.step( "Check whether all flow status are ADDED" )
             flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                          main.FALSE,
-                                         kwargs={'isPENDING':False},
+                                         kwargs={ 'isPENDING': False },
                                          attempts=10 )
             utilities.assert_equals( expect=main.TRUE,
                                      actual=flowCheck,
@@ -601,19 +596,19 @@
             main.step( "Check whether all flow status are ADDED" )
             flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                          main.FALSE,
-                                         kwargs={'isPENDING':False},
+                                         kwargs={ 'isPENDING': False },
                                          attempts=10 )
             utilities.assert_equals( expect=main.TRUE,
                                      actual=flowCheck,
                                      onpass="Flow status is correct!",
                                      onfail="Flow status is wrong!" )
 
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk1"],
-                       peers=["p64514", "p64515", "p64516"],
-                       expectAllSuccess=True )
-        main.Functions.pingSpeakerToPeer( main, speakers=["spk2"],
-                       peers=[p64514, p64515, p64516],
-                       expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk1" ],
+                                          peers=[ "p64514", "p64515", "p64516" ],
+                                          expectAllSuccess=True )
+        main.Functions.pingSpeakerToPeer( main, speakers=[ "spk2" ],
+                                          peers=[ p64514, p64515, p64516 ],
+                                          expectAllSuccess=True )
         main.Functions.pingHostToHost( main,
-                        hosts=["h64514", "h64515", "h64516"],
-                        expectAllSuccess=True )
+                                       hosts=[ "h64514", "h64515", "h64516" ],
+                                       expectAllSuccess=True )
diff --git a/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/dependencies/Functions.py b/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/dependencies/Functions.py
index 36f1eb4..8edc284 100644
--- a/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/dependencies/Functions.py
+++ b/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/dependencies/Functions.py
@@ -1,5 +1,5 @@
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,11 +18,10 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 def checkRouteNum( main, routeNumExpected, node=1 ):
     import time
     main.step( "Check routes installed" )
-    wait = int( main.params['timers']['PathAvailable'] )
+    wait = int( main.params[ 'timers' ][ 'PathAvailable' ] )
     main.log.info( "Route number expected:" )
     main.log.info( routeNumExpected )
     main.log.info( "Route number from ONOS CLI:" )
@@ -34,77 +33,80 @@
         routeNumActual = cli.ipv4RouteNumber()
 
     main.log.info( routeNumActual )
-    utilities.assertEquals( \
-        expect = routeNumExpected, actual = routeNumActual,
-        onpass = "Route number is correct!",
-        onfail = "Route number is wrong!" )
+    utilities.assertEquals(
+        expect=routeNumExpected, actual=routeNumActual,
+        onpass="Route number is correct!",
+        onfail="Route number is wrong!" )
+
 
 def checkM2SintentNum( main, intentNumExpected, node=1 ):
     import time
     main.step( "Check M2S intents installed" )
-    wait = int( main.params['timers']['PathAvailable'] )
+    wait = int( main.params[ 'timers' ][ 'PathAvailable' ] )
     main.log.info( "Intent number expected:" )
     main.log.info( intentNumExpected )
     main.log.info( "Intent number from ONOS CLI:" )
     cli = main.Cluster.active( node - 1 ).CLI
-    jsonResult = cli.intents( jsonFormat = True, summary = True,
-                              TYPE = "multiPointToSinglePoint" )
-    intentNumActual = jsonResult['installed']
+    jsonResult = cli.intents( jsonFormat=True, summary=True,
+                              TYPE="multiPointToSinglePoint" )
+    intentNumActual = jsonResult[ 'installed' ]
     if intentNumActual != intentNumExpected:
         time.sleep( wait )
-        jsonResult = cli.intents( jsonFormat = True, summary = True,
-                                  TYPE = "multiPointToSinglePoint" )
-        intentNumActual = jsonResult['installed']
+        jsonResult = cli.intents( jsonFormat=True, summary=True,
+                                  TYPE="multiPointToSinglePoint" )
+        intentNumActual = jsonResult[ 'installed' ]
     main.log.info( intentNumActual )
-    utilities.assertEquals( \
-        expect = intentNumExpected, actual = intentNumActual,
-        onpass = "M2S intent number is correct!",
-        onfail = "M2S intent number is wrong!" )
+    utilities.assertEquals(
+        expect=intentNumExpected, actual=intentNumActual,
+        onpass="M2S intent number is correct!",
+        onfail="M2S intent number is wrong!" )
+
 
 def checkP2PintentNum( main, intentNumExpected, node=1 ):
     import time
     main.step( "Check P2P intents installed" )
-    wait = int( main.params['timers']['PathAvailable'] )
+    wait = int( main.params[ 'timers' ][ 'PathAvailable' ] )
     main.log.info( "Intent number expected:" )
     main.log.info( intentNumExpected )
     main.log.info( "Intent number from ONOS CLI:" )
     cli = main.Cluster.active( node - 1 ).CLI
-    jsonResult = cli.intents( jsonFormat = True, summary = True,
-                              TYPE = "pointToPoint" )
-    intentNumActual = jsonResult['installed']
+    jsonResult = cli.intents( jsonFormat=True, summary=True,
+                              TYPE="pointToPoint" )
+    intentNumActual = jsonResult[ 'installed' ]
 
     if intentNumActual != intentNumExpected:
         time.sleep( wait )
-        jsonResult = cli.intents( jsonFormat = True, summary = True,
-                                  TYPE = "pointToPoint" )
-        intentNumActual = jsonResult['installed']
+        jsonResult = cli.intents( jsonFormat=True, summary=True,
+                                  TYPE="pointToPoint" )
+        intentNumActual = jsonResult[ 'installed' ]
     main.log.info( intentNumActual )
-    utilities.assertEquals( \
-        expect = intentNumExpected, actual = intentNumActual,
-        onpass = "P2P intent number is correct!",
-        onfail = "P2P intent number is wrong!" )
+    utilities.assertEquals(
+        expect=intentNumExpected, actual=intentNumActual,
+        onpass="P2P intent number is correct!",
+        onfail="P2P intent number is wrong!" )
+
 
 def checkFlowNum( main, switch, flowNumExpected ):
     import time
     main.step( "Check flow entry number in " + switch )
-    wait = int( main.params['timers']['PathAvailable'] )
+    wait = int( main.params[ 'timers' ][ 'PathAvailable' ] )
     main.log.info( "Flow number expected:" )
     main.log.info( flowNumExpected )
     main.log.info( "Flow number actual:" )
     flowNumActual = main.Mininet.getSwitchFlowCount( switch )
-    if flowNumActual != flowNumExpected :
+    if flowNumActual != flowNumExpected:
         time.sleep( wait )
         flowNumActual = main.Mininet.getSwitchFlowCount( switch )
     main.log.info( flowNumActual )
-    utilities.assertEquals( \
-        expect = flowNumExpected, actual = flowNumActual,
-        onpass = "Flow number in " + switch + " is correct!",
-        onfail = "Flow number in " + switch + " is wrong!" )
+    utilities.assertEquals(
+        expect=flowNumExpected, actual=flowNumActual,
+        onpass="Flow number in " + switch + " is correct!",
+        onfail="Flow number in " + switch + " is wrong!" )
 
 
-def pingSpeakerToPeer( main, speakers = ["spk1"],
-                       peers = ["p64514", "p64515", "p64516"],
-                       expectAllSuccess = True ):
+def pingSpeakerToPeer( main, speakers=[ "spk1" ],
+                       peers=[ "p64514", "p64515", "p64516" ],
+                       expectAllSuccess=True ):
     """
     Carry out ping test between each BGP speaker and peer pair
     Optional argument:
@@ -129,25 +131,25 @@
     if expectAllSuccess:
         for speaker in speakers:
             for peer in peers:
-                tmpResult = main.Mininet.pingHost( src = speaker,
-                                                   target = peer )
+                tmpResult = main.Mininet.pingHost( src=speaker,
+                                                   target=peer )
                 result = result and ( tmpResult == main.TRUE )
     else:
         for speaker in speakers:
             for peer in peers:
-                tmpResult = main.Mininet.pingHost( src = speaker,
-                                                   target = peer )
+                tmpResult = main.Mininet.pingHost( src=speaker,
+                                                   target=peer )
 
-    utilities.assert_equals( expect = True, actual = result,
-                             onpass = "Ping test results are expected",
-                             onfail = "Ping test results are Not expected" )
+    utilities.assert_equals( expect=True, actual=result,
+                             onpass="Ping test results are expected",
+                             onfail="Ping test results are Not expected" )
 
-    if result == False:
+    if not result:
         main.cleanAndExit()
 
 
-def pingHostToHost( main, hosts = ["h64514", "h64515", "h64516"],
-                expectAllSuccess = True ):
+def pingHostToHost( main, hosts=[ "h64514", "h64515", "h64516" ],
+                    expectAllSuccess=True ):
     """
     Carry out ping test between each BGP host pair
     Optional argument:
@@ -166,45 +168,41 @@
         for srcHost in hosts:
             for targetHost in hosts:
                 if srcHost != targetHost:
-                    tmpResult = main.Mininet.pingHost( src = srcHost,
-                                                       target = targetHost )
+                    tmpResult = main.Mininet.pingHost( src=srcHost,
+                                                       target=targetHost )
                     result = result and ( tmpResult == main.TRUE )
     else:
         for srcHost in hosts:
             for targetHost in hosts:
                 if srcHost != targetHost:
-                    tmpResult = main.Mininet.pingHost( src = srcHost,
-                                                       target = targetHost )
+                    tmpResult = main.Mininet.pingHost( src=srcHost,
+                                                       target=targetHost )
                     result = result and ( tmpResult == main.FALSE )
 
-    utilities.assert_equals( expect = True, actual = result,
-                             onpass = "Ping test results are expected",
-                             onfail = "Ping test results are Not expected" )
+    utilities.assert_equals( expect=True, actual=result,
+                             onpass="Ping test results are expected",
+                             onfail="Ping test results are Not expected" )
 
-    '''
+    """
     if result == False:
         main.cleanAndExit()
-    '''
-
-
+    """
 def setupTunnel( main, srcIp, srcPort, dstIp, dstPort ):
     """
     Create a tunnel from Mininet host to host outside Mininet
     """
     main.step( "Set up tunnel from Mininet node " +
                str( srcIp ) + ":" + str( srcPort ) + " to ONOS node "
-               + str(dstIp) + ":" + str(dstPort) )
+               + str( dstIp ) + ":" + str( dstPort ) )
     forwarding = '%s:%s:%s:%s' % ( srcIp, srcPort, dstIp, dstPort )
     command = 'ssh -nNT -o "PasswordAuthentication no" \
         -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % ( forwarding, dstIp )
 
-
     tunnelResult = main.TRUE
     tunnelResult = main.Mininet.node( "root", command )
-    utilities.assert_equals( expect = True,
-                             actual = ( "PasswordAuthentication" in tunnelResult ),
+    utilities.assert_equals( expect=True,
+                             actual=( "PasswordAuthentication" in tunnelResult ),
                              onpass = "Created tunnel succeeded",
                              onfail = "Create tunnel failed" )
-    if ( "PasswordAuthentication" not in tunnelResult ) :
+    if ( "PasswordAuthentication" not in tunnelResult ):
         main.cleanAndExit()
-
diff --git a/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/dependencies/USECASE_SdnipI2MN_Cluster.py b/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/dependencies/USECASE_SdnipI2MN_Cluster.py
old mode 100755
new mode 100644
index b37a410..9227e18
--- a/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/dependencies/USECASE_SdnipI2MN_Cluster.py
+++ b/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/dependencies/USECASE_SdnipI2MN_Cluster.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 
 """
-Copyright 2015 Open Networking Foundation (ONF)
+Copyright 2015 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -10,7 +10,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,18 +20,15 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Set up the SDN-IP topology as same as it on Internet2
 """
-
 """
-AS 64513, (SDN AS)
+AS 64513, ( SDN AS )
 AS 64514, reachable by 10.0.4.1, 10.0.14.1
 AS 64515, reachable by 10.0.5.1, 10.0.15.1
 AS 64516, reachable by 10.0.6.1, 10.0.16.1
 """
-
 from mininet.net import Mininet
 from mininet.node import Controller, RemoteController
 from mininet.log import setLogLevel, info
@@ -50,14 +47,17 @@
 QUAGGA_CONFIG_DIR = '~/OnosSystemTest/TestON/tests/USECASE/USECASE_SdnipFunctionCluster/dependencies/'
 numSw = 39
 
-# net = Mininet( controller = RemoteController )
+# net = Mininet( controller=RemoteController )
+
+
 class VLANHost( Host ):
+
     def config( self, vlan=100, intfName=None, **params ):
         r = super( Host, self ).config( **params )
         intf = self.intf( intfName )
         self.cmd( 'ifconfig %s inet 0' % intf )
         self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
-        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+        self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params[ 'ip' ] ) )
         newName = '%s.%d' % ( intf, vlan )
         intf.name = newName
         self.nameToIntf[ newName ] = intf
@@ -65,6 +65,7 @@
 
 
 class SDNTopo( Topo ):
+
     "SDN Topology"
 
     def __init__( self, *args, **kwargs ):
@@ -81,100 +82,98 @@
         p64519 = self.addHost( 'p64519', cls=VLANHost, vlan=10 )
         p64520 = self.addHost( 'p64520', cls=VLANHost, vlan=10 )
 
-        '''
-        sw1 = self.addSwitch( 'SEAT', dpid = '00000000000000a1' )
-        sw2 = self.addSwitch( 'PORT', dpid = '00000000000000a2' )
-        sw3 = self.addSwitch( 'SUNN', dpid = '00000000000000a3' )
-        sw4 = self.addSwitch( 'RENO', dpid = '00000000000000a4' )
-        sw5 = self.addSwitch( 'LOSA', dpid = '00000000000000a5' )
-        sw6 = self.addSwitch( 'MISS', dpid = '00000000000000a6' )
-        sw7 = self.addSwitch( 'LASV', dpid = '00000000000000a7' )
-        sw8 = self.addSwitch( 'SALT', dpid = '00000000000000a8' )
-        sw9 = self.addSwitch( 'PHOE', dpid = '00000000000000a9' )
-        sw10 = self.addSwitch( 'TUCS', dpid = '0000000000000a10' )
-        sw11 = self.addSwitch( 'DENV', dpid = '0000000000000a11' )
-        sw12 = self.addSwitch( 'ELPA', dpid = '0000000000000a12' )
-        sw13 = self.addSwitch( 'MINN', dpid = '0000000000000a13' )
-        sw14 = self.addSwitch( 'KANS', dpid = '0000000000000a14' )
-        sw15 = self.addSwitch( 'TULS', dpid = '0000000000000a15' )
-        sw16 = self.addSwitch( 'DALL', dpid = '0000000000000a16' )
-        sw17 = self.addSwitch( 'HOUH', dpid = '0000000000000a17' )
-        sw18 = self.addSwitch( 'COLU', dpid = '0000000000000a18' )
-        sw19 = self.addSwitch( 'JCSN', dpid = '0000000000000a19' )
-        sw20 = self.addSwitch( 'BATO', dpid = '0000000000000a20' )
-        sw21 = self.addSwitch( 'EQCH', dpid = '0000000000000a21' )
-        sw22 = self.addSwitch( 'STAR', dpid = '0000000000000a22' )
-        sw23 = self.addSwitch( 'CHIC', dpid = '0000000000000a23' )
-        sw24 = self.addSwitch( 'INDI', dpid = '0000000000000a24' )
-        sw25 = self.addSwitch( 'CINC', dpid = '0000000000000a25' )
-        sw26 = self.addSwitch( 'LOUI', dpid = '0000000000000a26' )
-        sw27 = self.addSwitch( 'ATLA', dpid = '0000000000000a27' )
-        sw28 = self.addSwitch( 'JACK', dpid = '0000000000000a28' )
-        sw29 = self.addSwitch( 'CLEV', dpid = '0000000000000a29' )
-        sw30 = self.addSwitch( 'PITT', dpid = '0000000000000a30' )
-        sw31 = self.addSwitch( 'ASHB', dpid = '0000000000000a31' )
-        sw32 = self.addSwitch( 'WASH', dpid = '0000000000000a32' )
-        sw33 = self.addSwitch( 'RALE', dpid = '0000000000000a33' )
-        sw34 = self.addSwitch( 'CHAR', dpid = '0000000000000a34' )
-        sw35 = self.addSwitch( 'ALBA', dpid = '0000000000000a35' )
-        sw36 = self.addSwitch( 'BOST', dpid = '0000000000000a36' )
-        sw37 = self.addSwitch( 'HART', dpid = '0000000000000a37' )
-        sw38 = self.addSwitch( 'NEWY', dpid = '0000000000000a38' )
-        sw39 = self.addSwitch( 'PHIL', dpid = '0000000000000a39' )
-        '''
-        sw1 = self.addSwitch( 'sw1', dpid = '00000000000000a1' )
-        sw2 = self.addSwitch( 'sw2', dpid = '00000000000000a2' )
-        sw3 = self.addSwitch( 'sw3', dpid = '00000000000000a3' )
-        sw4 = self.addSwitch( 'sw4', dpid = '00000000000000a4' )
-        sw5 = self.addSwitch( 'sw5', dpid = '00000000000000a5' )
-        sw6 = self.addSwitch( 'sw6', dpid = '00000000000000a6' )
-        sw7 = self.addSwitch( 'sw7', dpid = '00000000000000a7' )
-        sw8 = self.addSwitch( 'sw8', dpid = '00000000000000a8' )
-        sw9 = self.addSwitch( 'sw9', dpid = '00000000000000a9' )
-        sw10 = self.addSwitch( 'sw10', dpid = '0000000000000a10' )
-        sw11 = self.addSwitch( 'sw11', dpid = '0000000000000a11' )
-        sw12 = self.addSwitch( 'sw12', dpid = '0000000000000a12' )
-        sw13 = self.addSwitch( 'sw13', dpid = '0000000000000a13' )
-        sw14 = self.addSwitch( 'sw14', dpid = '0000000000000a14' )
-        sw15 = self.addSwitch( 'sw15', dpid = '0000000000000a15' )
-        sw16 = self.addSwitch( 'sw16', dpid = '0000000000000a16' )
-        sw17 = self.addSwitch( 'sw17', dpid = '0000000000000a17' )
-        sw18 = self.addSwitch( 'sw18', dpid = '0000000000000a18' )
-        sw19 = self.addSwitch( 'sw19', dpid = '0000000000000a19' )
-        sw20 = self.addSwitch( 'sw20', dpid = '0000000000000a20' )
-        sw21 = self.addSwitch( 'sw21', dpid = '0000000000000a21' )
-        sw22 = self.addSwitch( 'sw22', dpid = '0000000000000a22' )
-        sw23 = self.addSwitch( 'sw23', dpid = '0000000000000a23' )
-        sw24 = self.addSwitch( 'sw24', dpid = '0000000000000a24' )
-        sw25 = self.addSwitch( 'sw25', dpid = '0000000000000a25' )
-        sw26 = self.addSwitch( 'sw26', dpid = '0000000000000a26' )
-        sw27 = self.addSwitch( 'sw27', dpid = '0000000000000a27' )
-        sw28 = self.addSwitch( 'sw28', dpid = '0000000000000a28' )
-        sw29 = self.addSwitch( 'sw29', dpid = '0000000000000a29' )
-        sw30 = self.addSwitch( 'sw30', dpid = '0000000000000a30' )
-        sw31 = self.addSwitch( 'sw31', dpid = '0000000000000a31' )
-        sw32 = self.addSwitch( 'sw32', dpid = '0000000000000a32' )
-        sw33 = self.addSwitch( 'sw33', dpid = '0000000000000a33' )
-        sw34 = self.addSwitch( 'sw34', dpid = '0000000000000a34' )
-        sw35 = self.addSwitch( 'sw35', dpid = '0000000000000a35' )
-        sw36 = self.addSwitch( 'sw36', dpid = '0000000000000a36' )
-        sw37 = self.addSwitch( 'sw37', dpid = '0000000000000a37' )
-        sw38 = self.addSwitch( 'sw38', dpid = '0000000000000a38' )
-        sw39 = self.addSwitch( 'sw39', dpid = '0000000000000a39' )
-
+        """
+        sw1 = self.addSwitch( 'SEAT', dpid='00000000000000a1' )
+        sw2 = self.addSwitch( 'PORT', dpid='00000000000000a2' )
+        sw3 = self.addSwitch( 'SUNN', dpid='00000000000000a3' )
+        sw4 = self.addSwitch( 'RENO', dpid='00000000000000a4' )
+        sw5 = self.addSwitch( 'LOSA', dpid='00000000000000a5' )
+        sw6 = self.addSwitch( 'MISS', dpid='00000000000000a6' )
+        sw7 = self.addSwitch( 'LASV', dpid='00000000000000a7' )
+        sw8 = self.addSwitch( 'SALT', dpid='00000000000000a8' )
+        sw9 = self.addSwitch( 'PHOE', dpid='00000000000000a9' )
+        sw10 = self.addSwitch( 'TUCS', dpid='0000000000000a10' )
+        sw11 = self.addSwitch( 'DENV', dpid='0000000000000a11' )
+        sw12 = self.addSwitch( 'ELPA', dpid='0000000000000a12' )
+        sw13 = self.addSwitch( 'MINN', dpid='0000000000000a13' )
+        sw14 = self.addSwitch( 'KANS', dpid='0000000000000a14' )
+        sw15 = self.addSwitch( 'TULS', dpid='0000000000000a15' )
+        sw16 = self.addSwitch( 'DALL', dpid='0000000000000a16' )
+        sw17 = self.addSwitch( 'HOUH', dpid='0000000000000a17' )
+        sw18 = self.addSwitch( 'COLU', dpid='0000000000000a18' )
+        sw19 = self.addSwitch( 'JCSN', dpid='0000000000000a19' )
+        sw20 = self.addSwitch( 'BATO', dpid='0000000000000a20' )
+        sw21 = self.addSwitch( 'EQCH', dpid='0000000000000a21' )
+        sw22 = self.addSwitch( 'STAR', dpid='0000000000000a22' )
+        sw23 = self.addSwitch( 'CHIC', dpid='0000000000000a23' )
+        sw24 = self.addSwitch( 'INDI', dpid='0000000000000a24' )
+        sw25 = self.addSwitch( 'CINC', dpid='0000000000000a25' )
+        sw26 = self.addSwitch( 'LOUI', dpid='0000000000000a26' )
+        sw27 = self.addSwitch( 'ATLA', dpid='0000000000000a27' )
+        sw28 = self.addSwitch( 'JACK', dpid='0000000000000a28' )
+        sw29 = self.addSwitch( 'CLEV', dpid='0000000000000a29' )
+        sw30 = self.addSwitch( 'PITT', dpid='0000000000000a30' )
+        sw31 = self.addSwitch( 'ASHB', dpid='0000000000000a31' )
+        sw32 = self.addSwitch( 'WASH', dpid='0000000000000a32' )
+        sw33 = self.addSwitch( 'RALE', dpid='0000000000000a33' )
+        sw34 = self.addSwitch( 'CHAR', dpid='0000000000000a34' )
+        sw35 = self.addSwitch( 'ALBA', dpid='0000000000000a35' )
+        sw36 = self.addSwitch( 'BOST', dpid='0000000000000a36' )
+        sw37 = self.addSwitch( 'HART', dpid='0000000000000a37' )
+        sw38 = self.addSwitch( 'NEWY', dpid='0000000000000a38' )
+        sw39 = self.addSwitch( 'PHIL', dpid='0000000000000a39' )
+        """
+        sw1 = self.addSwitch( 'sw1', dpid='00000000000000a1' )
+        sw2 = self.addSwitch( 'sw2', dpid='00000000000000a2' )
+        sw3 = self.addSwitch( 'sw3', dpid='00000000000000a3' )
+        sw4 = self.addSwitch( 'sw4', dpid='00000000000000a4' )
+        sw5 = self.addSwitch( 'sw5', dpid='00000000000000a5' )
+        sw6 = self.addSwitch( 'sw6', dpid='00000000000000a6' )
+        sw7 = self.addSwitch( 'sw7', dpid='00000000000000a7' )
+        sw8 = self.addSwitch( 'sw8', dpid='00000000000000a8' )
+        sw9 = self.addSwitch( 'sw9', dpid='00000000000000a9' )
+        sw10 = self.addSwitch( 'sw10', dpid='0000000000000a10' )
+        sw11 = self.addSwitch( 'sw11', dpid='0000000000000a11' )
+        sw12 = self.addSwitch( 'sw12', dpid='0000000000000a12' )
+        sw13 = self.addSwitch( 'sw13', dpid='0000000000000a13' )
+        sw14 = self.addSwitch( 'sw14', dpid='0000000000000a14' )
+        sw15 = self.addSwitch( 'sw15', dpid='0000000000000a15' )
+        sw16 = self.addSwitch( 'sw16', dpid='0000000000000a16' )
+        sw17 = self.addSwitch( 'sw17', dpid='0000000000000a17' )
+        sw18 = self.addSwitch( 'sw18', dpid='0000000000000a18' )
+        sw19 = self.addSwitch( 'sw19', dpid='0000000000000a19' )
+        sw20 = self.addSwitch( 'sw20', dpid='0000000000000a20' )
+        sw21 = self.addSwitch( 'sw21', dpid='0000000000000a21' )
+        sw22 = self.addSwitch( 'sw22', dpid='0000000000000a22' )
+        sw23 = self.addSwitch( 'sw23', dpid='0000000000000a23' )
+        sw24 = self.addSwitch( 'sw24', dpid='0000000000000a24' )
+        sw25 = self.addSwitch( 'sw25', dpid='0000000000000a25' )
+        sw26 = self.addSwitch( 'sw26', dpid='0000000000000a26' )
+        sw27 = self.addSwitch( 'sw27', dpid='0000000000000a27' )
+        sw28 = self.addSwitch( 'sw28', dpid='0000000000000a28' )
+        sw29 = self.addSwitch( 'sw29', dpid='0000000000000a29' )
+        sw30 = self.addSwitch( 'sw30', dpid='0000000000000a30' )
+        sw31 = self.addSwitch( 'sw31', dpid='0000000000000a31' )
+        sw32 = self.addSwitch( 'sw32', dpid='0000000000000a32' )
+        sw33 = self.addSwitch( 'sw33', dpid='0000000000000a33' )
+        sw34 = self.addSwitch( 'sw34', dpid='0000000000000a34' )
+        sw35 = self.addSwitch( 'sw35', dpid='0000000000000a35' )
+        sw36 = self.addSwitch( 'sw36', dpid='0000000000000a36' )
+        sw37 = self.addSwitch( 'sw37', dpid='0000000000000a37' )
+        sw38 = self.addSwitch( 'sw38', dpid='0000000000000a38' )
+        sw39 = self.addSwitch( 'sw39', dpid='0000000000000a39' )
 
         # Add a layer2 switch for control plane connectivity
         # This switch isn't part of the SDN topology
         # We'll use the ovs-controller to turn this into a learning switch
-        swCtl100 = self.addSwitch( 'swCtl100', dpid = '0000000000000100' )
-
+        swCtl100 = self.addSwitch( 'swCtl100', dpid='0000000000000100' )
 
         # BGP speaker hosts
         spk1 = self.addHost( 'spk1' )
         spk2 = self.addHost( 'spk2' )
         spk3 = self.addHost( 'spk3', cls=VLANHost, vlan=10 )
         spk4 = self.addHost( 'spk4', cls=VLANHost, vlan=20 )
-        root = self.addHost( 'root', inNamespace = False , ip = '0' )
+        root = self.addHost( 'root', inNamespace=False, ip='0' )
 
         # hosts behind each AS
         h64514 = self.addHost( 'h64514' )
@@ -298,23 +297,26 @@
     host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
     info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
 
-def startsshds ( hosts ):
+
+def startsshds( hosts ):
     for h in hosts:
         startsshd( h )
 
+
 def stopsshd():
     "Stop *all* sshd processes with a custom banner"
     info( '*** Shutting down stale sshd/Banner processes ',
           quietRun( "pkill -9 -f Banner" ), '\n' )
 
+
 def startquagga( host, num, config_file ):
     info( '*** Starting Quagga on %s\n' % host )
     host.cmd( "cd %s" % QUAGGA_CONFIG_DIR )
     zebra_cmd = \
-    '%s/zebra -d -f  ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid'\
+        '%s/zebra -d -f  ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid'\
      % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
     quagga_cmd = '%s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' \
-    % ( QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
+        % ( QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
 
     print zebra_cmd
     print quagga_cmd
@@ -322,20 +324,19 @@
     host.cmd( zebra_cmd )
     host.cmd( quagga_cmd )
 
-'''
+"""
 def startQuaggaFromTeston( host, num, config_file ):
     global net
     h = net.get( str( host ) )
     startquagga( h, num, config_file )
-'''
-
+"""
 def startquaggahost5( host, num ):
     info( '*** Starting Quagga on %s\n' % host )
     zebra_cmd = \
-    '%s/zebra -d -f  ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' \
-    % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
+        '%s/zebra -d -f  ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' \
+        % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
     quagga_cmd = \
-    '%s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid'\
+        '%s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid'\
      % ( QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
 
     host.cmd( zebra_cmd )
@@ -346,17 +347,17 @@
     quietRun( 'sudo pkill -9 -f bgpd' )
     quietRun( 'sudo pkill -9 -f zebra' )
 
+
 def sdn1net():
     topo = SDNTopo()
     info( '*** Creating network\n' )
 
     # global net
-    net = Mininet( topo = topo, controller = RemoteController )
-
+    net = Mininet( topo=topo, controller=RemoteController )
 
     spk1, spk2, spk3, spk4, p64514, p64515, p64516, p64517, p64518, p64519, p64520 = \
-    net.get( 'spk1', 'spk2', 'spk3', 'spk4',
-             'p64514', 'p64515', 'p64516', 'p64517', 'p64518', 'p64519', 'p64520' )
+        net.get( 'spk1', 'spk2', 'spk3', 'spk4',
+                 'p64514', 'p64515', 'p64516', 'p64517', 'p64518', 'p64519', 'p64520' )
 
     # Adding addresses to speakers' interface connected to sw24
     # for BGP peering
@@ -399,7 +400,7 @@
     # setup configuration on the interface connected to switch
     p64514.cmd( "ifconfig p64514-eth0 10.0.4.1 up" )
     p64514.cmd( "ip addr add 10.0.14.1/24 dev p64514-eth0" )
-    p64514.setMAC( '00:00:00:00:00:14', 'p64514-eth0' ) # do not repeat spk4's MAC addr
+    p64514.setMAC( '00:00:00:00:00:14', 'p64514-eth0' )  # do not repeat spk4's MAC addr
     p64515.cmd( "ifconfig p64515-eth0 10.0.5.1 up" )
     p64515.cmd( "ip addr add 10.0.15.1/24 dev p64515-eth0" )
     p64515.setMAC( '00:00:00:00:00:05', 'p64515-eth0' )
@@ -457,7 +458,7 @@
 
     # Setup hosts in each non-SDN AS
     h64514, h64515, h64516, h64517, h64518, h64519, h64520 = \
-    net.get( 'h64514', 'h64515', 'h64516', 'h64517', 'h64518', 'h64519', 'h64520' )
+        net.get( 'h64514', 'h64515', 'h64516', 'h64517', 'h64518', 'h64519', 'h64520' )
     h64514.cmd( 'ifconfig h64514-eth0 4.0.0.1 up' )
     h64514.cmd( 'ip route add default via 4.0.0.254' )
     h64514.setIP( '192.168.0.44', 24, 'h64514-eth1' )  # for control plane
@@ -478,22 +479,20 @@
     h64520.cmd( 'ifconfig h64520-eth0.10 20.0.0.1 up' )
     h64520.cmd( 'ip route add default via 20.0.0.254' )
 
-
     # set up swCtl100 as a learning
     swCtl100 = net.get( 'swCtl100' )
     swCtl100.cmd( 'ovs-vsctl set-controller swCtl100 none' )
     swCtl100.cmd( 'ovs-vsctl set-fail-mode swCtl100 standalone' )
 
     # connect all switches to controller
-    '''
+    """
     onos1IP = "10.128.4.52"
     onos2IP = "10.128.4.53"
     onos3IP = "10.128.4.54"
     for i in range ( 1, numSw + 1 ):
         swX = net.get( 'sw%s' % ( i ) )
-        swX.cmd( 'ovs-vsctl set-controller sw%s tcp:%s:6653 tcp:%s:6653 tcp:%s:6653' % ( i, onos1IP, onos2IP, onos3IP) )
-    '''
-
+        swX.cmd( 'ovs-vsctl set-controller sw%s tcp:%s:6653 tcp:%s:6653 tcp:%s:6653' % ( i, onos1IP, onos2IP, onos3IP ) )
+    """
     # Start Quagga on border routers
     startquagga( p64514, 64514, 'quagga64514.conf' )
     startquagga( p64515, 64515, 'quagga64515.conf' )
@@ -525,15 +524,13 @@
     spk3.intf( 'spk3-eth1' ).setIP( '1.1.1.5/24' )
     spk4.intf( 'spk4-eth1' ).setIP( '1.1.1.7/24' )
 
-
     stopsshd()
 
     hosts = [ p64514, p64515, p64516, p64517, p64518, p64519, p64520,
-              h64514, h64517, h64519 ];
+              h64514, h64517, h64519 ]
     startsshds( hosts )
 
-
-    '''
+    """
     forwarding1 = '%s:2000:%s:2000' % ( '1.1.1.2', onos1IP )
     root.cmd( 'ssh -nNT -o "PasswordAuthentication no" \
     -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % ( forwarding1, onos1IP ) )
@@ -545,7 +542,7 @@
     forwarding3 = '%s:2000:%s:2000' % ( '1.1.1.6', onos3IP )
     root.cmd( 'ssh -nNT -o "PasswordAuthentication no" \
     -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % ( forwarding3, onos3IP ) )
-    '''
+    """
     CLI( net )
 
     stopsshd()
diff --git a/TestON/tests/USECASE/VPLS/VPLSBasic/VPLSBasic.py b/TestON/tests/USECASE/VPLS/VPLSBasic/VPLSBasic.py
index 7c9905e..4f8d159 100644
--- a/TestON/tests/USECASE/VPLS/VPLSBasic/VPLSBasic.py
+++ b/TestON/tests/USECASE/VPLS/VPLSBasic/VPLSBasic.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 # CASE1: Startup
 # CASE2: Load vpls topology and configurations from demo script
 # CASE3: Test CLI commands
@@ -94,7 +93,6 @@
                                  onpass="Mininet Started",
                                  onfail="Error starting Mininet" )
 
-
         main.step( "Activate apps defined in the params file" )
         # get data from the params
         apps = main.params.get( 'apps' )
@@ -140,7 +138,7 @@
 
         main.step( "App Ids check" )
         appCheck = main.Cluster.command( "appToIDCheck", returnBool=True )
-        if appCheck != True:
+        if not appCheck:
             main.log.warn( main.Cluster.active( 0 ).CLI.apps() )
             main.log.warn( main.Cluster.active( 0 ).CLI.appIDs() )
         utilities.assert_equals( expect=True, actual=appCheck,
@@ -199,7 +197,7 @@
         result = False
         getPorts = utilities.retry( f=main.Cluster.active( 0 ).REST.getNetCfg,
                                     retValue=False,
-                                    kwargs={ "subjectClass" :"ports" },
+                                    kwargs={ "subjectClass": "ports" },
                                     sleep=main.sleep )
         onosCfg = pprint( getPorts )
         sentCfg = pprint( originalCfg.get( "ports" ) )
@@ -233,14 +231,13 @@
         main.step( "Remove an interface from a vpls network" )
         main.Cluster.active( 0 ).CLI.vplsRemIface( 'VPLS1', 'h1' )
         time.sleep( main.sleep )
-        #update master config json
+        # update master config json
         for network in main.vplsConfig:
             if network.get( 'name' ) == 'VPLS1':
                 ifaces = network.get( 'interfaces' )
                 ifaces.remove( 'h1' )
         main.vpls.verify( main )
 
-
     def CASE11( self, main ):
         """
         Clean all VPLS configurations
@@ -251,7 +248,6 @@
         main.vplsConfig = []
         main.vpls.verify( main )
 
-
     def CASE12( self, main ):
         """
         Create a new VPLS network.
@@ -264,7 +260,6 @@
         main.vplsConfig.append( network1 )
         main.vpls.verify( main )
 
-
     def CASE13( self, main ):
         """
         Add interfaces to the new VPLS network.
@@ -292,7 +287,6 @@
                 network[ 'interfaces' ] = ifaces
         main.vpls.verify( main )
 
-
     def CASE14( self, main ):
         """
         Add MPLS encapsulation.
@@ -306,7 +300,6 @@
         time.sleep( main.sleep )
         main.vpls.verify( main )
 
-
     def CASE15( self, main ):
         """
         Change an encapsulation type.
@@ -320,7 +313,6 @@
         time.sleep( main.sleep )
         main.vpls.verify( main )
 
-
     def CASE16( self, main ):
         """
         Remove encapsulation.
diff --git a/TestON/tests/USECASE/VPLS/VPLSfailsafe/VPLSfailsafe.py b/TestON/tests/USECASE/VPLS/VPLSfailsafe/VPLSfailsafe.py
index bda1ecd..55c9e2c 100644
--- a/TestON/tests/USECASE/VPLS/VPLSfailsafe/VPLSfailsafe.py
+++ b/TestON/tests/USECASE/VPLS/VPLSfailsafe/VPLSfailsafe.py
@@ -1,5 +1,5 @@
 """
-Copyright 2017 Open Networking Foundation (ONF)
+Copyright 2017 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,7 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
 """
 Testing various connectivity failures for VPLS.
 
@@ -31,13 +30,11 @@
 CASE310: Kill 1 ONOS node at a time and test connectivity.
 CASE400: Bring down 1 link at a time and test connectivity.
 """
-
 class VPLSfailsafe:
 
     def __init__( self ):
         self.default = ''
 
-
     def CASE1( self, main ):
         """
         CASE1 is to compile ONOS and push it to the test machines
@@ -103,7 +100,6 @@
                                  onpass="Mininet Started",
                                  onfail="Error starting Mininet" )
 
-
         main.step( "Activate apps defined in the params file" )
         # get data from the params
         apps = main.params.get( 'apps' )
@@ -149,7 +145,7 @@
 
         main.step( "App Ids check" )
         appCheck = main.Cluster.command( "appToIDCheck", returnBool=True )
-        if appCheck != True:
+        if appCheck is not True:
             main.log.warn( main.Cluster.active( 0 ).CLI.apps() )
             main.log.warn( main.Cluster.active( 0 ).CLI.appIDs() )
         utilities.assert_equals( expect=True, actual=appCheck,
@@ -185,7 +181,7 @@
         utilities.assert_equals( expect=main.TRUE,
                                  actual=loadVPLSResult,
                                  onpass="Loaded vpls configuration.",
-                                 onfail="Failed to load vpls configuration.")
+                                 onfail="Failed to load vpls configuration." )
 
         # Time for netcfg to load data
         time.sleep( SLEEP )
@@ -211,7 +207,7 @@
         result = False
         getPorts = utilities.retry( f=main.ONOSrest1.getNetCfg,
                                     retValue=False,
-                                    kwargs={ "subjectClass" : "ports" },
+                                    kwargs={ "subjectClass": "ports" },
                                     sleep=SLEEP )
         onosCfg = pprint( getPorts )
         sentCfg = pprint( originalCfg.get( "ports" ) )
@@ -239,8 +235,6 @@
                                  onpass="Loaded vpls configuration.",
                                  onfail="Failed to load vpls configuration." )
 
-
-
     def CASE50( self, main ):
         """
         Initial connectivity check
@@ -253,7 +247,6 @@
                                  onpass="Connectivity is as expected.",
                                  onfail="Connectivity is NOT as expected." )
 
-
     def CASE100( self, main ):
         """
         Bring down 1 host at a time and test connectivity
@@ -301,7 +294,7 @@
 
         utilities.assert_equals( expect=main.TRUE, actual=result,
                                  onpass="Connectivity is as expected.",
-                                 onfail="Connectivity is NOT as expected.")
+                                 onfail="Connectivity is NOT as expected." )
 
     def CASE200( self, main ):
         """
@@ -310,7 +303,7 @@
         assert vpls, "vpls not defined"
 
         main.case( "Bring down one switch at a time and test connectivity." )
-        links = main.Mininet1.getLinks( )  # Obtain links here
+        links = main.Mininet1.getLinks()  # Obtain links here
         result = main.TRUE
 
         for i in range( 5, hosts + 1 ):
@@ -318,7 +311,7 @@
             stri = str( i )
 
             # Bring switch down
-            main.step( "Delete s" + stri + ".")
+            main.step( "Delete s" + stri + "." )
             delSwitchResult = main.Mininet1.delSwitch( sw="s" + stri )
 
             # Check if switch was deleted
@@ -332,17 +325,17 @@
             result = result and connectivityResult
 
             # Bring switch up
-            main.step( "Add s" + stri + ".")
+            main.step( "Add s" + stri + "." )
             addSwitchResult = main.Mininet1.addSwitch( sw="s" + stri )
 
             # Check if switch was added
             utilities.assert_equals( expect=main.TRUE, actual=addSwitchResult,
                                      onpass="Successfully added switch.",
-                                     onfail="Failed to add switch.")
+                                     onfail="Failed to add switch." )
             result = result and addSwitchResult
 
             # Reconnect links
-            main.step( "Reconnecting links on s" + stri + ".")
+            main.step( "Reconnecting links on s" + stri + "." )
             for j in links:
                 if ( j[ 'node1' ] == "s" + stri and j[ 'node2' ][ 0 ] == "s" ) or \
                    ( j[ 'node2' ] == "s" + stri and j[ 'node1' ][ 0 ] == "s" ):
@@ -355,7 +348,6 @@
             connectivityResult = vpls.testConnectivityVpls( main )
             result = result and connectivityResult
 
-
         utilities.assert_equals( expect=main.TRUE,
                                  actual=result,
                                  onpass="Connectivity is as expected.",
@@ -381,7 +373,7 @@
             ip_address = main.Cluster.active( i ).ipAddress
 
             # Stop an ONOS node: i
-            main.step( "Stop ONOS node " + stri + ".")
+            main.step( "Stop ONOS node " + stri + "." )
             stopResult = main.ONOSbench.onosStop( ip_address )
             main.Cluster.runningNodes[ i ].active = False
 
@@ -394,7 +386,7 @@
             result = result and connectivityResult
 
             # Restart ONOS node
-            main.step( "Restart ONOS node " + stri + " and checking status of restart.")
+            main.step( "Restart ONOS node " + stri + " and checking status of restart." )
             startResult = main.ONOSbench.onosStart( ip_address )
 
             utilities.assert_equals( expect=main.TRUE, actual=startResult,
@@ -451,7 +443,6 @@
                                  onpass="Connectivity is as expected.",
                                  onfail="Connectivity is NOT as expected." )
 
-
     def CASE310( self, main ):
         """
         Kill 1 ONOS node at a time and test connectivity
@@ -484,8 +475,7 @@
         utilities.assert_equals( expect=main.TRUE,
                                  actual=result,
                                  onpass="Connectivity is as expected.",
-                                 onfail="Connectivity is NOT as expected.")
-
+                                 onfail="Connectivity is NOT as expected." )
 
     def CASE400( self, main ):
         """
@@ -493,7 +483,6 @@
         """
         assert vpls, "vpls not defined"
 
-
         main.case( "Bring down one link at a time and test connectivity." )
 
         result = main.TRUE
diff --git a/TestON/tests/USECASE/VPLS/dependencies/vpls.py b/TestON/tests/USECASE/VPLS/dependencies/vpls.py
index 6240cb3..5c057bf 100644
--- a/TestON/tests/USECASE/VPLS/dependencies/vpls.py
+++ b/TestON/tests/USECASE/VPLS/dependencies/vpls.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -17,9 +17,7 @@
 
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
-"""
 
-"""
 Functions for the vpls tests
 """
 import time
@@ -65,8 +63,6 @@
     NOTE: This requires the expected/sent network config json for the vpls
           application be stored in main.vplsConfig
     """
-
-
     # Variables
     app = main.params[ 'vpls' ][ 'name' ]
     pprint = main.Cluster.active( 0 ).REST.pprint
@@ -78,7 +74,7 @@
         result = False
         getVPLS = utilities.retry( f=ctrl.REST.getNetCfg,
                                    retValue=False,
-                                   kwargs={"subjectClass":"apps", "subjectKey":app},
+                                   kwargs={ "subjectClass": "apps", "subjectKey": app },
                                    sleep=SLEEP )
         onosCfg = json.loads( getVPLS ).get( 'vpls' ).get( 'vplsList' )
         onosCfg = pprint( sanitizeConfig( onosCfg ) )
@@ -100,7 +96,7 @@
     clusterResult = True
     for ctrl in main.Cluster.active():
         result = False
-        #TODO Read from vpls show and match to pushed json
+        # TODO Read from vpls show and match to pushed json
         vpls = ctrl.CLI.parseVplsShow()
         parsedVpls = pprint( sanitizeConfig( vpls ) )
         sentVpls = pprint( sanitizeConfig( main.vplsConfig ) )
@@ -142,7 +138,7 @@
             if pingResult != expected:
                 connectivityCheck = False
                 main.log.error( "%s <-> %s: %s; Expected: %s" %
-                               ( src, dst, pingResult, expected ) )
+                                ( src, dst, pingResult, expected ) )
     utilities.assert_equals( expect=True,
                              actual=connectivityCheck,
                              onpass="Connectivity is as expected",
@@ -151,7 +147,8 @@
 # TODO: if encapsulation is set, look for that
 # TODO: can we look at the intent keys?
 
-def checkIntentState( main , bl=[] ):
+
+def checkIntentState( main, bl=[] ):
     # Print the intent states
     intents = main.Cluster.active( 0 ).CLI.intents()
     count = 0
@@ -179,7 +176,7 @@
     result = {}
     vplsConfig = main.vplsConfig
     for v in vplsConfig:
-        interfaces = v[ 'interfaces' ][:]
+        interfaces = v[ 'interfaces' ][ : ]
         for i in bl:
             if i in interfaces:
                 interfaces.remove( i )
diff --git a/TestON/tests/USECASE/dependencies/sdnipBaseFunction.py b/TestON/tests/USECASE/dependencies/sdnipBaseFunction.py
index 1d913cc..c5eb905 100644
--- a/TestON/tests/USECASE/dependencies/sdnipBaseFunction.py
+++ b/TestON/tests/USECASE/dependencies/sdnipBaseFunction.py
@@ -1,6 +1,8 @@
 class SdnBase:
-    def __init__(self):
+
+    def __init__( self ):
         self.default = ''
+
     def initSetup( self ):
         import json
         import time
@@ -30,9 +32,9 @@
                                   cellName=cellName )
 
         main.step( "Checking if ONOS CLI is ready for issuing commands" )
-        ready =  utilities.retry( main.Cluster.command,
+        ready = utilities.retry( main.Cluster.command,
                                   False,
-                                  kwargs={ "function":"summary", "contentCheck":True },
+                                  kwargs={ "function": "summary", "contentCheck": True },
                                   sleep=30,
                                   attempts=10 )
         utilities.assert_equals( expect=True, actual=ready,
@@ -44,9 +46,9 @@
             main.cleanAndExit()
 
     def pToPIntentTest( self, intentExpectedNum ):
-        '''
+        """
         point-to-point intents test for each BGP peer and BGP speaker pair
-        '''
+        """
         import time
         main.case( "Check point-to-point intents" )
         main.log.info( "There are %s BGP peers in total "
@@ -58,7 +60,7 @@
             main.QuaggaCliSpeaker1.extractActualBgpIntentNum( getIntentsResult )
         bgpIntentsExpectedNum = int( main.params[ 'config' ][ 'peerNum' ] ) * intentExpectedNum
         if bgpIntentsActualNum != bgpIntentsExpectedNum:
-            time.sleep( int( main.params['timers']['RouteDelivery'] ) )
+            time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
             getIntentsResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat=True )
             bgpIntentsActualNum = \
                 main.QuaggaCliSpeaker1.extractActualBgpIntentNum( getIntentsResult )
@@ -72,9 +74,9 @@
                                  onfail="PointToPointIntent Intent Num is wrong!" )
 
     def routeAndIntentCheck( self, allRoutesExpected, routeIntentsExpectedNum ):
-        '''
+        """
         routes and intents check to all BGP peers
-        '''
+        """
         import time
         getRoutesResult = main.Cluster.active( 0 ).CLI.routes( jsonFormat=True )
         allRoutesActual = \
@@ -82,7 +84,7 @@
         allRoutesStrExpected = str( sorted( allRoutesExpected ) )
         allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
         if allRoutesStrActual != allRoutesStrExpected:
-            time.sleep( int( main.params['timers']['RouteDelivery'] ) )
+            time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
             getRoutesResult = main.Cluster.active( 0 ).CLI.routes( jsonFormat=True )
             allRoutesActual = \
                 main.QuaggaCliSpeaker1.extractActualRoutesMaster( getRoutesResult )
@@ -93,7 +95,7 @@
         main.log.info( allRoutesStrExpected )
         main.log.info( "Routes get from ONOS CLI:" )
         main.log.info( allRoutesStrActual )
-        utilities.assertEquals( \
+        utilities.assertEquals(
             expect=allRoutesStrExpected, actual=allRoutesStrActual,
             onpass="Routes are correct!",
             onfail="Routes are wrong!" )
@@ -103,7 +105,7 @@
         routeIntentsActualNum = \
             main.QuaggaCliSpeaker1.extractActualRouteIntentNum( getIntentsResult )
         if routeIntentsActualNum != routeIntentsExpectedNum:
-            time.sleep( int( main.params['timers']['RouteDelivery'] ) )
+            time.sleep( int( main.params[ 'timers' ][ 'RouteDelivery' ] ) )
             getIntentsResult = main.Cluster.active( 0 ).CLI.intents( jsonFormat=True )
             routeIntentsActualNum = \
                 main.QuaggaCliSpeaker1.extractActualRouteIntentNum( getIntentsResult )
@@ -112,7 +114,7 @@
         main.log.info( routeIntentsExpectedNum )
         main.log.info( "MultiPointToSinglePoint Intent NUM Actual is:" )
         main.log.info( routeIntentsActualNum )
-        utilities.assertEquals( \
+        utilities.assertEquals(
             expect=routeIntentsExpectedNum,
             actual=routeIntentsActualNum,
             onpass="MultiPointToSinglePoint Intent Num is correct!",
@@ -121,9 +123,9 @@
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
-        utilities.assertEquals( \
+        utilities.assertEquals(
             expect=main.TRUE,
             actual=flowCheck,
             onpass="Flow status is correct!",
@@ -134,10 +136,10 @@
                          link2RouteNum, link2IntentNum,
                          link3RouteNum, link3IntentNum,
                          speakers, hosts, upOrDown ):
-        '''
+        """
         Cut/Recover links to peers one by one, check routes/intents
         upOrDown - "up" or "down"
-        '''
+        """
         import time
         main.case( "Bring " + upOrDown + " links and check routes/intents" )
         main.step( "Bring " + upOrDown + " the link between sw32 and " + link1Peer )
@@ -171,7 +173,7 @@
             main.log.error( "Bring " + upOrDown + " link failed!" )
             main.cleanAndExit()
 
-        main.step( "Bring " + upOrDown + " the link between sw28 and "+ link3Peer )
+        main.step( "Bring " + upOrDown + " the link between sw28 and " + link3Peer )
         linkResult3 = main.Mininet.link( END1="sw28", END2=link3Peer,
                                          OPTION=upOrDown )
         utilities.assert_equals( expect=main.TRUE,
@@ -189,7 +191,7 @@
         main.step( "Check whether all flow status are ADDED" )
         flowCheck = utilities.retry( main.Cluster.active( 0 ).CLI.checkFlowsState,
                                      main.FALSE,
-                                     kwargs={'isPENDING':False},
+                                     kwargs={ 'isPENDING': False },
                                      attempts=10 )
         utilities.assert_equals( expect=main.TRUE,
                                  actual=flowCheck,
@@ -198,8 +200,8 @@
 
         # Ping test
         main.Functions.pingSpeakerToPeer( main, speakers=[ speakers ],
-                       peers=[ link1Peer, link2Peer, link3Peer ],
-                       expectAllSuccess=False )
+                                          peers=[ link1Peer, link2Peer, link3Peer ],
+                                          expectAllSuccess=False )
         main.Functions.pingHostToHost( main,
-                        hosts=hosts,
-                        expectAllSuccess=False )
\ No newline at end of file
+                                       hosts=hosts,
+                                       expectAllSuccess=False )
diff --git a/TestON/tests/__init__.py b/TestON/tests/__init__.py
index 8b13789..e69de29 100644
--- a/TestON/tests/__init__.py
+++ b/TestON/tests/__init__.py
@@ -1 +0,0 @@
-
diff --git a/TestON/tests/dependencies/Cluster.py b/TestON/tests/dependencies/Cluster.py
index 16dfd79..210134f 100644
--- a/TestON/tests/dependencies/Cluster.py
+++ b/TestON/tests/dependencies/Cluster.py
@@ -1,5 +1,5 @@
 """
-Copyright 2017 Open Networking Foundation (ONF)
+Copyright 2017 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,8 +18,6 @@
     You should have received a copy of the GNU General Public License
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
-
-
 class Cluster():
 
     def __str__( self ):
@@ -33,14 +31,14 @@
         return "%s[%s]" % ( self.name, ", ".join( controllers ) )
 
     def __init__( self, ctrlList=[], name="Cluster" ):
-        '''
+        """
             controllers : All the nodes
             runningNodes : Node that are specifically running from the test.
-                ie) When the test is testing different number of nodes on each
+                ie ) When the test is testing different number of nodes on each
                     run.
             numCtrls : number of runningNodes
             maxCtrls : number of controllers
-        '''
+        """
         self.controllers = ctrlList
         self.runningNodes = ctrlList
         self.numCtrls = len( self.runningNodes )
@@ -107,7 +105,7 @@
         Returns:
         """
         self.runningNodes = []
-        for i in numCtrls if isinstance( numCtrls, list ) else range( numCtrls ) :
+        for i in numCtrls if isinstance( numCtrls, list ) else range( numCtrls ):
             self.runningNodes.append( self.controllers[ i ] )
         self.numCtrls = len( numCtrls ) if isinstance( numCtrls, list ) else numCtrls
 
@@ -158,13 +156,13 @@
             * cellName - The name of the cell.
             * Mininet - a mininet driver that will be used.
             * useSSH - True for using ssh when creating a cell
-            * ips - ip(s) of the node(s).
+            * ips - ip( s ) of the node( s ).
         Returns:
         """
         self.command( "createCellFile",
                       args=[ main.ONOSbench.ip_address,
                              cellName,
-                             Mininet if isinstance(Mininet, str) else
+                             Mininet if isinstance( Mininet, str ) else
                              Mininet.ip_address,
                              main.apps,
                              ips,
@@ -203,7 +201,6 @@
         Returns:
             Returns main.TRUE if it successfully set and verify cell.
         """
-
         setCellResult = self.command( "setCell",
                                       args=[ cellName ],
                                       specificDriver=1,
@@ -254,7 +251,7 @@
             max number of the nodes.
         Required:
             * killRemoveMax - The boolean that will decide either to kill
-            only running nodes (False) or max number of nodes (True).
+            only running nodes ( False ) or max number of nodes ( True ).
             * stopOnos - If wish to stop onos before killing it. True for
             enable stop , False for disable stop.
         Returns:
@@ -439,7 +436,7 @@
                 funcArgs = []
                 funcKwargs = {}
                 f = getattr( ( ctrl if not specificDriver else
-                             getattr( ctrl, drivers[ specificDriver ] ) ), function )
+                               getattr( ctrl, drivers[ specificDriver ] ) ), function )
                 if funcFromCtrl:
                     if args:
                         for i in range( len( args ) ):
diff --git a/TestON/tests/dependencies/ONOSSetup.py b/TestON/tests/dependencies/ONOSSetup.py
index 8a73e32..750dde6 100644
--- a/TestON/tests/dependencies/ONOSSetup.py
+++ b/TestON/tests/dependencies/ONOSSetup.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -20,6 +20,7 @@
 """
 import re
 
+
 class ONOSSetup:
     main = None
 
@@ -84,7 +85,7 @@
         Returns:
             Returns main.TRUE
         """
-        if includeGitPull :
+        if includeGitPull:
             self.gitPulling()
 
         try:
@@ -151,7 +152,7 @@
         Required:
             * cluster - the cluster driver that will be used.
             * killRemoveMax - The boolean that will decide either to kill
-            only running nodes (False) or max number of nodes (True).
+            only running nodes ( False ) or max number of nodes ( True ).
             * stopOnos - If wish to stop onos before killing it. True for
             enable stop , False for disable stop.
         Returns:
@@ -173,7 +174,7 @@
             * cellName - The name of the cell.
             * Mininet - a mininet driver that will be used.
             * useSSH - True for using ssh when creating a cell
-            * ips - ip(s) of the node(s).
+            * ips - ip( s ) of the node( s ).
         Returns:
             Returns main.TRUE if it successfully executed.
         """
@@ -324,8 +325,8 @@
             Initial ONOS setting up of the tests. It will also verify the result of each steps.
             The procedures will be:
                 killing onos
-                creating (optional) /applying cell
-                removing raft logs (optional)
+                creating ( optional ) /applying cell
+                removing raft logs ( optional )
                 uninstalling onos
                 extra procedure to be applied( optional )
                 building onos
@@ -342,10 +343,10 @@
             * newCell - True for making a new cell and False for not making it.
             * cellName - Name of the cell that will be used.
             * removeLog - True if wish to remove raft logs
-            * extraApply - Function(s) that will be called before building ONOS. Default to None.
-            * applyArgs - argument of the functon(s) of the extraApply. Should be in list.
-            * extraClean - Function(s) that will be called after building ONOS. Defaults to None.
-            * cleanArgs - argument of the functon(s) of the extraClean. Should be in list.
+            * extraApply - Function( s ) that will be called before building ONOS. Default to None.
+            * applyArgs - argument of the functon( s ) of the extraApply. Should be in list.
+            * extraClean - Function( s ) that will be called after building ONOS. Defaults to None.
+            * cleanArgs - argument of the functon( s ) of the extraClean. Should be in list.
             * skipPack - True if wish to skip some packing.
             * installMax - True if wish to install onos max number of nodes
             False if wish to install onos of running nodes only
@@ -378,7 +379,7 @@
                                                useSSH, tempOnosIp,
                                                installMax )
             if removeLog:
-                main.log.info("Removing raft logs")
+                main.log.info( "Removing raft logs" )
                 main.ONOSbench.onosRemoveRaftLogs()
 
             onosUninstallResult = self.uninstallOnos( cluster, killRemoveMax )
diff --git a/TestON/tests/dependencies/topology.py b/TestON/tests/dependencies/topology.py
index 2a81987..96109d3 100644
--- a/TestON/tests/dependencies/topology.py
+++ b/TestON/tests/dependencies/topology.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -22,6 +22,8 @@
 import re
 import imp
 import json
+
+
 class Topology:
 
     def __init__( self ):
@@ -47,7 +49,7 @@
         for ctrl in main.Cluster.active():
             func = getattr( ctrl.CLI, function )
             t = main.Thread( target=utilities.retry if needRetry else func,
-                             name= function + "-" + str( ctrl ),
+                             name=function + "-" + str( ctrl ),
                              args=[ func, [ None ] ] if needRetry else [],
                              kwargs=kwargs )
             threads.append( t )
@@ -116,10 +118,10 @@
                 if isinstance( compareArg, list ):
                     compareArg.append( json.loads( compareElem[ controller ] ) )
                 else:
-                    compareArg = [compareArg, json.loads( compareElem[ controller ] ) ]
+                    compareArg = [ compareArg, json.loads( compareElem[ controller ] ) ]
 
                 currentCompareResult = compareF( *compareArg )
-            except(TypeError, ValueError):
+            except( TypeError, ValueError ):
                 main.log.error(
                     "Could not load json: {0} or {1}".format( str( compareElem[ controller ] ) ) )
                 currentCompareResult = main.FALSE
diff --git a/TestON/tests/dependencies/utils.py b/TestON/tests/dependencies/utils.py
index 240d4b2..5e15c2a 100644
--- a/TestON/tests/dependencies/utils.py
+++ b/TestON/tests/dependencies/utils.py
@@ -1,5 +1,5 @@
 """
-Copyright 2016 Open Networking Foundation (ONF)
+Copyright 2016 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
@@ -8,7 +8,7 @@
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,6 +19,7 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
 class Utils:
+
     def __init__( self ):
         self.default = ''
 
