diff --git a/TestON/bin/cli.py b/TestON/bin/cli.py
index f6417a6..b515486 100755
--- a/TestON/bin/cli.py
+++ b/TestON/bin/cli.py
@@ -17,7 +17,7 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
 '''
@@ -102,7 +102,7 @@
             test.start()
         else :
             print main.TEST+ " test execution paused, please resume that before executing to another test"
-                    
+
     def do_resume(self, line):
         '''
         resume command will continue the execution of paused test.
@@ -115,20 +115,20 @@
             testthread.play()
         else :
             print "There is no test to resume"
-    
+
     def do_nextstep(self,line):
         '''
-        nextstep will execute the next-step of the paused test and 
+        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
         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")
@@ -137,17 +137,17 @@
             testthread.pause()
         else:
             print "There is no paused test "
-        
+
     def do_dumpvar(self,line):
         '''
         dumpvar will print all the test data in raw format.
-        usgae : 
+        usgae :
         teston>dumpvar main
         Here 'main' will be the test object.
-        
-        teston>dumpvar params 
+
+        teston>dumpvar params
         here 'params' will be the parameters specified in the params file.
-        
+
         teston>dumpvar topology
         here 'topology' will be topology specification of the test specified in topo file.
         '''
@@ -161,25 +161,25 @@
                     print e
         else :
             print "There is no paused test "
-            
+
     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 "There is no paused test "
-            
-            
+
+
     def do_currentstep(self,line):
         '''
         currentstep will return the current step in the test execution.
-         
+
         teston>currentstep
         Currently executing test step is: 2.3
         '''
@@ -187,25 +187,25 @@
             print "Currently executing test step is: "+str(main.CurrentTestCaseNumber)+'.'+str(main.stepCount)
         else :
             print "There is no paused test "
-    
-    
+
+
     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):
         '''
         gettest will return the test name which is under execution or recently executed.
-        
+
         Test under execution:
-        teston>gettest 
+        teston>gettest
         Currently executing Test is: PoxTest
-        
+
         Test recently executed:
         Recently executed test is: MininetTest
         '''
@@ -214,10 +214,10 @@
                 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):
         '''
         showlog will show the test's Log
@@ -231,22 +231,22 @@
         try :
             if testthread :
                 print "Currently executing 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() :
                 print msg,
-                
+
             logFileHandler.close()
-            
+
         except NameError:
             print "There is no previously executed Test"
-            
-    
-            
+
+
+
     def parseArgs(self,args,options):
         '''
         This will parse the command line arguments.
@@ -263,9 +263,9 @@
                     options['testname'] = option
         except IndexError,e:
             print e
-            
+
         return options
-    
+
     def initOptions(self,options):
         '''
         This will initialize the commandline options.
@@ -276,8 +276,8 @@
         options['testdir'] = None
         options['testcases'] = None
         options['onoscell'] = None
-        return options   
-    
+        return options
+
     def testcasesInRange(self,index,option,args,options):
         '''
         This method will handle testcases list,specified in range [1-10].
@@ -293,16 +293,16 @@
                     i = start_case
                     while i <= end_case:
                         testcases.append(i)
-                        i= i+1         
+                        i= i+1
                 else :
                     print "Please specify testcases properly like 1-5"
             else :
                 options[option] = args[index]
                 return options
             options[option] = str(testcases)
-            
+
         return options
-    
+
     def cmdloop(self, intro=introduction):
         print introduction
         while True:
@@ -330,23 +330,23 @@
     def do_py( self, line ):
         '''
         Evaluate a Python expression.
-        
+
         py main.log.info("Sample Log Information")
         2013-01-07 12:07:26,804 - PoxTest - INFO - Sample Log Information
-        
+
         '''
         try:
             exec( line )
         except Exception, e:
             output( str( e ) + '\n' )
-            
+
     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")
- 
+
         '''
         from core import openspeak
         ospk = openspeak.OpenSpeak()
@@ -355,7 +355,7 @@
             print translated_code
         except AttributeError, e:
             print 'Dynamic params are not allowed in single statement translations'
-        
+
     def do_do (self,line):
         '''
         Do will translate and execute the openspeak statement for the paused test.
@@ -371,21 +371,21 @@
                 print 'Dynamic params are not allowed in single statement translations'
         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).
-        It will receive the openspeak file path as input and will generate 
-        equivalent test-script file in the same directory. 
-        
+        It will receive the openspeak file path as input and will generate
+        equivalent test-script file in the same directory.
+
         usage:
         -----
         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()      
+        openspeak = openspeak.OpenSpeak()
         openspeakfile = line
         if os.path.exists(openspeakfile) :
             openspeak.compiler(openspeakfile=openspeakfile,writetofile=1)
@@ -397,7 +397,7 @@
         "Exit"
         if testthread:
             testthread.stop()
-            
+
         sys.exit()
 
         return 'exited by user command'
@@ -419,16 +419,16 @@
         '''
         Read shell commands from an input file and execute them sequentially.
         cmdsource.txt :
-        
+
         "pwd
          ls "
-         
+
         teston>source /home/openflow/cmdsource.txt
         /home/openflow/TestON/bin/
         cli.py  __init__.py
-        
+
         '''
-        
+
         args = line.split()
         if len(args) != 1:
             error( 'usage: source <file>\n' )
@@ -443,15 +443,15 @@
                     break
         except IOError:
             error( 'error reading file %s\n' % args[ 0 ] )
-    
+
     def do_updatedriver(self,line):
         '''
          updatedriver will update the given driver name which exists into mentioned config file.
          It will receive two optional arguments :
-         
-         1. Config File Path 
+
+         1. Config File Path
          2. Drivers List to be updated.
-        
+
          Default : config file = "~/TestON/config/updatedriver" ,
                    Driver List = all drivers specified in config file .
         '''
@@ -464,28 +464,28 @@
                     index = index + 1
                     config = args[index]
                 elif option == 'drivers' :
-                    index = index + 1 
+                    index = index + 1
                     drivers = args[index]
         except IndexError:
-            pass        
+            pass
         import updatedriver
         converter = updatedriver.UpdateDriver()
-        
+
         if config == '':
             path = re.sub("(bin)$", "", os.getcwd())
             config = path + "/config/updatedriver.cfg"
             configDict = converter.configparser(config)
-            
+
         else :
             converter.configparser(config)
             configDict = converter.configparser(config)
-           
-            
+
+
         converter.writeDriver(drivers)
-                      
-       
-                     
-        
+
+
+
+
     def do_time( self, line ):
         "Measure time taken for any command in TestON."
         start = time.time()
@@ -535,7 +535,7 @@
                     result = self.test_on.cleanup()
                     self.is_stop = True
 
-        __builtin__.testthread = False       
+        __builtin__.testthread = False
 
     def pause(self):
         '''
@@ -551,17 +551,17 @@
         '''
         self._stopevent.clear()
         cli.pause = False
-        
+
     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):
     '''
     Simply, print the message in console
diff --git a/TestON/bin/generatedriver.py b/TestON/bin/generatedriver.py
index 80dbd08..0bd3a0a 100644
--- a/TestON/bin/generatedriver.py
+++ b/TestON/bin/generatedriver.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 '''
 Created on 11-Oct-2012
-    
+
 @authors: Anil Kumar (anilkumar.s@paxterrasolutions.com),
 
     TestON is free software: you can redistribute it and/or modify
@@ -15,10 +15,10 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
-          
+
 '''
 import pexpect
 import struct, fcntl, os, sys, signal
@@ -27,7 +27,7 @@
 
 class GenerateDriver():
     '''
-        This will 
+        This will
     '''
     def __init__(self):
         self.default = ''
@@ -47,28 +47,28 @@
             sys.exit()
         print self.config_details
         self.device_name = ''
-        
+
     def connect(self,**connectargs):
         '''
            Connection will establish to the remote host using ssh.
            It will take user_name ,ip_address and password as arguments<br>
-           and will return the handle. 
+           and will return the handle.
         '''
         for key in connectargs:
             vars(self)[key] = connectargs[key]
-            
+
         ssh_newkey = 'Are you sure you want to continue connecting'
         refused = "ssh: connect to host "+self.ip_address+" port 22: Connection refused"
         if self.port:
             self.handle =pexpect.spawn('ssh -p '+self.port+' '+self.user_name+'@'+self.ip_address,maxread=50000)
         else :
             self.handle =pexpect.spawn('ssh '+self.user_name+'@'+self.ip_address,maxread=50000)
-        
+
         self.logfile_handler = open(os.getcwd()+"/GenerateDriver.log","w+")
         self.handle.logfile = self.logfile_handler
         i=self.handle.expect([ssh_newkey,'password:',pexpect.EOF,pexpect.TIMEOUT,refused],10)
-        
-        if i==0:    
+
+        if i==0:
             self.handle.sendline('yes')
             i=self.handle.expect([ssh_newkey,'password:',pexpect.EOF,pexpect.TIMEOUT])
             return self.handle
@@ -80,16 +80,16 @@
             print "ssh: connect to host "+self.ip_address+": Error"
             return False
         elif i==3: #timeout
-            
+
             print "ssh: connect to host "+self.ip_address+": Connection timed out"
             return False
         elif i==4:
             print "ssh: connect to host "+self.ip_address+": Connection refused"
             return False
 
-        self.handle.sendline("\r")        
+        self.handle.sendline("\r")
         return self.handle
-    
+
     def execute(self, **execparams):
         '''
         This method will execute the command and will check for the expected prompt.
@@ -98,10 +98,10 @@
         defaultPrompt = '.*[\$>\#]'
         for key in execparams:
             vars(self)[key] = execparams[key]
-        
+
         self.handle.sendline(self.cmd)
-        timeoutVar = self.timeout if self.timeout else 10 
-        
+        timeoutVar = self.timeout if self.timeout else 10
+
         index = self.handle.expect([self.prompt, "byte\s\d+", 'Command not found.', pexpect.TIMEOUT,"\n:",pexpect.EOF], timeout = timeoutVar)
         if index == 0:
             self.LASTRSP = self.LASTRSP + self.handle.before
@@ -118,10 +118,10 @@
                 self.LASTRSP = self.LASTRSP + self.handle.before
             #print self.LASTRSP
         elif index ==2:
-            print "Command not found" 
+            print "Command not found"
             self.LASTRSP = self.LASTRSP + self.handle.before
         elif index ==3:
-            print "Expected Prompt not found , Time Out!!" 
+            print "Expected Prompt not found , Time Out!!"
             return False
         elif index == 4:
 
@@ -134,21 +134,21 @@
 
                 indexMore = self.handle.expect(["\n:", self.prompt,".*",pexpect.EOF,pexpect.TIMEOUT], timeout = timeoutVar)
                 self.LASTRSP = self.LASTRSP + self.handle.before
-        
+
         return self.LASTRSP
-        
+
     def configure(self):
         '''
         Will start the Configure mode of the device.
         '''
         config_result = self.execute(cmd="configure",prompt='\#',timeout=10)
         return config_result
-    
+
     def get_command_help(self,command):
         '''
         Will get the help of the Command
         '''
-        
+
         self.handle.setecho(False)
         help_keyword = self.config_details['device'][self.device_name]['help_keyword']
         interrupt_key = self.config_details['device'][self.device_name]['interrupt_key']
@@ -157,12 +157,12 @@
         self.handle.sendcontrol(interrupt_key)
         #print command_details
         return command_details
-    
+
     def get_command_details(self,command):
         '''
         Will Update the command_dictionary with the available commands details
         '''
-        
+
         temp_dictionary = {}
         command_resulut = self.get_command_help(command)
         try :
@@ -183,15 +183,15 @@
                     match_command = match.group(0)
                     print match_command
                     options_list.append(match_command)
-                    
-        temp_dictionary[command] = options_list 
+
+        temp_dictionary[command] = options_list
         self.command_dictionary[command] = options_list
         self.print_details(self.command_dictionary)
         print "temp dir: --------"
         print temp_dictionary
         print "-------------"
         return temp_dictionary
-    
+
     def print_details(self,command_dictionary):
         '''
         Will print the details in Tree Format
@@ -207,10 +207,10 @@
                 if len(self.commnads_ordered_list[i]) > len(self.commnads_ordered_list[i+1]):
                     sorted = False
                     self.commnads_ordered_list[i], self.commnads_ordered_list[i+1] = self.commnads_ordered_list[i+1], self.commnads_ordered_list[i]
-         
+
         for key in self.commnads_ordered_list:
-            print key +"\t "+str(command_dictionary[key])  
-        print "\n\n"   
+            print key +"\t "+str(command_dictionary[key])
+        print "\n\n"
 
 
     def get_details_recursive(self,main_comand):
@@ -222,7 +222,7 @@
         if main_result_dcitionary :
             for key in main_result_dcitionary.keys():
                 for index, each_option in enumerate(main_result_dcitionary[key]) :
-                  
+
                     if re.search(self.config_details['device'][self.device_name]['end_pattern']+"|^\.|^\d",str(main_result_dcitionary[key][index])):
                         print "Reached the last argument for this "+main_comand+" "+str(each_option)+"\n"
                         main_result_dcitionary[key].remove(each_option)
@@ -232,14 +232,14 @@
                         main_result_dcitionary[key].remove(each_option)
                         break
                     result_dcitionary = self.get_details_recursive(main_comand+" "+str(each_option))
-                
+
         return
     def create_driver(self):
         name = self.device_name
         driver_file_data = 'class '+name +":\n"
         driver_file_data = driver_file_data + "    def __init__( self ):\n"
         driver_file_data = driver_file_data + "        self.prompt = '(.*)'\n        self.timeout = 60 \n\n"
-        
+
         for index,command in enumerate(self.commnads_ordered_list) :
             api_data = '    def '
             command_as_api = re.sub(" ","_" , command, 0)
@@ -259,11 +259,11 @@
                    command_temp = command_temp + c
             if command_temp[len(command_temp)-1] == "_":
                 command_temp = command_temp[0:len(command_temp)-1]
-            command_as_api = command_temp                 
+            command_as_api = command_temp
             #options = ''
             #for option in self.command_dictionary[command]:
                 #options = options+',' + option
-            
+
             #options = re.sub("^\s*,|,$","" , options, 0)
             api_data = api_data + command_as_api+"(self, *options, **def_args ):\n"
             api_data = api_data + "        '''Possible Options :"+str(self.command_dictionary[command])+"'''\n"
@@ -272,19 +272,19 @@
             api_data = api_data + "            arguments = arguments + option +' ' \n"
             api_data = api_data + "        prompt = def_args.setdefault('prompt',self.prompt)\n"
             api_data = api_data + "        timeout = def_args.setdefault('timeout',self.timeout)\n"
-            
+
             api_data = api_data + "        self.execute( cmd= \""+ command + " \"+ arguments, prompt = prompt, timeout = timeout ) \n"
             api_data = api_data + "        return main.TRUE\n"
-            
+
             driver_file_data = driver_file_data +  api_data +"\n"
         driver_file = open(os.getcwd()+"/"+name.lower()+".py", 'w')
         driver_file.write(driver_file_data)
         print driver_file_data
-    
+
     def disconnect(self):
         result = True
         return result
-    
+
     import pexpect
 
 if __name__ == "__main__":
@@ -305,11 +305,11 @@
 
         for root_command in commandlist :
             generate.get_details_recursive(root_command)
-            
+
         generate.create_driver()
         generate.disconnect()
         #generate.get_command_details(main_command)
     else :
         print "Connection Failed to the host"
-    
-    
+
+
diff --git a/TestON/bin/nec.py b/TestON/bin/nec.py
index f5e652a..ac95238 100644
--- a/TestON/bin/nec.py
+++ b/TestON/bin/nec.py
@@ -1,545 +1,545 @@
 class NEC:
     def __init__( self ):
         self.prompt = '(.*)'
-        self.timeout = 60 
+        self.timeout = 60
 
     def show(self, *options, **def_args ):
         '''Possible Options :['  access-filter  ', '  accounting  ', '  acknowledgments  ', '  auto-config  ', '  axrp  ', '  cfm  ', '  channel-group  ', '  clock  ', '  config-lock-status  ', '  cpu  ', '  dhcp  ', '  dot1x  ', '  dumpfile  ', '  efmoam  ', '  environment  ', '  file  ', '  flash  ', '  gsrp  ', '  history  ', '  igmp-snooping  ', '  interfaces  ', '  ip  ', '  ip-dual  ', '  ipv6-dhcp  ', '  license  ', '  lldp  ', '  logging  ', '  loop-detection  ', '  mac-address-table  ', '  mc  ', '  memory  ', '  mld-snooping  ', '  netconf  ', '  netstat  ', '  ntp  ', '  oadp  ', '  openflow  ', '  port  ', '  power  ', '  processes  ', '  qos  ', '  qos-flow  ', '  sessions  ', '  sflow  ', '  spanning-tree  ', '  ssh  ', '  system  ', '  tcpdump  ', '  tech-support  ', '  track  ', '  version  ', '  vlan  ', '  vrrpstatus  ', '  whoami  ']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_ip(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   ip   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   ip   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_mc(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   mc   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   mc   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_cfm(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   cfm   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   cfm   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_ntp(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   ntp   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   ntp   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_ssh(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   ssh   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   ssh   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_qos(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   qos   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   qos   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_cpu(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   cpu   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   cpu   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_vlan(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   vlan   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   vlan   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_lldp(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   lldp   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   lldp   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_dhcp(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   dhcp   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   dhcp   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_axrp(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   axrp   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   axrp   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_oadp(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   oadp   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   oadp   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_gsrp(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   gsrp   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   gsrp   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_port(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   port   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   port   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_file(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   file   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   file   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_power(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   power   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   power   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_clock(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   clock   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   clock   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_dot1x(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   dot1x   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   dot1x   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_sflow(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   sflow   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   sflow   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_track(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   track   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   track   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_flash(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   flash   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   flash   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_system(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   system   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   system   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_whoami(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   whoami   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   whoami   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_efmoam(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   efmoam   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   efmoam   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_memory(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   memory   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   memory   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_tcpdump(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   tcpdump   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   tcpdump   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_history(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   history   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   history   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_logging(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   logging   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   logging   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_license(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   license   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   license   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_netstat(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   netstat   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   netstat   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_version(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   version   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   version   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_netconf(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   netconf   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   netconf   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_ipdual(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   ip-dual   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   ip-dual   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_sessions(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   sessions   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   sessions   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_qosflow(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   qos-flow   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   qos-flow   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_openflow(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   openflow   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   openflow   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_dumpfile(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   dumpfile   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   dumpfile   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_ipv6dhcp(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   ipv6-dhcp   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   ipv6-dhcp   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_processes(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   processes   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   processes   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_vrrpstatus(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   vrrpstatus   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   vrrpstatus   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   interfaces   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   interfaces   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_environment(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   environment   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   environment   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_autoconfig(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   auto-config   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   auto-config   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_techsupport(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   tech-support   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   tech-support   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_mldsnooping(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   mld-snooping   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   mld-snooping   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_igmpsnooping(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   igmp-snooping   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   igmp-snooping   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_channelgroup(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   channel-group   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   channel-group   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_spanningtree(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   spanning-tree   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   spanning-tree   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_loopdetection(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   loop-detection   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   loop-detection   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_acknowledgments(self, *options, **def_args ):
         '''Possible Options :['  interface  ']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   acknowledgments   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   acknowledgments   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_macaddresstable(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   mac-address-table   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   mac-address-table   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_configlockstatus(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   config-lock-status   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   config-lock-status   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_acknowledgments_interface(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show   acknowledgments     interface   "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show   acknowledgments     interface   "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
diff --git a/TestON/bin/pronto.py b/TestON/bin/pronto.py
index b6dcffd..0d1b834 100644
--- a/TestON/bin/pronto.py
+++ b/TestON/bin/pronto.py
@@ -1,45 +1,45 @@
 class Pronto:
     def __init__( self ):
         self.prompt = '(.*)'
-        self.timeout = 60 
+        self.timeout = 60
 
     def status(self, *options, **def_args ):
         '''Possible Options :['Pronto-CLI']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "status "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "status "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def port_show_*(self, *options, **def_args ):
         '''Possible Options :['Pronto-CLI']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "port show * "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "port show * "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def status_ProntoCLI(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "status Pronto-CLI "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "status Pronto-CLI "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def port_show_*_ProntoCLI(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "port show * Pronto-CLI "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "port show * Pronto-CLI "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
diff --git a/TestON/bin/updatedriver.py b/TestON/bin/updatedriver.py
index b023e5d..bd6974d 100644
--- a/TestON/bin/updatedriver.py
+++ b/TestON/bin/updatedriver.py
@@ -17,7 +17,7 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
 '''
@@ -29,18 +29,18 @@
         self.configFile = "/home/openflow/TestON/config/ofadriver.cfg"
         self.methodDict = {}
         self.fileDict = {}
-        
+
 
     def getmethods(self,modulePath,Class) :
         '''
          This will get the list of methods in given module or class.
-         It accepts the module path and class name. If there is no 
+         It accepts the module path and class name. If there is no
          class name then it has be mentioned as None.
         '''
         methodList = []
         moduleList = modulePath.split("/")
         newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
-        print "Message : Method list is being obatined , Please wait ..." 
+        print "Message : Method list is being obatined , Please wait ..."
         try :
             if Class :
                 Module = __import__(moduleList[len(moduleList) - 1], globals(), locals(), [Class], -1)
@@ -55,8 +55,8 @@
                 self.ClassList = ClassList
         except :
             print "Error : " +str(sys.exc_info()[1])
-         
-        
+
+
         self.method = methodList
         return self.method
 
@@ -101,7 +101,7 @@
         '''
          It will parse the config file (ofa.cfg) and return as dictionary
         '''
-        
+
         matchFileName = re.match(r'(.*)\.cfg', fileName, re.M | re.I)
         if matchFileName:
             self.configFile = fileName
@@ -111,28 +111,28 @@
                 return self.configDict
             except :
                 print "Error : Config file " + self.configFile + " not defined properly or file path error"
-        
- 
+
+
     def getList(self):
         '''
-          This method will maintain the hash with module->class->methodList or 
+          This method will maintain the hash with module->class->methodList or
           module -> methodList .It will return the same Hash.
         '''
         classList = []
         try :
             moduleList = self.configDict['config-driver']['importTypes'][self.driver]['modules'].keys()
         except KeyError,e:
-            print "Error : Module Does not Exists"    
+            print "Error : Module Does not Exists"
             print e
             return False
-     
+
         for index,value in enumerate(moduleList):
             modulePath = self.configDict['config-driver']['importTypes'][self.driver]['modules'][value]['path']
             moduleName = self.configDict['config-driver']['importTypes'][self.driver]['modules'][value]['name']
 
             try :
                 pathList = self.configDict['config-driver']['importTypes'][self.driver]['modules'][value]['set-path'].split(",")
-                sys.path.extend(pathList)  
+                sys.path.extend(pathList)
             except KeyError :
                 print "Error : No System Path is given "
                 pass
@@ -159,9 +159,9 @@
 
     def class_ignoreList(self,module) :
         '''
-        It removes the ignored classes for each module mention in ofadriver.cfg 
+        It removes the ignored classes for each module mention in ofadriver.cfg
         '''
-        class_ignoreList = [] 
+        class_ignoreList = []
         if self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['classes'] == None :
             pass
         else :
@@ -176,7 +176,7 @@
                 if className in self.methodDict[moduleName].keys():
                     del self.methodDict[moduleName][className]
         except AttributeError:
-            pass      
+            pass
         return self.methodDict
 
     def method_ignoreList(self,module,className):
@@ -195,7 +195,7 @@
                 try :
                     method_ignoreList = str(self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['classes'][className]['methods']['ignore-list']).split(",")
                 except TypeError :
-                    pass 
+                    pass
         except KeyError :
             print "Message : No Ignore-List Exists , proceeding for looking add method"
             self.add_method(module,className)
@@ -213,7 +213,7 @@
                     print "Message : Method " + method + "Does not exist in module " + moduleName + ", Continue to rest execution"
                     pass
 
-            else :    
+            else :
                 if method in self.methodDict[moduleName][className] :
                     self.methodDict[moduleName][className].remove(method)
         self.add_method(module,className)
@@ -221,7 +221,7 @@
 
     def add_method(self,module,className) :
         '''
-         This  will add the methods(mentioned in ofadriver.cfg file) into method list if it doesnot exists in list. 
+         This  will add the methods(mentioned in ofadriver.cfg file) into method list if it doesnot exists in list.
         '''
         method_List = []
         try :
@@ -235,13 +235,13 @@
                     method_List = str(self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['classes'][className]['methods']['add-list']).split(",")
                 except TypeError :
                     pass
-                
+
         except KeyError :
             print "Message : No Add-List Exists , Proceeding with all available methods"
             return True
         moduleName = self.configDict['config-driver']['importTypes'][self.driver]['modules'][module]['name']
         for index, method in enumerate(method_List) :
-            if className == None :    
+            if className == None :
                 self.methodDict[moduleName] = []
                 self.methodDict[moduleName].append(method)
             else :
@@ -256,19 +256,19 @@
         moduleList = modulePath.split("/")
         newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
         if className == None :
-            methodArgs = self.getargs(newModule,None,self.methodDict[moduleName])  
-            self.fileDict[moduleName] = methodArgs 
+            methodArgs = self.getargs(newModule,None,self.methodDict[moduleName])
+            self.fileDict[moduleName] = methodArgs
         else :
             methodArgs = self.getargs(newModule,className,self.methodDict[moduleName][className])
             self.fileDict[className] = methodArgs
         return self.fileDict
-             
+
     def appendDriver(self,fileName):
         '''
          This will append the given driver file with methods along with arguments.
         '''
         matchFileName = re.match(r'(.*)\.py', fileName, re.M | re.I)
-        
+
         if matchFileName:
             fileHandle = None
             try :
@@ -294,7 +294,7 @@
                 print "Error : Driver file " + fileName + "does not exists"
         else :
              print "Error : File name " + fileName + "is not python module"
-             return False  
+             return False
 
 
     def writeDriver(self, driver) :
@@ -314,15 +314,15 @@
             for index, driverName in enumerate(self.configDict['config-driver']['importTypes'].keys()):
                 self.driver = driverName
                 result = self.getList()
-                if result : 
+                if result :
                     self.getDriverPath()
                     self.appendDriver(self.driverPath + self.driver + ".py")
                     self.driverList.append(self.driverPath + self.driver + ".py")
                 else :
-                    return False 
+                    return False
         else :
             for index, driverName in enumerate(drivers) :
-                
+
                 self.driver = driverName
                 result = self.getList()
                 if result :
@@ -330,40 +330,40 @@
                     self.appendDriver(self.driverPath + self.driver + ".py")
                     self.driverList.append(self.driverPath + self.driver + ".py")
                 else :
-                    return False 
-         
+                    return False
+
         print "=" * 90
         print " " * 30  + "Output Driver File :"
-        print ",\n".join(self.driverList)         
+        print ",\n".join(self.driverList)
         print "=" * 90
-        return True   
-       
+        return True
 
- 
+
+
     def getDriverPath(self):
         '''
-         It will set the driver path and returns it.If driver path is not specified then it will take 
+         It will set the driver path and returns it.If driver path is not specified then it will take
          default path (/lib/updatedriver/).
-        ''' 
+        '''
         self.driverPath = ''
-        try : 
+        try :
             self.driverPath = self.configDict['config-driver']['importTypes'][self.driver]['driver-path']
-              
+
         except KeyError :
-            path = re.sub("(bin)$", "", os.getcwd()) 
+            path = re.sub("(bin)$", "", os.getcwd())
             self.driverPath = path + "/lib/updatedriver/"
         return self.driverPath
 
 
     def printHeader(self,driver):
         content = ''
-        
+
         print " " * 10 +"=" * 90 + "\n"
-        content = content + " " * 30 + "*-- Welcome to Updated Driver --*\n"       
+        content = content + " " * 30 + "*-- Welcome to Updated Driver --*\n"
         content = content + "\n" + " " * 10 + " " * 10 + "Config File : " + "/home/openflow/TestON/config/ofadriver.py"
-        content = content + "\n" + " " * 10 + " " * 10 + "Drivers Name : " + driver      
-        print content 
-        print " " * 10 + "=" * 90 
+        content = content + "\n" + " " * 10 + " " * 10 + "Drivers Name : " + driver
+        print content
+        print " " * 10 + "=" * 90
 
 
 
diff --git a/TestON/bin/vyatta.py b/TestON/bin/vyatta.py
index 31bb57e..225e578 100644
--- a/TestON/bin/vyatta.py
+++ b/TestON/bin/vyatta.py
@@ -11,692 +11,692 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
 '''
 class Vyatta:
     def __init__( self ):
         self.prompt = '(.*)'
-        self.timeout = 60 
+        self.timeout = 60
 
     def show_interfaces(self, *options, **def_args ):
         '''Possible Options :['ethernet', 'loopback']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet(self, *options, **def_args ):
         '''Possible Options :['eth0', 'eth1']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_loopback(self, *options, **def_args ):
         '''Possible Options :['lo']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces loopback "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces loopback "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet(self, *options, **def_args ):
         '''Possible Options :['eth0', 'eth1']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_loopback_lo(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces loopback lo "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces loopback lo "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0(self, *options, **def_args ):
         '''Possible Options :['address', 'bond-group', 'bridge-group', 'description', 'dhcpv6-options', 'DHCPv6', 'disable', 'disable-flow-control', 'Disable', 'disable-link-detect', 'Ignore', 'duplex', 'firewall', 'hw-id', 'ip', 'ipv6', 'mac', 'mirror', 'mtu', 'policy', 'pppoe']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth1(self, *options, **def_args ):
         '''Possible Options :['address', 'duplex', 'hw-id', 'smp_affinity', 'speed']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth1 "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth1 "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth0(self, *options, **def_args ):
         '''Possible Options :['duplex', 'hw-id', 'smp_affinity', 'speed']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth0 "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth0 "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip(self, *options, **def_args ):
         '''Possible Options :['enable-proxy-arp', 'Enable', 'ospf', 'rip']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_hwid(self, *options, **def_args ):
         '''Possible Options :['Media']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 hw-id "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 hw-id "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_DHCPv6(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 DHCPv6 "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 DHCPv6 "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_duplex(self, *options, **def_args ):
         '''Possible Options :['auto', 'half', 'full']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 duplex "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 duplex "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth1_hwid(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth1 hw-id "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth1 hw-id "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth0_speed(self, *options, **def_args ):
         '''Possible Options :['auto']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth0 speed "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth0 speed "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth1_speed(self, *options, **def_args ):
         '''Possible Options :['auto']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth1 speed "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth1 speed "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth0_hwid(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth0 hw-id "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth0 hw-id "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_Ignore(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 Ignore "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 Ignore "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth1_duplex(self, *options, **def_args ):
         '''Possible Options :['auto']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth1 duplex "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth1 duplex "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth0_duplex(self, *options, **def_args ):
         '''Possible Options :['auto']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth0 duplex "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth0 duplex "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_ospf(self, *options, **def_args ):
         '''Possible Options :['authentication', 'OSPF', 'bandwidth', 'cost', 'dead-interval', 'Interval', 'hello-interval', 'Interval', 'mtu-ignore', 'network', 'priority', 'retransmit-interval', 'Interval', 'transmit-delay', 'Link']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip ospf "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip ospf "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_Disable(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 Disable "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 Disable "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_disable(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 disable "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 disable "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_address(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 address "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 address "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_firewall(self, *options, **def_args ):
         '''Possible Options :['in', 'local', 'out']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 firewall "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 firewall "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth1_address(self, *options, **def_args ):
         '''Possible Options :['192.168.56.81/24']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth1 address "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth1 address "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_Enable(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip Enable "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip Enable "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_bondgroup(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 bond-group "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 bond-group "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_duplex_half(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 duplex half "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 duplex half "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_firewall_in(self, *options, **def_args ):
         '''Possible Options :['ipv6-name', 'name']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 firewall in "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 firewall in "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth1_speed_auto(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth1 speed auto "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth1 speed auto "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_description(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 description "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 description "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth0_speed_auto(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth0 speed auto "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth0 speed auto "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_hwid_Media(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 hw-id Media "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 hw-id Media "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_duplex_auto(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 duplex auto "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 duplex auto "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_duplex_full(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 duplex full "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 duplex full "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth0_duplex_auto(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth0 duplex auto "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth0 duplex auto "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_ospf_OSPF(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip ospf OSPF "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip ospf OSPF "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_firewall_out(self, *options, **def_args ):
         '''Possible Options :['ipv6-name', 'name']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 firewall out "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 firewall out "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_bridgegroup(self, *options, **def_args ):
         '''Possible Options :['bridge', 'cost', 'priority']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 bridge-group "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 bridge-group "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth1_duplex_auto(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth1 duplex auto "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth1 duplex auto "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_ospf_cost(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip ospf cost "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip ospf cost "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth0_smp_affinity(self, *options, **def_args ):
         '''Possible Options :['auto']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth0 smp_affinity "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth0 smp_affinity "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth1_smp_affinity(self, *options, **def_args ):
         '''Possible Options :['auto']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth1 smp_affinity "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth1 smp_affinity "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_firewall_local(self, *options, **def_args ):
         '''Possible Options :['ipv6-name', 'name']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 firewall local "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 firewall local "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_dhcpv6options(self, *options, **def_args ):
         '''Possible Options :['parameters-only', 'Acquire', 'temporary']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 dhcpv6-options "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 dhcpv6-options "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_firewall_in_name(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 firewall in name "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 firewall in name "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_bridgegroup_cost(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 bridge-group cost "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 bridge-group cost "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_firewall_out_name(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 firewall out name "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 firewall out name "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_ospf_bandwidth(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip ospf bandwidth "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip ospf bandwidth "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth0_smp_affinity_auto(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth0 smp_affinity auto "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth0 smp_affinity auto "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def show_interfaces_ethernet_eth1_smp_affinity_auto(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "show interfaces ethernet eth1 smp_affinity auto "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "show interfaces ethernet eth1 smp_affinity auto "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_enableproxyarp(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip enable-proxy-arp "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip enable-proxy-arp "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_disablelinkdetect(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 disable-link-detect "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 disable-link-detect "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_firewall_local_name(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 firewall local name "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 firewall local name "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_bridgegroup_bridge(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 bridge-group bridge "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 bridge-group bridge "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_disableflowcontrol(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 disable-flow-control "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 disable-flow-control "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_bridgegroup_priority(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 bridge-group priority "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 bridge-group priority "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_firewall_in_ipv6name(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 firewall in ipv6-name "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 firewall in ipv6-name "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_dhcpv6options_Acquire(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 dhcpv6-options Acquire "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 dhcpv6-options Acquire "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_firewall_out_ipv6name(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 firewall out ipv6-name "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 firewall out ipv6-name "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_ospf_authentication(self, *options, **def_args ):
         '''Possible Options :['md5', 'plaintext-password', 'Plain']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip ospf authentication "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip ospf authentication "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_firewall_local_ipv6name(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 firewall local ipv6-name "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 firewall local ipv6-name "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_dhcpv6options_temporary(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 dhcpv6-options temporary "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 dhcpv6-options temporary "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_ospf_authentication_md5(self, *options, **def_args ):
         '''Possible Options :['key-id']'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip ospf authentication md5 "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip ospf authentication md5 "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_ospf_authentication_Plain(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip ospf authentication Plain "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip ospf authentication Plain "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_dhcpv6options_parametersonly(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 dhcpv6-options parameters-only "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 dhcpv6-options parameters-only "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_ospf_authentication_md5_keyid(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip ospf authentication md5 key-id "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip ospf authentication md5 key-id "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
     def set_interfaces_ethernet_eth0_ip_ospf_authentication_plaintextpassword(self, *options, **def_args ):
         '''Possible Options :[]'''
         arguments= ''
         for option in options:
-            arguments = arguments + option +' ' 
+            arguments = arguments + option +' '
         prompt = def_args.setdefault('prompt',self.prompt)
         timeout = def_args.setdefault('timeout',self.timeout)
-        self.execute( cmd= "set interfaces ethernet eth0 ip ospf authentication plaintext-password "+ arguments, prompt = prompt, timeout = timeout ) 
+        self.execute( cmd= "set interfaces ethernet eth0 ip ospf authentication plaintext-password "+ arguments, prompt = prompt, timeout = timeout )
         return main.TRUE
 
diff --git a/TestON/core/dicttoobject.py b/TestON/core/dicttoobject.py
index 82e2828..13c2aa6 100644
--- a/TestON/core/dicttoobject.py
+++ b/TestON/core/dicttoobject.py
@@ -64,4 +64,4 @@
                     else:
                         self[k] = obj[k]
         return self
-    
+
diff --git a/TestON/core/iniparser.py b/TestON/core/iniparser.py
index c350a20..c416b4f 100644
--- a/TestON/core/iniparser.py
+++ b/TestON/core/iniparser.py
@@ -1,7 +1,7 @@
 #/usr/bin/env python
 '''
 Created on 07-Jan-2013
-       
+
 @author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
 
     TestON is free software: you can redistribute it and/or modify
@@ -15,7 +15,7 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
 '''
@@ -28,12 +28,12 @@
     Test-Topology parser
     Module that parses the test from plain English and topology
     from a specification file and prepares for execution.
-    Test sequencer 
+    Test sequencer
     Module that executes the tests case by case,
     step by step adding ability for step by step pause and debug later.
     Object loader
-    Module that connects and loads all the component connection objects 
-    for access in the test 
+    Module that connects and loads all the component connection objects
+    for access in the test
     '''
     def __init__(self) :
         self.default = ''
diff --git a/TestON/core/jsonparser.py b/TestON/core/jsonparser.py
index fea797a..c33a9b0 100644
--- a/TestON/core/jsonparser.py
+++ b/TestON/core/jsonparser.py
@@ -1,7 +1,7 @@
 #/usr/bin/env python
 '''
 Created on 07-Jan-2013
-       
+
 @author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
 
     TestON is free software: you can redistribute it and/or modify
@@ -16,7 +16,7 @@
 
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
 '''
@@ -24,7 +24,7 @@
 import json
 class JsonParser:
     '''
-    Module that parses the response Json to Dictionary and Vice versa. 
+    Module that parses the response Json to Dictionary and Vice versa.
     '''
     def __init__(self) :
         self.default = ''
@@ -38,18 +38,18 @@
             response_dict = json.loads(json_response)
         except Exception:
             main.log.error("Json Parser is unable to parse the string")
-        return response_dict         
-    
+        return response_dict
+
     '''
-    
+
     def dict_json(self,response_dict):
-        
+
         # This will parse the Python Dictionary and return content as Json string.
-        
+
         json_response = {}
         try :
             json_response = json.dumps(response_dict)
         except Exception:
             main.log.error("Json Parser is unable to parse the string")
-        return json_response  
+        return json_response
     '''
diff --git a/TestON/core/logger.py b/TestON/core/logger.py
index e77d440..c65fa49 100644
--- a/TestON/core/logger.py
+++ b/TestON/core/logger.py
@@ -191,7 +191,7 @@
             logfile.close()
             print newmsg
 
-        main.log.case = case 
+        main.log.case = case
 
         def step(msg):
             '''
diff --git a/TestON/core/openspeak.py b/TestON/core/openspeak.py
index 59f2769..3794910 100644
--- a/TestON/core/openspeak.py
+++ b/TestON/core/openspeak.py
@@ -1,7 +1,7 @@
 #/usr/bin/env python
 '''
 Created on 20-Dec-2012
-       
+
 @author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
 
 
@@ -16,7 +16,7 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
 '''
@@ -28,34 +28,34 @@
 
     def __init__(self):
         self.default = ''
-        self.flag = 0 
+        self.flag = 0
         self.CurrentStep = 0
         self.grtrOrLssr = 0
 
     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. 
+         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)
         resultString = ''
         Test = "Mininet"
         args["WRITETOFILE"] = args["WRITETOFILE"] if args["WRITETOFILE"] != 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()
- 
-        elif args["OPENSPEAKFILE"] ==None and args["TEXT"] and args["FILEHANDLE"] == None: 
-            openSpeakFile =  args["TEXT"].split("\n")     
+
+        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()
-            
+
         index = 0
         outputFile = []
         testName = re.search("\/(.*)\.ospk$",self.openspeakfile,0)
@@ -64,32 +64,32 @@
         testName = testName[len(testName)-1]
         outputFile.append("\nclass " + testName + " :" + "\n")
         outputFile.append("\n" + " " * 4 + "def __init__(self) :")
-        outputFile.append("\n" + " " * 8 + "self.default = \'\'" + "\n")    
-        
+        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) 
+                result =  self.verify_and_translate(line)
                 initialSpaces = len(line) -len(line.lstrip())
-                self.outLoopSpace = initialSpaces  
+                self.outLoopSpace = initialSpaces
                 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)  
+                            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 
+                        pass
                     index = index + 1
-                self.flag = 0 
+                self.flag = 0
             elif repeatMatch:
                 self.flag = 0
                 result =  self.verify_and_translate(line)
@@ -97,15 +97,15 @@
                 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])
                         index = index + 1
-                        
+
                     except IndexError :
                         pass
-                   
-                                 
+
+
             else :
                 self.flag = 0
                 result = self.verify_and_translate(line)
@@ -119,64 +119,64 @@
                 testScript.write(lines)
             testScript.close()
         return resultString
-  
+
     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 .  
-        ''' 
+          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      
- 
-        
+        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         
+        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)   
+        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) 
+        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)   
+        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)
-       
+
         if caseMatch :
             self.CurrentStep = 0
             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 : 
+        elif nameMatch :
             resultString = resultString +  indent + self.translate_testcase_name(testname=nameMatch.group(1))
-        elif commentMatch : 
+        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 : 
+        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))  
+            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)) 
+                                                                         value=storeMatch.group(1))
         elif variableMatch :
             resultString = resultString + indent + self.translate_store(variable=variableMatch.group(1),
                                                                          value=variableMatch.group(2))
@@ -185,48 +185,48 @@
                                                                         operator=assertMatch.group(2),
                                                                             rightvalue=assertMatch.group(3),
                                                                             onpass=assertMatch.group(4),
-                                                                            onfail=assertMatch.group(5)) 
+                                                                            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 
+
+            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 + ":" 
-            self.flag = self.flag + 1 
+            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 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)) 
+                indent = " " *(4 + 4 * (self.flag-1))
                 resultString = resultString + indent + "else :"
                 self.flag = self.flag + 1
-                   
+
         elif elifloop :
-            
+
             operand = elifloop.group(1)
             operator = elifloop.group(2)
-            value = elifloop.group(3)  
+            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 + ":" 
-                self.flag = self.flag + 1 
+                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 + ":" 
+                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+"\")" 
-            self.flag = self.flag + 1 
+            resultString = resultString + indent + store_in +'= main.response_parser('+output_string+",\""+req_format+"\")"
+            self.flag = self.flag + 1
 
         return resultString
 
@@ -234,18 +234,18 @@
         '''
         this will transalte the repeat statement into a python equivalen while loop
         '''
-        
+
         args = self.parse_args(["REPEAT"],**repeatStatement)
         resultString = ''
-        
+
         resultString = "i = 0"
         resultString = resultString + "\n" + " " * 8 +"while i<" + args["REPEAT"] + " :"
         return resultString
-     
+
     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. 
+          Whole loop block will be passed into loopBlock List.
           It returns the transalted reuslt as a string.
         '''
         args = self.parse_args(["CONDITIONOPERATOR"],**loopBlock)
@@ -258,19 +258,19 @@
         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 : 
-            resultString = resultString + " < " 
+        elif lesserMatch :
+            resultString = resultString + " < "
         elif greaterEqualMatch:
             resultString = resultString + " >= "
         elif lesserEqualMatch :
             resultString = resultString + " <= "
         else :
-            print "\n Error: Given Operator is not listed "  
-        
-        return resultString      
-  
+            print "\n Error: Given Operator is not listed "
+
+        return resultString
+
     def translate_experimental_mode(self,**modeType):
         '''
          This API will translate statment EXPERIMENTAL MODE ON/OFF into python equivalent.
@@ -284,33 +284,33 @@
         if ONmatch :
             resultString = "main.EXPERIMENTAL_MODE = main.TRUE"
         elif OFFmatch :
-            resultString = "main.EXPERIMENTAL_MODE = main.FALSE" 
+            resultString = "main.EXPERIMENTAL_MODE = main.FALSE"
 
         return resultString
 
     def interpret(self,**interpetParameters):
         '''
-         This method will accept the OpenSpeak syntax into a string and will return 
+         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)
         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)
-           
-        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):
         '''
-         This will translate the OpenSpeak log message statements into python equivalent 
+         This will translate the OpenSpeak log message statements into python equivalent
          to resultString and returns resultString
         '''
         args = self.parse_args(["LOGLEVEL","MESSAGE"],**logStatement)
         resultString = ''
-        # convert the statement here     
+        # convert the statement here
         message = self.translate_log_message(message=args["MESSAGE"])
         if args["LOGLEVEL"] == "INFO" :
             resultString = resultString + "main.log.info(" + message + ")"
@@ -319,21 +319,21 @@
         elif args["LOGLEVEL"] == "DEBUG" :
             resultString = resultString + "main.log.debug(" + message + ")"
         elif args["LOGLEVEL"] == "REPORT" :
-            resultString = resultString + "main.log.report(" + message + ")" 
+            resultString = resultString + "main.log.report(" + message + ")"
         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"] + ")"      
+            resultString = resultString + "main.log.exact(" + args["MESSAGE"] + ")"
 
-        
+
         return resultString
 
     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. 
+         of string and variable.
          It will return the analysed and translate message.
         '''
         args = self.parse_args(["MESSAGE"],**messageStatement)
@@ -351,28 +351,28 @@
             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)  
+            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"] 
+        else :
+            print "\nError : Syntax error , Not defined way to give log message" + args["MESSAGE"]
 
-        return resultString          
-   
+        return resultString
+
     def translate_assertion(self,**assertStatement):
         '''
-         This will translate the ASSERT <value1> <COMPARISON OPERATOR> <value2> into python 
+         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)
         resultString = ''
-        # convert the statement here   
+        # convert the statement here
         notOperatorMatch = re.search("NOT\s+(.*)",args["OPERATOR"],flags=0)
-        notOperatorSymbMatch = re.search("\!(.*)",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)
@@ -382,11 +382,11 @@
             operator = "main.last_response"
         else :
             operator = args["RIGHTVALUE"]
-                 
+
         if args["OPERATOR"] == 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 :
@@ -400,7 +400,7 @@
                                ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\
                                ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")"
 
-        else :           
+        else :
             operators = self.translate_operator(operator=args["OPERATOR"])
             if self.grtrOrLssr == 0 :
                 resultString = resultString + "utilities.assert_" + operators + "(expect=" +\
@@ -414,8 +414,8 @@
                                ",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):
@@ -426,7 +426,7 @@
         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)     
+        lastResponseMatch = re.match("LAST_RESPONSE",args["OPERATOR"],flags=0)
         if lastResultMatch :
             resultString = resultString + "main.last_result"
         elif lastResponseMatch:
@@ -435,7 +435,7 @@
             resultString = resultString + args["OPERATOR"]
         return resultString
 
-    
+
     def translate_assertMessage(self,**messageStatement) :
         '''
          This API will facilitate the translation of assert ONPASS or ONFAIL messages . The message can be
@@ -443,16 +443,16 @@
          It will return the translated message
         '''
         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)   
+        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 : 
+        if connectMatch :
             resultString = resultString + self.translate_connect(component=connectMatch.group(1),
                                                                  arguments=connectMatch.group(2) )
         elif disconnectMatch :
@@ -462,22 +462,22 @@
                                                                 action=ondoMatch.group(2))
         elif paramsMatch :
             resultString = resultString + self.translate_parameters(parameters=args["MESSAGE"])
-        elif stringMatch : 
+        elif stringMatch :
             resultString = resultString + "\"" + stringMatch.group(1) + "\""
         elif variableMatch :
-            resultString = resultString + variableMatch.group(1) 
+            resultString = resultString + variableMatch.group(1)
         elif args["MESSAGE"]  == None :
-            print "\n Error : Please pass a message or action for assertion "  
-  
-        return resultString 
- 
+            print "\n Error : Please pass a message or action for assertion "
+
+        return resultString
+
     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)
-        
+
         resultString = ''
         equalsMatch = re.match("EQUALS$|==$",args["OPERATOR"],flags=0)
         greaterMatch = re.match("GREATER\s+THAN$|>$",args["OPERATOR"],flags=0)
@@ -486,26 +486,26 @@
         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 :
-            
+
             resultString = resultString + "matches"
         elif greaterEqualMatch:
-            
+
             resultString = resultString + "greater_equals"
         elif lesserEqualMatch :
-            
+
             resultString = resultString + "lesser_equals"
         else :
-            print "\n Error: Given Operator is not listed for assertion"  
-        return resultString  
+            print "\n Error: Given Operator is not listed for assertion"
+        return resultString
 
     def translate_store(self,**storeStatement):
         '''
@@ -527,18 +527,18 @@
 
 
         return resultString
-   
+
     def translate_disconnect(self,**disconnectStatement):
         '''
-         This will translate the DISCONNECT <component_name> into python 
+         This will translate the DISCONNECT <component_name> into python
          equivalent to resultString and returns resultString
         '''
         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):
         '''
          This will translate the ON <component> DO <action> USING <arg1> AS <value1>,<arg2> AS <value2>
@@ -546,17 +546,17 @@
         '''
         args = self.parse_args(["COMPONENT","ACTION","ARGUMENTS"],**onDoStatement)
         subString = ''
-        
+
         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)
-            
+
         else :
             andCheck = re.search ("(.*)\s+AND\s+(.*)",args["ACTION"],flags=0)
-            
+
             action = action + "()"
             if andCheck:
                 action = andCheck.group(1) + "()"
@@ -564,19 +564,19 @@
             else :
                 action = args["ACTION"]
                 action = action + "()"
-        # convert the statement here    
-        resultString = "main." + args["COMPONENT"] + "." + action + subString 
+        # convert the statement here
+        resultString = "main." + args["COMPONENT"] + "." + action + subString
         return resultString
 
-    
+
     def handle_conjuction(self,**conjuctStatement):
         '''
         This will handle the conjuctions
         '''
-        
+
         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 :
@@ -607,16 +607,16 @@
             subSentence = self.handle_conjuction(statement=andCheck.group(2))
         else :
             line = args["ARGUMENTS"]
-            
-            
-        
+
+
+
         argsMatch = re.search("(.*),(.*)",line,flags=0)
 
 
         if args["ARGUMENTS"] == None or args["ARGUMENTS"] == '' :
             subString = ''
         elif argsMatch :
-            
+
             argsList = line.split(",")
             for index, arguments in enumerate(argsList):
                 argMatch = re.search("(.*)\s+AS\s+(.*)",arguments,flags=0)
@@ -639,7 +639,7 @@
                     if index == len(argsList) - 1 :
                         subString = subString +  arguments
                     else :
-                        subString = subString + arguments + ","  
+                        subString = subString + arguments + ","
         else :
             argMatch = re.search("(.*)\s+AS\s+(.*)",args["ARGUMENTS"],flags=0)
             if argMatch:
@@ -663,36 +663,36 @@
 
     def translate_connect(self,**connectStatement):
         '''
-         This will translate the CONNECT <component_name> USING1 <arg1> AS <value1>, <arg2> AS <value2> 
+         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)
         resultString = ''
         subString = self.translate_usingas(arguments=args["ARGUMENTS"])
-        # convert the statement here    
-        resultString = "main." + args["COMPONENT"] + ".connect(" + subString + ")" 
+        # convert the statement here
+        resultString = "main." + args["COMPONENT"] + ".connect(" + subString + ")"
         return resultString
 
 
     def translate_parameters(self,**parameterStatement):
         '''
-         This will translate the OpenSpeak Case and Params parameters into python equivalent 
+         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"]
         resultString = ''
-        ### match arguments 
+        ### 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)     
+        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) 
+            resultString = resultString + "main.params" + self._argsCheck(checkvar=params)
         elif stepsMatch :
             resultString = resultString +"main.params[\'" + self.CurrentCase +\
                            "\'][\'STEP" + str(self.CurrentStep) + "\']" +\
@@ -705,19 +705,19 @@
                            self._argsCheck(checkvar=topoMatch.group(1))
         elif lastResultMatch :
             resultString = resultString + "main.last_result"
-        elif lastResponseMatch : 
-            resultString = resultString + "main.last_response"  
+        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.
             It will return the tanslate form in resultString.
-         '''    
+         '''
         args = self.parse_args(["CHECKVAR"],**args)
         params = args["CHECKVAR"]
         argsList = params.split("]")
         resultString = ''
-        del argsList[len(argsList) - 1] 
+        del argsList[len(argsList) - 1]
         for index,paramArgs in enumerate(argsList) :
             argsWidVariable = re.search("(\"|\')\s*(\w+)\s*(\'|\")",paramArgs,flags=0)
             if argsWidVariable :
@@ -728,71 +728,71 @@
 
     def translate_step(self,**stepStatement):
         '''
-         This will translate the STEP "DO SOMETHING HERE" into python equivalent 
+         This will translate the STEP "DO SOMETHING HERE" into python equivalent
          to resultString and returns resultString
         '''
         args = self.parse_args(["STEP"],**stepStatement)
         resultString = ''
         resultString = "main.step(\"" + args["STEP"] + "\")"
-        # convert the statement here     
+        # convert the statement here
         return resultString
 
- 
+
     def translate_comment(self,**commentStatement):
         '''
-         This will translate the COMMENT "DO SOMETHING HERE" into python equivalent 
+         This will translate the COMMENT "DO SOMETHING HERE" into python equivalent
          to resultString and returns resultString
         '''
         args = self.parse_args(["COMMENT"],**commentStatement)
         resultString = ''
         resultString = "#" + args["COMMENT"]
-        # convert the statement here     
-        return resultString      
-   
+        # convert the statement here
+        return resultString
+
     def translate_testcase_name(self,**nameStatement):
         '''
-         This method will convert NAME "<Testcase_name>" into python equivalent statement 
-         to resultString and returns resultString 
-        ''' 
+         This method will convert NAME "<Testcase_name>" into python equivalent statement
+         to resultString and returns resultString
+        '''
         args = self.parse_args(["TESTNAME"],**nameStatement)
-       
+
         resultString = ''
-        resultString = "main.case(\"" + args["TESTNAME"]  + "\")" 
-        # convert the statement here     
-        return resultString      
-      
-         
+        resultString = "main.case(\"" + args["TESTNAME"]  + "\")"
+        # convert the statement here
+        return resultString
+
+
     def translate_case_block(self,**caseBlock):
         '''
-         This method will translate the case block in test script . 
+         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)
         resultString = ""
         resultString = "def CASE" + str(args["CASENUMBER"]) + "(self,main) :\n"
-        # process the caseBlock List translate all statements underlying the given case     
+        # process the caseBlock List translate all statements underlying the given case
         return resultString
 
-          
-  
+
+
     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. 
+         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 
-     
-  
+        # process the loopBlock List translate all statements underlying the given loop block
+        return resultString
+
+
     def translate_conjuction(self,conjuctionStatement):
         '''
-         This will translate the AND conjuction statements into python equivalent 
+         This will translate the AND conjuction statements into python equivalent
          to resultString and returns resultString
         '''
         resultString = ''
-        # convert the statement here     
+        # convert the statement here
         return resultString
 
 
@@ -804,12 +804,12 @@
         for key,value in kwargs.iteritems():
             #currentKey =  str.upper(key)
             if isinstance(args,list) and str.upper(key) in args:
-                for each 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
-                    
-                   
-            
+
+
+
         return newArgs
diff --git a/TestON/core/utilities.py b/TestON/core/utilities.py
index 1ba403d..02ade72 100644
--- a/TestON/core/utilities.py
+++ b/TestON/core/utilities.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 '''
 Created on 23-Oct-2012
-    
+
 @authors: Anil Kumar (anilkumar.s@paxterrasolutions.com),
           Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
 
@@ -18,9 +18,9 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
-        
+
 Utilities will take care about the basic functions like :
    * Extended assertion,
    * parse_args for key-value pair handling
@@ -43,7 +43,7 @@
        * parse_args for key-value pair handling
        * Parsing the params or topology file.
     '''
-    
+
     def __init__(self):
         self.wrapped = sys.modules[__name__]
 
@@ -57,7 +57,7 @@
             return getattr(self.wrapped, name)
         except AttributeError:
             def assertHandling(**kwargs):
-                nameVar = re.match("^assert",name,flags=0) 
+                nameVar = re.match("^assert",name,flags=0)
                 matchVar = re.match("assert(_not_|_)(equals|matches|greater|lesser)",name,flags=0)
                 notVar = 0
                 operators = ""
@@ -193,16 +193,16 @@
         for key,value in kwargs.iteritems():
             #currentKey =  str.upper(key)
             if isinstance(args,list) and str.upper(key) in args:
-                for each 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
-                    
-                    
-            
+
+
+
         return newArgs
-    
+
     def send_mail(self):
         # Create a text/plain message
         msg = email.mime.Multipart.MIMEMultipart()
@@ -213,16 +213,16 @@
                 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'] = 'paxweb@paxterrasolutions.com'
         msg['To'] = main.mail
         #msg['Cc'] = 'paxweb@paxterrasolutions.com'
-        
+
         # The main body is just another attachment
         body = email.mime.Text.MIMEText(main.logHeader+"\n"+main.testResult)
         msg.attach(body)
-        
+
         # Attachment
         for filename in os.listdir(main.logdir):
             filepath = main.logdir+"/"+filename
@@ -231,32 +231,32 @@
             fp.close()
             att.add_header('Content-Disposition','attachment',filename=filename)
             msg.attach(att)
-        
+
         smtp = smtplib.SMTP('198.57.211.46')
         smtp.starttls()
         smtp.login('paxweb@paxterrasolutions.com','pax@peace')
         smtp.sendmail(msg['From'],[msg['To']], msg.as_string())
         smtp.quit()
-        return main.TRUE        
-        
-           
+        return main.TRUE
+
+
     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)
                 return parsedInfo
             except Exception:
-                print "There is no such file to parse "+fileName 
+                print "There is no such file to parse "+fileName
         else:
-            return 0   
+            return 0
 
 
 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 f873014..2cc47da 100644
--- a/TestON/core/xmldict.py
+++ b/TestON/core/xmldict.py
@@ -14,7 +14,7 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 '''
 
diff --git a/TestON/core/xmlparser.py b/TestON/core/xmlparser.py
index a46750a..fea0ce9 100644
--- a/TestON/core/xmlparser.py
+++ b/TestON/core/xmlparser.py
@@ -1,7 +1,7 @@
 #/usr/bin/env python
 '''
 Created on 07-Jan-2013
-       
+
 @author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
 
     TestON is free software: you can redistribute it and/or modify
@@ -15,7 +15,7 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
 '''
@@ -24,7 +24,7 @@
 import re
 
 class xmlparser :
-    
+
     def __init__(self) :
         self.default = ''
 
@@ -40,7 +40,7 @@
                 parsedInfo = xmldict.xml_to_dict(xml)
                 return parsedInfo
             except Exception:
-                print "There is no such file to parse " + fileName 
+                print "There is no such file to parse " + fileName
         else :
             print "file name is not correct"
 
@@ -48,7 +48,7 @@
         '''
          It will take the params file path and will return the params dictionary
         '''
-        paramsPath = re.sub("\.","/",paramsPath) 
+        paramsPath = re.sub("\.","/",paramsPath)
         paramsPath = re.sub("tests|examples","",paramsPath)
         params = self.parse(main.tests_path+paramsPath+".params")
         paramsAsString = str(params)
@@ -64,4 +64,4 @@
         topology = self.parse(main.tests_path+topologyPath+".topo")
         topoAsString = str(topology)
         return eval(topoAsString)
-                                                                  
+
diff --git a/TestON/drivers/common/cli/onosdriver.py b/TestON/drivers/common/cli/onosdriver.py
index 64bc40f..b6965d3 100644
--- a/TestON/drivers/common/cli/onosdriver.py
+++ b/TestON/drivers/common/cli/onosdriver.py
@@ -165,12 +165,12 @@
     def getEpochMs( self ):
         """
         Returns milliseconds since epoch
-        
-        When checking multiple nodes in a for loop, 
-        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. 
+
+        When checking multiple nodes in a for loop,
+        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.
         """
         try:
             self.handle.sendline( 'date +%s.%N' )
@@ -816,8 +816,8 @@
     def onosCfgSet( self, ONOSIp, configName, configParam ):
         """
         Uses 'onos <node-ip> cfg set' to change a parameter value of an
-        application. 
-        
+        application.
+
         ex)
             onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
         ONOSIp = '10.0.0.1'
@@ -834,19 +834,19 @@
                 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]
-                
+
                 checkStr = ( "onos " + str(ONOSIp) + """ cfg get " """ + str(configName) + " " + paramName + """ " """)
 
                 self.handle.sendline( checkStr )
                 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:
@@ -860,17 +860,17 @@
                 main.log.exception( self.name + ": Uncaught exception!" )
                 main.cleanup()
                 main.exit()
-            
+
             time.sleep(5)
 
         main.log.error("CFG SET FAILURE: " + configName + " " + configParam )
-        main.ONOSbench.handle.sendline("onos $OC1 cfg get") 
+        main.ONOSbench.handle.sendline("onos $OC1 cfg get")
         main.ONOSbench.handle.expect("\$")
         print main.ONOSbench.handle.before
         main.ONOSbench.logReport( ONOSIp, ["ERROR","WARN","EXCEPT"], "d")
         return main.FALSE
 
-        
+
     def onosCli( self, ONOSIp, cmdstr ):
         """
         Uses 'onos' command to send various ONOS CLI arguments.
@@ -1489,7 +1489,7 @@
             * directory to store results
         Optional:
             * interface - default: eth0
-            * grepOptions - options for grep 
+            * grepOptions - options for grep
         Description:
             Uses tshark command to grep specific group of packets
             and stores the results to specified directory.
@@ -1503,7 +1503,7 @@
                 grepStr = "grep "+str(grepOptions)
             else:
                 grepStr = "grep"
-            
+
             cmd = (
                 "sudo tshark -i " +
                 str( interface ) +
@@ -1853,37 +1853,37 @@
 
     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 
+            Create/formats the LinkGraph.cfg file based on arguments
+                -only creates a linear topology and connects islands
+                -evenly distributes devices
                 -must be called by ONOSbench
 
-                ONOSIpList - list of all of the node IPs to be used 
-                
-                deviceCount - number of switches to be assigned 
+                ONOSIpList - list of all of the node IPs to be used
+
+                deviceCount - number of switches to be assigned
         '''
         main.log.step("Creating link graph configuration file." )
         linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
-        tempFile = "/tmp/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")
-        
+
         clusterCount = len(ONOSIpList)
-        
-        if type(deviceCount) is int or type(deviceCount) is str: 
+
+        if type(deviceCount) is int or type(deviceCount) is 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, (deviceCount%clusterCount)+1):
                 switchList[node] += 1
-        
+
         if type(deviceCount) is list:
             main.log.info("Using provided device distribution")
             switchList = [0]
@@ -1901,48 +1901,48 @@
                 continue
 
             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)            
-               
-            lastSwitch = 0 
-            for switch in range (0, switchList[node]-1):    
+                line = ("\t0:5 -> " + str(lastSwitch) + ":6:" + lastIp + "\n")     #ONOSIpList[node-1]
+                linkGraph.write(line)
+
+            lastSwitch = 0
+            for switch in range (0, switchList[node]-1):
                 line = ""
                 line = ("\t" + str(switch) + ":" + str(myPort))
                 line += " -- "
                 line += (str(switch+1) + ":" + str(myPort-1) + "\n")
                 linkGraph.write(line)
-                lastSwitch = switch+1 
+                lastSwitch = switch+1
             lastIp = ONOSIpList[node]
-                
+
             #lastSwitch += 1
-            if node < (clusterCount): 
+            if node < (clusterCount):
                 #connect to first device on the next node
-                line = ("\t" + str(lastSwitch) + ":6 -> 0:5:" + ONOSIpList[node+1] + "\n")             
+                line = ("\t" + str(lastSwitch) + ":6 -> 0:5:" + ONOSIpList[node+1] + "\n")
                 linkGraph.write(line)
-                
+
             linkGraph.write("}\n")
         linkGraph.close()
 
         #SCP
-        os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath)        
+        os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath)
         main.log.info("linkGraph.cfg creation complete")
 
     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  
+            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.step("Configuring Null Device Provider" )
         clusterCount = len(ONOSIpList)
 
-        try: 
-            
+        try:
+
             if type(deviceCount) is int or type(deviceCount) is str:
                 main.log.step("Creating device distribution")
                 deviceCount = int(deviceCount)
@@ -1954,22 +1954,22 @@
 
                 for node in range(1, (deviceCount%clusterCount)+1):
                     switchList[node] += 1
-                
-            if type(deviceCount) is list: 
-                main.log.info("Using provided device distribution") 
-                
-                if len(deviceCount) == clusterCount: 
+
+            if type(deviceCount) is list:
+                main.log.info("Using provided device distribution")
+
+                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)
-        
+
         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
@@ -1981,14 +1981,14 @@
 
         ONOSIp = [0]
         ONOSIp.extend(ONOSIpList)
- 
+
         devicesString  = "devConfigs = "
         for node in range(1, len(ONOSIp)):
             devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
             if node < clusterCount:
                 devicesString += (",")
-        
-        try: 
+
+        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) )
@@ -2004,7 +2004,7 @@
                     time.sleep(1)
 
             assert ("value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification
-        
+
         except AssertionError:
             main.log.error("Incorrect Config settings: " + verification)
         except Exception:
@@ -2012,30 +2012,30 @@
             main.cleanup()
             main.exit()
 
-    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 
+                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(":~")            
+
+        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(":~")
-               
-            for i in range(10): 
-                self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider") 
+
+            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: 
+                else:
                     time.sleep(1)
-            
+
             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 )
@@ -2043,7 +2043,7 @@
             main.exit()
         except AssertionError:
             main.log.info("Settings did not post to ONOS")
-            main.log.error(varification)            
+            main.log.error(varification)
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.log.error(varification)
@@ -2060,33 +2060,33 @@
     def logReport( self, nodeIp, searchTerms, outputMode="s" ):
         '''
             - accepts either a list or a string for "searchTerms" these
-              terms will be searched for in the log and have their 
-              instances counted 
+              terms will be searched for in the log and have their
+              instances counted
 
-            - nodeIp is the ip of the node whos log is to be scanned 
+            - nodeIp is the ip of the node whos log is to be scanned
 
-            - output modes: 
-                "s" -   Simple. Quiet output mode that just prints 
-                        the occurences of each search term 
+            - output modes:
+                "s" -   Simple. Quiet output mode that just prints
+                        the occurences of each search term
 
                 "d" -   Detailed. Prints number of occurences as well as the entire
-                        line for each of the last 5 occurences 
+                        line for each of the last 5 occurences
 
             - returns total of the number of instances of all search terms
         '''
         main.log.info("========================== Log Report ===========================\n")
 
-        if type(searchTerms) is str: 
+        if type(searchTerms) is str:
             searchTerms = [searchTerms]
 
         logLines = [ [" "] for i in range(len(searchTerms)) ]
 
-        for term in range(len(searchTerms)): 
+        for term in range(len(searchTerms)):
             logLines[term][0] = searchTerms[term]
 
-        totalHits = 0 
-        for term in range(len(searchTerms)): 
-            cmd = "onos-ssh " + nodeIp + " cat /opt/onos/log/karaf.log | grep " + searchTerms[term] 
+        totalHits = 0
+        for term in range(len(searchTerms)):
+            cmd = "onos-ssh " + nodeIp + " cat /opt/onos/log/karaf.log | grep " + searchTerms[term]
             self.handle.sendline(cmd)
             self.handle.expect(":~")
             before = (self.handle.before).splitlines()
@@ -2095,25 +2095,25 @@
 
             for line in before:
                 if searchTerms[term] in line and "grep" not in line:
-                    count[1] += 1 
+                    count[1] += 1
                     if before.index(line) > ( len(before) - 7 ):
                         logLines[term].append(line)
 
             main.log.info( str(count[0]) + ": " + str(count[1]) )
-            if term == len(searchTerms)-1: 
+            if term == len(searchTerms)-1:
                 print("\n")
-            totalHits += int(count[1]) 
+            totalHits += int(count[1])
 
-        if outputMode != "s" and outputMode != "S":        
+        if outputMode != "s" and outputMode != "S":
             outputString = ""
             for i in logLines:
-                outputString = i[0] + ": \n" 
-                for x in range(1,len(i)): 
-                    outputString += ( i[x] + "\n" )    
-                
+                outputString = i[0] + ": \n"
+                for x in range(1,len(i)):
+                    outputString += ( i[x] + "\n" )
+
                 if outputString != (i[0] + ": \n"):
-                    main.log.info(outputString) 
-                
+                    main.log.info(outputString)
+
         main.log.info("================================================================\n")
         return totalHits
 
@@ -2174,7 +2174,7 @@
             main.exit()
 
     def jvmSet(self, memory=8):
-        
+
         import os
 
         homeDir = os.path.expanduser('~')
@@ -2192,22 +2192,22 @@
         serviceConfig.close()
 
     def createDBFile(self, testData):
-        
+
         filename = main.TEST + "DB"
         DBString = ""
-        
+
         for item in testData:
-            if type(item) is string: 
+            if type(item) is string:
                 item = "'" + item + "'"
             if testData.index(item) < len(testData-1):
                 item += ","
-            DBString += str(item) 
+            DBString += str(item)
 
         DBFile = open(filename, "a")
         DBFile.write(DBString)
         DBFile.close()
 
-    def verifySummary(self, ONOSIp,*deviceCount): 
+    def verifySummary(self, ONOSIp,*deviceCount):
 
         self.handle.sendline("onos " + ONOSIp  + " summary")
         self.handle.expect(":~")
@@ -2219,12 +2219,12 @@
         #if deviceCount:
         #    passed = "devices=" + str(deviceCount) + "," not in summaryStr
 
-           
+
         if "SCC(s)=1," in summaryStr:
             passed = True
             print("Summary is verifed")
-        else: 
-            print("Summary failed") 
+        else:
+            print("Summary failed")
 
         if deviceCount:
             print" ============================="
@@ -2232,8 +2232,8 @@
             print "Checkstr: " + checkStr
             if checkStr not in summaryStr:
                 passed = False
-                print("Device count failed") 
-            else: 
-                print "device count verified" 
+                print("Device count failed")
+            else:
+                print "device count verified"
 
         return passed
diff --git a/TestON/drivers/common/cli/quaggaclidriver.py b/TestON/drivers/common/cli/quaggaclidriver.py
index d325232..e89047e 100644
--- a/TestON/drivers/common/cli/quaggaclidriver.py
+++ b/TestON/drivers/common/cli/quaggaclidriver.py
@@ -381,7 +381,7 @@
         chunk_size = 20
 
         if len(routes) > chunk_size:
-            num_iter = (int) (len(routes) / chunk_size) 
+            num_iter = (int) (len(routes) / chunk_size)
         else:
             num_iter = 1;
 
@@ -403,7 +403,7 @@
             except Exception:
                 main.log.warn( "Failed to add route" )
                 self.disconnect()
-            
+
             # waitTimer = 1.00 / routeRate
             main.log.info("Total routes so far " + ((str) (total)) + " wait for 0 sec")
             #time.sleep( 1 )
diff --git a/TestON/drivers/common/cli/tool/dpctlclidriver.py b/TestON/drivers/common/cli/tool/dpctlclidriver.py
index 1e5f839..504567c 100644
--- a/TestON/drivers/common/cli/tool/dpctlclidriver.py
+++ b/TestON/drivers/common/cli/tool/dpctlclidriver.py
@@ -44,10 +44,10 @@
         self.name = self.options[ 'name' ]
 
         self.handle = super(
-		      DpctlCliDriver, self ).connect( user_name=self.user_name,
-         	      ip_address=self.ip_address,
-         	      port=None,
-         	      pwd=self.pwd )
+                   DpctlCliDriver, self ).connect( user_name=self.user_name,
+                   ip_address=self.ip_address,
+                   port=None,
+                   pwd=self.pwd )
         if self.handle:
             main.log.info( "Connected to the host" )
             return main.TRUE
@@ -64,12 +64,12 @@
          addFlow create a new flow entry into flow table using "dpctl"
         """
         args = utilities.parse_args( [
-				     "TCPIP",
+                                     "TCPIP",
                                      "TCPPORT",
                                      "INPORT",
                                      "ACTION",
                                      "TIMEOUT" ],
-            			     **flowParameters )
+                             **flowParameters )
 
         cmd = "dpctl add-flow tcp:"
         tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
@@ -250,10 +250,10 @@
          desc_set Sets the switch description ( as returned in ofp_desc_stats ) to string ( max length is DESC_STR_LEN )
         """
         args = utilities.parse_args( [
-				     "TCPIP",
+                                     "TCPIP",
                                      "TCPPORT",
                                      "STRING" ],
-           			     **flowParameters )
+                            **flowParameters )
 
         tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
         tcpPort = args[ "TCPPORT" ] if args[
@@ -278,10 +278,10 @@
          dumpDesc Sets the switch description ( as returned in ofp_desc_stats ) to string ( max length is DESC_STR_LEN )
         """
         args = utilities.parse_args( [
-				     "TCPIP",
+                                     "TCPIP",
                                      "TCPPORT",
                                      "STRING" ],
-            			     **flowParameters )
+                             **flowParameters )
 
         tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
         tcpPort = args[ "TCPPORT" ] if args[
diff --git a/TestON/examples/Assert/Assert.py b/TestON/examples/Assert/Assert.py
index bc2ce2e..0df0a49 100644
--- a/TestON/examples/Assert/Assert.py
+++ b/TestON/examples/Assert/Assert.py
@@ -11,7 +11,7 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
 '''
@@ -22,24 +22,24 @@
 
     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")
         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.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")
-    
+
         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")
-    
+
         main.step("Using assert_lesser to verify the result lesser or not")
         expect = 5
         actual = 10
diff --git a/TestON/examples/CaseParams/CaseParams.py b/TestON/examples/CaseParams/CaseParams.py
index 0502c46..d988c14 100644
--- a/TestON/examples/CaseParams/CaseParams.py
+++ b/TestON/examples/CaseParams/CaseParams.py
@@ -15,27 +15,27 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
-'''  
+'''
 class CaseParams:
     '''
     This example shows the usage of the CASE level parameters, in params file the
     [[CASE]]
         'destination'  = 'h2'
-    
+
     We can get this CASE level parameter like :
     main.params['CASE1']['destination']
-    
-    
+
+
     cd ~/bin/
     ofautomation>run CaseParams example 1
        will execute this example.
     '''
-    
+
     def __init__(self):
         self.default = ""
-                
+
     def CASE1(self,main):
         '''
         This test case will showcase usage of CASE level parameters to specify the host as h2
@@ -44,8 +44,8 @@
         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") 
-        
+        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):
         '''
@@ -55,4 +55,4 @@
         main.step("Host IP Checking using checkIP")
         result = main.Mininet1.checkIP(main.params['CASE2']['destination'])
         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")             
+        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/ExperimentTest/ExperimentTest.py b/TestON/examples/ExperimentTest/ExperimentTest.py
index 7630703..9e80dd2 100644
--- a/TestON/examples/ExperimentTest/ExperimentTest.py
+++ b/TestON/examples/ExperimentTest/ExperimentTest.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
-''' 
+'''
 Created on 26-Nov-2012
-    
+
 @author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
 
 
@@ -16,7 +16,7 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 Testing of the Experimental Mode
 
@@ -25,13 +25,13 @@
 '''
 class ExperimentTest:
     '''
-    Testing of the Experimental Mode 
-    
+    Testing of the Experimental Mode
+
     '''
-    
+
     def __init__(self):
         self.default = ""
-                
+
     def CASE1(self,main):
         '''
         Testing the configuration of the host by using checkIP functionof Mininet driver
@@ -41,8 +41,8 @@
         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")  
+        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")
 
@@ -56,7 +56,7 @@
         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")  
+        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 10cfd69..7e4c2fa 100644
--- a/TestON/examples/StepParams/StepParams.py
+++ b/TestON/examples/StepParams/StepParams.py
@@ -16,24 +16,24 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
-'''  
+    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]]]
         'host'  = 'h2'
-    
+
     We can get this STEP level parameter like :
     main.params['CASE1']['STEP1']['host']
-    
-    
-    ofautomation>run StepParams example 1       
+
+
+    ofautomation>run StepParams example 1
     '''
     def __init__(self):
         self.default = ""
-                
+
     def CASE1(self,main):
         '''
         This example will showcase the usage of STEP level parameters to specify the host as h2
@@ -42,8 +42,8 @@
         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") 
-        
+        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):
         '''
@@ -53,4 +53,4 @@
         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")             
+        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 775535c..efccde9 100644
--- a/TestON/examples/Topology/Topology.py
+++ b/TestON/examples/Topology/Topology.py
@@ -16,33 +16,33 @@
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
-'''  
+    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"]]]
-           
+
     The usage of this component in the test script like below:
-    
+
     main.Mininet1.checkIP(main.params['CASE1']['destination'])
-    
-    Here we are using the Mininet1 which of type Mininet 
-    
-    
-    
+
+    Here we are using the Mininet1 which of type Mininet
+
+
+
     ofautomation>run Topology example 1
        will execute this example.
     '''
     def __init__(self):
         self.default = ""
-                
+
     def CASE1(self,main):
         '''
         This will showcase the usage of Topology
@@ -51,6 +51,6 @@
         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") 
-        
-        
+        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/lib/configobj-4.7.2/._configobj.py b/TestON/lib/configobj-4.7.2/._configobj.py
index a276d79..07fbd90 100644
--- a/TestON/lib/configobj-4.7.2/._configobj.py
+++ b/TestON/lib/configobj-4.7.2/._configobj.py
Binary files differ
diff --git a/TestON/lib/configobj-4.7.2/._setup.py b/TestON/lib/configobj-4.7.2/._setup.py
index 7fb7ea2..2ec4b3d 100644
--- a/TestON/lib/configobj-4.7.2/._setup.py
+++ b/TestON/lib/configobj-4.7.2/._setup.py
Binary files differ
diff --git a/TestON/lib/configobj-4.7.2/._validate.py b/TestON/lib/configobj-4.7.2/._validate.py
index a217e20..286fe7c 100644
--- a/TestON/lib/configobj-4.7.2/._validate.py
+++ b/TestON/lib/configobj-4.7.2/._validate.py
Binary files differ
diff --git a/TestON/lib/configobj-4.7.2/configobj.py b/TestON/lib/configobj-4.7.2/configobj.py
index c1f6e6d..eae556a 100644
--- a/TestON/lib/configobj-4.7.2/configobj.py
+++ b/TestON/lib/configobj-4.7.2/configobj.py
@@ -153,29 +153,29 @@
 
 
 class Builder(object):
-    
+
     def build(self, o):
         m = getattr(self, 'build_' + o.__class__.__name__, None)
         if m is None:
             raise UnknownType(o.__class__.__name__)
         return m(o)
-    
+
     def build_List(self, o):
         return map(self.build, o.getChildren())
-    
+
     def build_Const(self, o):
         return o.value
-    
+
     def build_Dict(self, o):
         d = {}
         i = iter(map(self.build, o.getChildren()))
         for el in i:
             d[el] = i.next()
         return d
-    
+
     def build_Tuple(self, o):
         return tuple(self.build_List(o))
-    
+
     def build_Name(self, o):
         if o.name == 'None':
             return None
@@ -183,10 +183,10 @@
             return True
         if o.name == 'False':
             return False
-        
+
         # An undefined Name
         raise UnknownType('Undefined Name')
-    
+
     def build_Add(self, o):
         real, imag = map(self.build_Const, o.getChildren())
         try:
@@ -196,14 +196,14 @@
         if not isinstance(imag, complex) or imag.real != 0.0:
             raise UnknownType('Add')
         return real+imag
-    
+
     def build_Getattr(self, o):
         parent = self.build(o.expr)
         return getattr(parent, o.attrname)
-    
+
     def build_UnarySub(self, o):
         return -self.build_Const(o.getChildren()[0])
-    
+
     def build_UnaryAdd(self, o):
         return self.build_Const(o.getChildren()[0])
 
@@ -317,7 +317,7 @@
         # short-cut
         if not self._cookie in value:
             return value
-        
+
         def recursive_interpolate(key, value, section, backtrail):
             """The function that does the actual work.
 
@@ -417,7 +417,7 @@
         (e.g., if we interpolated "$$" and returned "$").
         """
         raise NotImplementedError()
-    
+
 
 
 class ConfigParserInterpolation(InterpolationEngine):
@@ -466,27 +466,27 @@
 
 def __newobj__(cls, *args):
     # Hack for pickle
-    return cls.__new__(cls, *args) 
+    return cls.__new__(cls, *args)
 
 class Section(dict):
     """
     A dictionary-like object that represents a section in a config file.
-    
+
     It does string interpolation if the 'interpolation' attribute
     of the 'main' object is set to True.
-    
+
     Interpolation is tried first from this object, then from the 'DEFAULT'
     section of this object, next from the parent and its 'DEFAULT' section,
     and so on until the main object is reached.
-    
+
     A Section will behave like an ordered dictionary - following the
     order of the ``scalars`` and ``sections`` attributes.
     You can use this to change the order of members.
-    
+
     Iteration follows the order: scalars, then sections.
     """
 
-    
+
     def __setstate__(self, state):
         dict.update(self, state[0])
         self.__dict__.update(state[1])
@@ -494,8 +494,8 @@
     def __reduce__(self):
         state = (dict(self), self.__dict__)
         return (__newobj__, (self.__class__,), state)
-    
-    
+
+
     def __init__(self, parent, depth, main, indict=None, name=None):
         """
         * parent is the section above
@@ -520,8 +520,8 @@
         # (rather than just passing to ``dict.__init__``)
         for entry, value in indict.iteritems():
             self[entry] = value
-            
-            
+
+
     def _initialise(self):
         # the sequence of scalar values in this Section
         self.scalars = []
@@ -565,7 +565,7 @@
     def __getitem__(self, key):
         """Fetch the item and do string interpolation."""
         val = dict.__getitem__(self, key)
-        if self.main.interpolation: 
+        if self.main.interpolation:
             if isinstance(val, basestring):
                 return self._interpolate(key, val)
             if isinstance(val, list):
@@ -582,20 +582,20 @@
     def __setitem__(self, key, value, unrepr=False):
         """
         Correctly set a value.
-        
+
         Making dictionary values Section instances.
         (We have to special case 'Section' instances - which are also dicts)
-        
+
         Keys must be strings.
         Values need only be strings (or lists of strings) if
         ``main.stringify`` is set.
-        
+
         ``unrepr`` must be set when setting a value to a dictionary, without
         creating a new sub-section.
         """
         if not isinstance(key, basestring):
             raise ValueError('The key "%s" is not a string.' % key)
-        
+
         # add the comment
         if key not in self.comments:
             self.comments[key] = []
@@ -696,7 +696,7 @@
         """
         A version of clear that also affects scalars/sections
         Also clears comments and configspec.
-        
+
         Leaves other attributes alone :
             depth/main/parent are not affected
         """
@@ -770,10 +770,10 @@
     def dict(self):
         """
         Return a deepcopy of self as a dictionary.
-        
+
         All members that are ``Section`` instances are recursively turned to
         ordinary dictionaries - by calling their ``dict`` method.
-        
+
         >>> n = a.dict()
         >>> n == a
         1
@@ -798,7 +798,7 @@
     def merge(self, indict):
         """
         A recursive update - useful for merging config files.
-        
+
         >>> a = '''[section1]
         ...     option1 = True
         ...     [[subsection]]
@@ -818,17 +818,17 @@
             if (key in self and isinstance(self[key], dict) and
                                 isinstance(val, dict)):
                 self[key].merge(val)
-            else:   
+            else:
                 self[key] = val
 
 
     def rename(self, oldkey, newkey):
         """
         Change a keyname to another, without changing position in sequence.
-        
+
         Implemented so that transformations can be made on keys,
         as well as on values. (used by encode and decode)
-        
+
         Also renames comments.
         """
         if oldkey in self.scalars:
@@ -856,30 +856,30 @@
             call_on_sections=False, **keywargs):
         """
         Walk every member and call a function on the keyword and value.
-        
+
         Return a dictionary of the return values
-        
+
         If the function raises an exception, raise the errror
         unless ``raise_errors=False``, in which case set the return value to
         ``False``.
-        
+
         Any unrecognised keyword arguments you pass to walk, will be pased on
         to the function you pass in.
-        
+
         Note: if ``call_on_sections`` is ``True`` then - on encountering a
         subsection, *first* the function is called for the *whole* subsection,
         and then recurses into it's members. This means your function must be
         able to handle strings, dictionaries and lists. This allows you
         to change the key of subsections as well as for ordinary members. The
         return value when called on the whole subsection has to be discarded.
-        
+
         See  the encode and decode methods for examples, including functions.
-        
+
         .. admonition:: caution
-        
+
             You can use ``walk`` to transform the names of members of a section
             but you mustn't add or delete members.
-        
+
         >>> config = '''[XXXXsection]
         ... XXXXkey = XXXXvalue'''.splitlines()
         >>> cfg = ConfigObj(config)
@@ -942,17 +942,17 @@
         Accepts a key as input. The corresponding value must be a string or
         the objects (``True`` or 1) or (``False`` or 0). We allow 0 and 1 to
         retain compatibility with Python 2.2.
-        
-        If the string is one of  ``True``, ``On``, ``Yes``, or ``1`` it returns 
+
+        If the string is one of  ``True``, ``On``, ``Yes``, or ``1`` it returns
         ``True``.
-        
-        If the string is one of  ``False``, ``Off``, ``No``, or ``0`` it returns 
+
+        If the string is one of  ``False``, ``Off``, ``No``, or ``0`` it returns
         ``False``.
-        
+
         ``as_bool`` is not case sensitive.
-        
+
         Any other input will raise a ``ValueError``.
-        
+
         >>> a = ConfigObj()
         >>> a['a'] = 'fish'
         >>> a.as_bool('a')
@@ -984,10 +984,10 @@
     def as_int(self, key):
         """
         A convenience method which coerces the specified value to an integer.
-        
+
         If the value is an invalid literal for ``int``, a ``ValueError`` will
         be raised.
-        
+
         >>> a = ConfigObj()
         >>> a['a'] = 'fish'
         >>> a.as_int('a')
@@ -1007,10 +1007,10 @@
     def as_float(self, key):
         """
         A convenience method which coerces the specified value to a float.
-        
+
         If the value is an invalid literal for ``float``, a ``ValueError`` will
         be raised.
-        
+
         >>> a = ConfigObj()
         >>> a['a'] = 'fish'
         >>> a.as_float('a')
@@ -1024,13 +1024,13 @@
         3.2000000000000002
         """
         return float(self[key])
-    
-    
+
+
     def as_list(self, key):
         """
         A convenience method which fetches the specified value, guaranteeing
         that it is a list.
-        
+
         >>> a = ConfigObj()
         >>> a['a'] = 1
         >>> a.as_list('a')
@@ -1046,15 +1046,15 @@
         if isinstance(result, (tuple, list)):
             return list(result)
         return [result]
-        
+
 
     def restore_default(self, key):
         """
         Restore (and return) default value for the specified key.
-        
+
         This method will only work for a ConfigObj that was created
         with a configspec and has been validated.
-        
+
         If there is no default value for this key, ``KeyError`` is raised.
         """
         default = self.default_values[key]
@@ -1063,20 +1063,20 @@
             self.defaults.append(key)
         return default
 
-    
+
     def restore_defaults(self):
         """
         Recursively restore default values to all members
         that have them.
-        
+
         This method will only work for a ConfigObj that was created
         with a configspec and has been validated.
-        
+
         It doesn't delete or modify entries without default values.
         """
         for key in self.default_values:
             self.restore_default(key)
-            
+
         for section in self.sections:
             self[section].restore_defaults()
 
@@ -1191,7 +1191,7 @@
                  write_empty_values=False, _inspec=False):
         """
         Parse a config file or create a config file object.
-        
+
         ``ConfigObj(infile=None, configspec=None, encoding=None,
                     interpolation=True, raise_errors=False, list_values=True,
                     create_empty=False, file_error=False, stringify=True,
@@ -1201,9 +1201,9 @@
         self._inspec = _inspec
         # init the superclass
         Section.__init__(self, self, 0, self)
-        
+
         infile = infile or []
-        
+
         _options = {'configspec': configspec,
                     'encoding': encoding, 'interpolation': interpolation,
                     'raise_errors': raise_errors, 'list_values': list_values,
@@ -1219,7 +1219,7 @@
             warnings.warn('Passing in an options dictionary to ConfigObj() is '
                           'deprecated. Use **options instead.',
                           DeprecationWarning, stacklevel=2)
-            
+
             # TODO: check the values too.
             for entry in options:
                 if entry not in OPTION_DEFAULTS:
@@ -1230,18 +1230,18 @@
                 keyword_value = _options[entry]
                 if value != keyword_value:
                     options[entry] = keyword_value
-        
+
         # XXXX this ignores an explicit list_values = True in combination
         # with _inspec. The user should *never* do that anyway, but still...
         if _inspec:
             options['list_values'] = False
-        
+
         self._initialise(options)
         configspec = options['configspec']
         self._original_configspec = configspec
         self._load(infile, configspec)
-        
-        
+
+
     def _load(self, infile, configspec):
         if isinstance(infile, basestring):
             self.filename = infile
@@ -1261,10 +1261,10 @@
                     h.write('')
                     h.close()
                 infile = []
-                
+
         elif isinstance(infile, (list, tuple)):
             infile = list(infile)
-            
+
         elif isinstance(infile, dict):
             # initialise self
             # the Section class handles creating subsections
@@ -1277,18 +1277,18 @@
                         this_section[section] = {}
                         set_section(in_section[section], this_section[section])
                 set_section(infile, self)
-                
+
             else:
                 for entry in infile:
                     self[entry] = infile[entry]
             del self._errors
-            
+
             if configspec is not None:
                 self._handle_configspec(configspec)
             else:
                 self.configspec = None
             return
-        
+
         elif getattr(infile, 'read', MISSING) is not MISSING:
             # This supports file like objects
             infile = infile.read() or []
@@ -1296,7 +1296,7 @@
             # in case it's not an 8 bit encoding
         else:
             raise TypeError('infile must be a filename, file like object, or list of lines.')
-        
+
         if infile:
             # don't do it for the empty ConfigObj
             infile = self._handle_bom(infile)
@@ -1314,7 +1314,7 @@
                 break
 
             infile = [line.rstrip('\r\n') for line in infile]
-            
+
         self._parse(infile)
         # if we had any errors, now is the time to raise them
         if self._errors:
@@ -1332,17 +1332,17 @@
             raise error
         # delete private attributes
         del self._errors
-        
+
         if configspec is None:
             self.configspec = None
         else:
             self._handle_configspec(configspec)
-    
-    
+
+
     def _initialise(self, options=None):
         if options is None:
             options = OPTION_DEFAULTS
-            
+
         # initialise a few variables
         self.filename = None
         self._errors = []
@@ -1359,48 +1359,48 @@
         self.newlines = None
         self.write_empty_values = options['write_empty_values']
         self.unrepr = options['unrepr']
-        
+
         self.initial_comment = []
         self.final_comment = []
         self.configspec = None
-        
+
         if self._inspec:
             self.list_values = False
-        
+
         # Clear section attributes as well
         Section._initialise(self)
-        
-        
+
+
     def __repr__(self):
         def _getval(key):
             try:
                 return self[key]
             except MissingInterpolationOption:
                 return dict.__getitem__(self, key)
-        return ('ConfigObj({%s})' % 
-                ', '.join([('%s: %s' % (repr(key), repr(_getval(key)))) 
+        return ('ConfigObj({%s})' %
+                ', '.join([('%s: %s' % (repr(key), repr(_getval(key))))
                 for key in (self.scalars + self.sections)]))
-    
-    
+
+
     def _handle_bom(self, infile):
         """
         Handle any BOM, and decode if necessary.
-        
+
         If an encoding is specified, that *must* be used - but the BOM should
         still be removed (and the BOM attribute set).
-        
+
         (If the encoding is wrongly specified, then a BOM for an alternative
         encoding won't be discovered or removed.)
-        
+
         If an encoding is not specified, UTF8 or UTF16 BOM will be detected and
         removed. The BOM attribute will be set. UTF16 will be decoded to
         unicode.
-        
+
         NOTE: This method must not be called with an empty ``infile``.
-        
+
         Specifying the *wrong* encoding is likely to cause a
         ``UnicodeDecodeError``.
-        
+
         ``infile`` must always be returned as a list of lines, but may be
         passed in as a single string.
         """
@@ -1410,7 +1410,7 @@
             # the encoding specified doesn't have one
             # just decode
             return self._decode(infile, self.encoding)
-        
+
         if isinstance(infile, (list, tuple)):
             line = infile[0]
         else:
@@ -1432,18 +1432,18 @@
                         ##self.BOM = True
                         # Don't need to remove BOM
                         return self._decode(infile, encoding)
-                    
+
                 # If we get this far, will *probably* raise a DecodeError
                 # As it doesn't appear to start with a BOM
                 return self._decode(infile, self.encoding)
-            
+
             # Must be UTF8
             BOM = BOM_SET[enc]
             if not line.startswith(BOM):
                 return self._decode(infile, self.encoding)
-            
+
             newline = line[len(BOM):]
-            
+
             # BOM removed
             if isinstance(infile, (list, tuple)):
                 infile[0] = newline
@@ -1451,7 +1451,7 @@
                 infile = newline
             self.BOM = True
             return self._decode(infile, self.encoding)
-        
+
         # No encoding specified - so we need to check for UTF8/UTF16
         for BOM, (encoding, final_encoding) in BOMS.items():
             if not line.startswith(BOM):
@@ -1475,7 +1475,7 @@
                         return infile
                 # UTF16 - have to decode
                 return self._decode(infile, encoding)
-            
+
         # No BOM discovered and no encoding specified, just return
         if isinstance(infile, basestring):
             # infile read from a file will be a single string
@@ -1494,7 +1494,7 @@
     def _decode(self, infile, encoding):
         """
         Decode infile to unicode. Using the specified encoding.
-        
+
         if is a string, it also needs converting to a list.
         """
         if isinstance(infile, basestring):
@@ -1535,14 +1535,14 @@
         temp_list_values = self.list_values
         if self.unrepr:
             self.list_values = False
-            
+
         comment_list = []
         done_start = False
         this_section = self
         maxline = len(infile) - 1
         cur_index = -1
         reset_comment = False
-        
+
         while cur_index < maxline:
             if reset_comment:
                 comment_list = []
@@ -1554,13 +1554,13 @@
                 reset_comment = False
                 comment_list.append(line)
                 continue
-            
+
             if not done_start:
                 # preserve initial comment
                 self.initial_comment = comment_list
                 comment_list = []
                 done_start = True
-                
+
             reset_comment = True
             # first we check if it's a section marker
             mat = self._sectionmarker.match(line)
@@ -1574,7 +1574,7 @@
                     self._handle_error("Cannot compute the section depth at line %s.",
                                        NestingError, infile, cur_index)
                     continue
-                
+
                 if cur_depth < this_section.depth:
                     # the new section is dropping back to a previous level
                     try:
@@ -1593,13 +1593,13 @@
                 else:
                     self._handle_error("Section too nested at line %s.",
                                        NestingError, infile, cur_index)
-                    
+
                 sect_name = self._unquote(sect_name)
                 if sect_name in parent:
                     self._handle_error('Duplicate section name at line %s.',
                                        DuplicateError, infile, cur_index)
                     continue
-                
+
                 # create the new section
                 this_section = Section(
                     parent,
@@ -1702,7 +1702,7 @@
         """
         Given a section and a depth level, walk back through the sections
         parents to see if the depth level matches a previous section.
-        
+
         Return a reference to the right section,
         or raise a SyntaxError.
         """
@@ -1720,7 +1720,7 @@
     def _handle_error(self, text, ErrorClass, infile, cur_index):
         """
         Handle an error according to the error settings.
-        
+
         Either raise the error or store it.
         The error will have occured at ``cur_index``
         """
@@ -1749,19 +1749,19 @@
     def _quote(self, value, multiline=True):
         """
         Return a safely quoted version of a value.
-        
+
         Raise a ConfigObjError if the value cannot be safely quoted.
         If multiline is ``True`` (default) then use triple quotes
         if necessary.
-        
+
         * Don't quote values that don't need it.
         * Recursively quote members of a list and return a comma joined list.
         * Multiline is ``False`` for lists.
         * Obey list syntax for empty and single member lists.
-        
+
         If ``list_values=False`` then the value is only quoted if it contains
         a ``\\n`` (is multiline) or '#'.
-        
+
         If ``write_empty_values`` is set, and the value is an empty string, it
         won't be quoted.
         """
@@ -1769,7 +1769,7 @@
             # Only if multiline is set, so that it is used for values not
             # keys, and not values that are part of a list
             return ''
-        
+
         if multiline and isinstance(value, (list, tuple)):
             if not value:
                 return ','
@@ -1785,12 +1785,12 @@
 
         if not value:
             return '""'
-        
+
         no_lists_no_quotes = not self.list_values and '\n' not in value and '#' not in value
         need_triple = multiline and ((("'" in value) and ('"' in value)) or ('\n' in value ))
         hash_triple_quote = multiline and not need_triple and ("'" in value) and ('"' in value) and ('#' in value)
         check_for_single = (no_lists_no_quotes or not need_triple) and not hash_triple_quote
-        
+
         if check_for_single:
             if not self.list_values:
                 # we don't quote if ``list_values=False``
@@ -1808,13 +1808,13 @@
         else:
             # if value has '\n' or "'" *and* '"', it will need triple quotes
             quot = self._get_triple_quote(value)
-        
+
         if quot == noquot and '#' in value and self.list_values:
             quot = self._get_single_quote(value)
-                
+
         return quot % value
-    
-    
+
+
     def _get_single_quote(self, value):
         if ("'" in value) and ('"' in value):
             raise ConfigObjError('Value "%s" cannot be safely quoted.' % value)
@@ -1823,15 +1823,15 @@
         else:
             quot = dquot
         return quot
-    
-    
+
+
     def _get_triple_quote(self, value):
         if (value.find('"""') != -1) and (value.find("'''") != -1):
             raise ConfigObjError('Value "%s" cannot be safely quoted.' % value)
         if value.find('"""') == -1:
             quot = tdquot
         else:
-            quot = tsquot 
+            quot = tsquot
         return quot
 
 
@@ -1921,7 +1921,7 @@
 
     def _handle_configspec(self, configspec):
         """Parse the configspec."""
-        # FIXME: Should we check that the configspec was created with the 
+        # FIXME: Should we check that the configspec was created with the
         #        correct settings ? (i.e. ``list_values=False``)
         if not isinstance(configspec, ConfigObj):
             try:
@@ -1935,11 +1935,11 @@
                 raise ConfigspecError('Parsing configspec failed: %s' % e)
             except IOError, e:
                 raise IOError('Reading configspec failed: %s' % e)
-        
-        self.configspec = configspec
-            
 
-        
+        self.configspec = configspec
+
+
+
     def _set_configspec(self, section, copy):
         """
         Called by validate. Handles setting the configspec on subsections
@@ -1951,7 +1951,7 @@
             for entry in section.sections:
                 if entry not in configspec:
                     section[entry].configspec = many
-                    
+
         for entry in configspec.sections:
             if entry == '__many__':
                 continue
@@ -1962,11 +1962,11 @@
                     # copy comments
                     section.comments[entry] = configspec.comments.get(entry, [])
                     section.inline_comments[entry] = configspec.inline_comments.get(entry, '')
-                
+
             # Could be a scalar when we expect a section
             if isinstance(section[entry], Section):
                 section[entry].configspec = configspec[entry]
-                        
+
 
     def _write_line(self, indent_string, entry, this_entry, comment):
         """Write an individual line, for the write method"""
@@ -2006,9 +2006,9 @@
     def write(self, outfile=None, section=None):
         """
         Write the current ConfigObj as a file
-        
+
         tekNico: FIXME: use StringIO instead of real files
-        
+
         >>> filename = a.filename
         >>> a.filename = 'test.ini'
         >>> a.write()
@@ -2021,7 +2021,7 @@
         if self.indent_type is None:
             # this can be true if initialised from a dictionary
             self.indent_type = DEFAULT_INDENT_TYPE
-            
+
         out = []
         cs = self._a_to_u('#')
         csp = self._a_to_u('# ')
@@ -2035,7 +2035,7 @@
                 if stripped_line and not stripped_line.startswith(cs):
                     line = csp + line
                 out.append(line)
-                
+
         indent_string = self.indent_type * section.depth
         for entry in (section.scalars + section.sections):
             if entry in section.defaults:
@@ -2048,7 +2048,7 @@
                 out.append(indent_string + comment_line)
             this_entry = section[entry]
             comment = self._handle_comment(section.inline_comments[entry])
-            
+
             if isinstance(this_entry, dict):
                 # a section
                 out.append(self._write_marker(
@@ -2063,7 +2063,7 @@
                     entry,
                     this_entry,
                     comment))
-                
+
         if section is self:
             for line in self.final_comment:
                 line = self._decode_element(line)
@@ -2072,10 +2072,10 @@
                     line = csp + line
                 out.append(line)
             self.interpolation = int_val
-            
+
         if section is not self:
             return out
-        
+
         if (self.filename is None) and (outfile is None):
             # output a list of lines
             # might need to encode
@@ -2089,7 +2089,7 @@
                     out.append('')
                 out[0] = BOM_UTF8 + out[0]
             return out
-        
+
         # Turn the list to a string, joined with correct newlines
         newline = self.newlines or os.linesep
         if (getattr(outfile, 'mode', None) is not None and outfile.mode == 'w'
@@ -2102,7 +2102,7 @@
         if self.BOM and ((self.encoding is None) or match_utf8(self.encoding)):
             # Add the UTF8 BOM
             output = BOM_UTF8 + output
-            
+
         if not output.endswith(newline):
             output += newline
         if outfile is not None:
@@ -2117,34 +2117,34 @@
                  section=None):
         """
         Test the ConfigObj against a configspec.
-        
+
         It uses the ``validator`` object from *validate.py*.
-        
+
         To run ``validate`` on the current ConfigObj, call: ::
-        
+
             test = config.validate(validator)
-        
+
         (Normally having previously passed in the configspec when the ConfigObj
         was created - you can dynamically assign a dictionary of checks to the
         ``configspec`` attribute of a section though).
-        
+
         It returns ``True`` if everything passes, or a dictionary of
         pass/fails (True/False). If every member of a subsection passes, it
         will just have the value ``True``. (It also returns ``False`` if all
         members fail).
-        
+
         In addition, it converts the values from strings to their native
         types if their checks pass (and ``stringify`` is set).
-        
+
         If ``preserve_errors`` is ``True`` (``False`` is default) then instead
         of a marking a fail with a ``False``, it will preserve the actual
         exception object. This can contain info about the reason for failure.
         For example the ``VdtValueTooSmallError`` indicates that the value
         supplied was too small. If a value (or section) is missing it will
         still be marked as ``False``.
-        
+
         You must have the validate module to use ``preserve_errors=True``.
-        
+
         You can then use the ``flatten_errors`` function to turn your nested
         results dictionary into a flattened list of failures - useful for
         displaying meaningful error messages.
@@ -2157,7 +2157,7 @@
                 # Which makes importing configobj faster
                 from validate import VdtMissingValue
                 self._vdtMissingValue = VdtMissingValue
-                
+
             section = self
 
             if copy:
@@ -2167,23 +2167,23 @@
                 section.BOM = section.configspec.BOM
                 section.newlines = section.configspec.newlines
                 section.indent_type = section.configspec.indent_type
-            
+
         #
         # section.default_values.clear() #??
         configspec = section.configspec
         self._set_configspec(section, copy)
 
-        
+
         def validate_entry(entry, spec, val, missing, ret_true, ret_false):
             section.default_values.pop(entry, None)
-                
+
             try:
                 section.default_values[entry] = validator.get_default_value(configspec[entry])
             except (KeyError, AttributeError, validator.baseErrorClass):
                 # No default, bad default or validator has no 'get_default_value'
                 # (e.g. SimpleVal)
                 pass
-            
+
             try:
                 check = validator.check(spec,
                                         val,
@@ -2217,16 +2217,16 @@
                 if not copy and missing and entry not in section.defaults:
                     section.defaults.append(entry)
             return ret_true, ret_false
-        
+
         #
         out = {}
         ret_true = True
         ret_false = True
-        
+
         unvalidated = [k for k in section.scalars if k not in configspec]
-        incorrect_sections = [k for k in configspec.sections if k in section.scalars]        
+        incorrect_sections = [k for k in configspec.sections if k in section.scalars]
         incorrect_scalars = [k for k in configspec.scalars if k in section.sections]
-        
+
         for entry in configspec.scalars:
             if entry in ('__many__', '___many___'):
                 # reserved names
@@ -2246,16 +2246,16 @@
             else:
                 missing = False
                 val = section[entry]
-            
-            ret_true, ret_false = validate_entry(entry, configspec[entry], val, 
+
+            ret_true, ret_false = validate_entry(entry, configspec[entry], val,
                                                  missing, ret_true, ret_false)
-        
+
         many = None
         if '__many__' in configspec.scalars:
             many = configspec['__many__']
         elif '___many___' in configspec.scalars:
             many = configspec['___many___']
-        
+
         if many is not None:
             for entry in unvalidated:
                 val = section[entry]
@@ -2279,7 +2279,7 @@
                 ret_false = False
                 msg = 'Section %r was provided as a single value' % entry
                 out[entry] = validator.baseErrorClass(msg)
-                
+
         # Missing sections will have been created as empty ones when the
         # configspec was read.
         for entry in section.sections:
@@ -2300,7 +2300,7 @@
                 ret_false = False
             else:
                 ret_true = False
-        
+
         section.extra_values = unvalidated
         if preserve_errors and not section._created:
             # If the section wasn't created (i.e. it wasn't missing)
@@ -2329,12 +2329,12 @@
         self.configspec = None
         # Just to be sure ;-)
         self._original_configspec = None
-        
-        
+
+
     def reload(self):
         """
         Reload a ConfigObj from file.
-        
+
         This method raises a ``ReloadError`` if the ConfigObj doesn't have
         a filename attribute pointing to a file.
         """
@@ -2347,31 +2347,31 @@
             if entry == 'configspec':
                 continue
             current_options[entry] = getattr(self, entry)
-            
+
         configspec = self._original_configspec
         current_options['configspec'] = configspec
-            
+
         self.clear()
         self._initialise(current_options)
         self._load(filename, configspec)
-        
+
 
 
 class SimpleVal(object):
     """
     A simple validator.
     Can be used to check that all members expected are present.
-    
+
     To use it, provide a configspec with all your members in (the value given
     will be ignored). Pass an instance of ``SimpleVal`` to the ``validate``
     method of your ``ConfigObj``. ``validate`` will return ``True`` if all
     members are present, or a dictionary with True/False meaning
     present/missing. (Whole missing sections will be replaced with ``False``)
     """
-    
+
     def __init__(self):
         self.baseErrorClass = ConfigObjError
-    
+
     def check(self, check, member, missing=False):
         """A dummy check method, always returns the value unchanged."""
         if missing:
@@ -2383,32 +2383,32 @@
     """
     An example function that will turn a nested dictionary of results
     (as returned by ``ConfigObj.validate``) into a flat list.
-    
+
     ``cfg`` is the ConfigObj instance being checked, ``res`` is the results
     dictionary returned by ``validate``.
-    
+
     (This is a recursive function, so you shouldn't use the ``levels`` or
     ``results`` arguments - they are used by the function.)
-    
+
     Returns a list of keys that failed. Each member of the list is a tuple::
-    
+
         ([list of sections...], key, result)
-    
+
     If ``validate`` was called with ``preserve_errors=False`` (the default)
     then ``result`` will always be ``False``.
 
     *list of sections* is a flattened list of sections that the key was found
     in.
-    
+
     If the section was missing (or a section was expected and a scalar provided
     - or vice-versa) then key will be ``None``.
-    
+
     If the value (or section) was missing then ``result`` will be ``False``.
-    
+
     If ``validate`` was called with ``preserve_errors=True`` and a value
     was present, but failed the check, then ``result`` will be the exception
     object returned. You can use this as a string that describes the failure.
-    
+
     For example *The value "3" is of the wrong type*.
     """
     if levels is None:
@@ -2443,21 +2443,21 @@
     """
     Find all the values and sections not in the configspec from a validated
     ConfigObj.
-    
+
     ``get_extra_values`` returns a list of tuples where each tuple represents
     either an extra section, or an extra value.
-    
-    The tuples contain two values, a tuple representing the section the value 
+
+    The tuples contain two values, a tuple representing the section the value
     is in and the name of the extra values. For extra values in the top level
     section the first member will be an empty tuple. For values in the 'foo'
     section the first member will be ``('foo',)``. For members in the 'bar'
     subsection of the 'foo' section the first member will be ``('foo', 'bar')``.
-    
+
     NOTE: If you call ``get_extra_values`` on a ConfigObj instance that hasn't
     been validated it will return an empty list.
     """
     out = []
-    
+
     out.extend([(_prepend, name) for name in conf.extra_values])
     for name in conf.sections:
         if name not in conf.extra_values:
diff --git a/TestON/lib/configobj-4.7.2/validate.py b/TestON/lib/configobj-4.7.2/validate.py
index 73dbdb8..9da84ac 100644
--- a/TestON/lib/configobj-4.7.2/validate.py
+++ b/TestON/lib/configobj-4.7.2/validate.py
@@ -17,114 +17,114 @@
 # Comments, suggestions and bug reports welcome.
 
 """
-    The Validator object is used to check that supplied values 
+    The Validator object is used to check that supplied values
     conform to a specification.
-    
+
     The value can be supplied as a string - e.g. from a config file.
     In this case the check will also *convert* the value to
     the required type. This allows you to add validation
     as a transparent layer to access data stored as strings.
     The validation checks that the data is correct *and*
     converts it to the expected type.
-    
+
     Some standard checks are provided for basic data types.
     Additional checks are easy to write. They can be
     provided when the ``Validator`` is instantiated or
     added afterwards.
-    
+
     The standard functions work with the following basic data types :
-    
+
     * integers
     * floats
     * booleans
     * strings
     * ip_addr
-    
+
     plus lists of these datatypes
-    
+
     Adding additional checks is done through coding simple functions.
-    
-    The full set of standard checks are : 
-    
+
+    The full set of standard checks are :
+
     * 'integer': matches integer values (including negative)
                  Takes optional 'min' and 'max' arguments : ::
-    
+
                    integer()
                    integer(3, 9)  # any value from 3 to 9
                    integer(min=0) # any positive value
                    integer(max=9)
-    
+
     * 'float': matches float values
                Has the same parameters as the integer check.
-    
+
     * 'boolean': matches boolean values - ``True`` or ``False``
                  Acceptable string values for True are :
                    true, on, yes, 1
                  Acceptable string values for False are :
                    false, off, no, 0
-    
+
                  Any other value raises an error.
-    
+
     * 'ip_addr': matches an Internet Protocol address, v.4, represented
                  by a dotted-quad string, i.e. '1.2.3.4'.
-    
+
     * 'string': matches any string.
                 Takes optional keyword args 'min' and 'max'
                 to specify min and max lengths of the string.
-    
+
     * 'list': matches any list.
               Takes optional keyword args 'min', and 'max' to specify min and
               max sizes of the list. (Always returns a list.)
-    
+
     * 'tuple': matches any tuple.
               Takes optional keyword args 'min', and 'max' to specify min and
               max sizes of the tuple. (Always returns a tuple.)
-    
+
     * 'int_list': Matches a list of integers.
                   Takes the same arguments as list.
-    
+
     * 'float_list': Matches a list of floats.
                     Takes the same arguments as list.
-    
+
     * 'bool_list': Matches a list of boolean values.
                    Takes the same arguments as list.
-    
+
     * 'ip_addr_list': Matches a list of IP addresses.
                      Takes the same arguments as list.
-    
+
     * 'string_list': Matches a list of strings.
                      Takes the same arguments as list.
-    
-    * 'mixed_list': Matches a list with different types in 
+
+    * 'mixed_list': Matches a list with different types in
                     specific positions. List size must match
                     the number of arguments.
-    
+
                     Each position can be one of :
                     'integer', 'float', 'ip_addr', 'string', 'boolean'
-    
+
                     So to specify a list with two strings followed
                     by two integers, you write the check as : ::
-    
+
                       mixed_list('string', 'string', 'integer', 'integer')
-    
+
     * 'pass': This check matches everything ! It never fails
               and the value is unchanged.
-    
+
               It is also the default if no check is specified.
-    
+
     * 'option': This check matches any from a list of options.
                 You specify this check with : ::
-    
+
                   option('option 1', 'option 2', 'option 3')
-    
+
     You can supply a default value (returned if no value is supplied)
     using the default keyword argument.
-    
+
     You specify a list argument for default using a list constructor syntax in
     the check : ::
-    
+
         checkname(arg1, arg2, default=list('val 1', 'val 2', 'val 3'))
-    
+
     A badly formatted set of arguments will raise a ``VdtParamError``.
 """
 
@@ -259,7 +259,7 @@
 def dottedQuadToNum(ip):
     """
     Convert decimal dotted quad string to long integer
-    
+
     >>> int(dottedQuadToNum('1 '))
     1
     >>> int(dottedQuadToNum(' 1.2'))
@@ -274,10 +274,10 @@
     Traceback (most recent call last):
     ValueError: Not a good dotted-quad IP: 255.255.255.256
     """
-    
+
     # import here to avoid it when ip_addr values are not used
     import socket, struct
-    
+
     try:
         return struct.unpack('!L',
             socket.inet_aton(ip.strip()))[0]
@@ -293,7 +293,7 @@
 def numToDottedQuad(num):
     """
     Convert long int to dotted quad string
-    
+
     >>> numToDottedQuad(-1L)
     Traceback (most recent call last):
     ValueError: Not a good numeric IP: -1
@@ -311,10 +311,10 @@
     Traceback (most recent call last):
     ValueError: Not a good numeric IP: 4294967296
     """
-    
+
     # import here to avoid it when ip_addr values are not used
     import socket, struct
-    
+
     # no need to intercept here, 4294967295L is fine
     if num > 4294967295L or num < 0:
         raise ValueError('Not a good numeric IP: %s' % num)
@@ -329,10 +329,10 @@
     """
     This error indicates that the check failed.
     It can be the base class for more specific errors.
-    
+
     Any check function that fails ought to raise this error.
     (or a subclass)
-    
+
     >>> raise ValidateError
     Traceback (most recent call last):
     ValidateError
@@ -381,7 +381,7 @@
 
 class VdtValueError(ValidateError):
     """The value supplied was of the correct type, but was not an allowed value."""
-    
+
     def __init__(self, value):
         """
         >>> raise VdtValueError('jedi')
@@ -445,18 +445,18 @@
     """
     Validator is an object that allows you to register a set of 'checks'.
     These checks take input and test that it conforms to the check.
-    
+
     This can also involve converting the value from a string into
     the correct datatype.
-    
+
     The ``check`` method takes an input string which configures which
     check is to be used and applies that check to a supplied value.
-    
+
     An example input string would be:
     'int_range(param1, param2)'
-    
+
     You would then provide something like:
-    
+
     >>> def int_range_check(value, min, max):
     ...     # turn min and max from strings to integers
     ...     min = int(min)
@@ -479,7 +479,7 @@
     ...     if not value <= max:
     ...          raise VdtValueTooBigError(value)
     ...     return value
-    
+
     >>> fdict = {'int_range': int_range_check}
     >>> vtr1 = Validator(fdict)
     >>> vtr1.check('int_range(20, 40)', '30')
@@ -487,25 +487,25 @@
     >>> vtr1.check('int_range(20, 40)', '60')
     Traceback (most recent call last):
     VdtValueTooBigError: the value "60" is too big.
-    
+
     New functions can be added with : ::
-    
-    >>> vtr2 = Validator()       
+
+    >>> vtr2 = Validator()
     >>> vtr2.functions['int_range'] = int_range_check
-    
-    Or by passing in a dictionary of functions when Validator 
+
+    Or by passing in a dictionary of functions when Validator
     is instantiated.
-    
+
     Your functions *can* use keyword arguments,
     but the first argument should always be 'value'.
-    
+
     If the function doesn't take additional arguments,
     the parentheses are optional in the check.
     It can be written with either of : ::
-    
+
         keyword = function_name
         keyword = function_name()
-    
+
     The first program to utilise Validator() was Michael Foord's
     ConfigObj, an alternative to ConfigParser which supports lists and
     can validate a config file using a config schema.
@@ -565,35 +565,35 @@
     def check(self, check, value, missing=False):
         """
         Usage: check(check, value)
-        
+
         Arguments:
             check: string representing check to apply (including arguments)
             value: object to be checked
         Returns value, converted to correct type if necessary
-        
+
         If the check fails, raises a ``ValidateError`` subclass.
-        
+
         >>> vtor.check('yoda', '')
         Traceback (most recent call last):
         VdtUnknownCheckError: the check "yoda" is unknown.
         >>> vtor.check('yoda()', '')
         Traceback (most recent call last):
         VdtUnknownCheckError: the check "yoda" is unknown.
-        
+
         >>> vtor.check('string(default="")', '', missing=True)
         ''
         """
         fun_name, fun_args, fun_kwargs, default = self._parse_with_caching(check)
-            
+
         if missing:
             if default is None:
                 # no information needed here - to be handled by caller
                 raise VdtMissingValue()
             value = self._handle_none(default)
-        
+
         if value is None:
             return None
-        
+
         return self._check_value(value, fun_name, fun_args, fun_kwargs)
 
 
@@ -618,8 +618,8 @@
             fun_kwargs = dict([(str(key), value) for (key, value) in fun_kwargs.items()])
             self._cache[check] = fun_name, list(fun_args), dict(fun_kwargs), default
         return fun_name, fun_args, fun_kwargs, default
-        
-        
+
+
     def _check_value(self, value, fun_name, fun_args, fun_kwargs):
         try:
             fun = self.functions[fun_name]
@@ -657,7 +657,7 @@
                         val = self._unquote(val)
                     fun_kwargs[keymatch.group(1)] = val
                     continue
-                
+
                 fun_args.append(self._unquote(arg))
         else:
             # allows for function names without (args)
@@ -689,20 +689,20 @@
     def _pass(self, value):
         """
         Dummy check that always passes
-        
+
         >>> vtor.check('', 0)
         0
         >>> vtor.check('', '0')
         '0'
         """
         return value
-    
-    
+
+
     def get_default_value(self, check):
         """
         Given a check, return the default value for the check
         (converted to the right type).
-        
+
         If the check doesn't specify a default value then a
         ``KeyError`` will be raised.
         """
@@ -718,11 +718,11 @@
 def _is_num_param(names, values, to_float=False):
     """
     Return numbers from inputs or raise VdtParamError.
-    
+
     Lets ``None`` pass through.
     Pass in keyword argument ``to_float=True`` to
     use float for the conversion rather than int.
-    
+
     >>> _is_num_param(('', ''), (0, 1.0))
     [0, 1]
     >>> _is_num_param(('', ''), (0, 1.0), to_float=True)
@@ -757,10 +757,10 @@
     A check that tests that a given value is an integer (int, or long)
     and optionally, between bounds. A negative value is accepted, while
     a float will fail.
-    
+
     If the value is a string, then the conversion is done - if possible.
     Otherwise a VdtError is raised.
-    
+
     >>> vtor.check('integer', '-1')
     -1
     >>> vtor.check('integer', '0')
@@ -812,17 +812,17 @@
     """
     A check that tests that a given value is a float
     (an integer will be accepted), and optionally - that it is between bounds.
-    
+
     If the value is a string, then the conversion is done - if possible.
     Otherwise a VdtError is raised.
-    
+
     This can accept negative values.
-    
+
     >>> vtor.check('float', '2')
     2.0
-    
+
     From now on we multiply the value to avoid comparing decimals
-    
+
     >>> vtor.check('float', '-6.8') * 10
     -68.0
     >>> vtor.check('float', '12.2') * 10
@@ -861,7 +861,7 @@
 
 
 bool_dict = {
-    True: True, 'on': True, '1': True, 'true': True, 'yes': True, 
+    True: True, 'on': True, '1': True, 'true': True, 'yes': True,
     False: False, 'off': False, '0': False, 'false': False, 'no': False,
 }
 
@@ -869,7 +869,7 @@
 def is_boolean(value):
     """
     Check if the value represents a boolean.
-    
+
     >>> vtor.check('boolean', 0)
     0
     >>> vtor.check('boolean', False)
@@ -908,7 +908,7 @@
     >>> vtor.check('boolean', 'up')
     Traceback (most recent call last):
     VdtTypeError: the value "up" is of the wrong type.
-    
+
     """
     if isinstance(value, basestring):
         try:
@@ -930,7 +930,7 @@
     """
     Check that the supplied value is an Internet Protocol address, v.4,
     represented by a dotted-quad string, i.e. '1.2.3.4'.
-    
+
     >>> vtor.check('ip_addr', '1 ')
     '1'
     >>> vtor.check('ip_addr', ' 1.2')
@@ -966,11 +966,11 @@
 def is_list(value, min=None, max=None):
     """
     Check that the value is a list of values.
-    
+
     You can optionally specify the minimum and maximum number of members.
-    
+
     It does no check on list members.
-    
+
     >>> vtor.check('list', ())
     []
     >>> vtor.check('list', [])
@@ -1011,11 +1011,11 @@
 def is_tuple(value, min=None, max=None):
     """
     Check that the value is a tuple of values.
-    
+
     You can optionally specify the minimum and maximum number of members.
-    
+
     It does no check on members.
-    
+
     >>> vtor.check('tuple', ())
     ()
     >>> vtor.check('tuple', [])
@@ -1045,9 +1045,9 @@
 def is_string(value, min=None, max=None):
     """
     Check that the supplied value is a string.
-    
+
     You can optionally specify the minimum and maximum number of members.
-    
+
     >>> vtor.check('string', '0')
     '0'
     >>> vtor.check('string', 0)
@@ -1081,11 +1081,11 @@
 def is_int_list(value, min=None, max=None):
     """
     Check that the value is a list of integers.
-    
+
     You can optionally specify the minimum and maximum number of members.
-    
+
     Each list member is checked that it is an integer.
-    
+
     >>> vtor.check('int_list', ())
     []
     >>> vtor.check('int_list', [])
@@ -1104,11 +1104,11 @@
 def is_bool_list(value, min=None, max=None):
     """
     Check that the value is a list of booleans.
-    
+
     You can optionally specify the minimum and maximum number of members.
-    
+
     Each list member is checked that it is a boolean.
-    
+
     >>> vtor.check('bool_list', ())
     []
     >>> vtor.check('bool_list', [])
@@ -1129,11 +1129,11 @@
 def is_float_list(value, min=None, max=None):
     """
     Check that the value is a list of floats.
-    
+
     You can optionally specify the minimum and maximum number of members.
-    
+
     Each list member is checked that it is a float.
-    
+
     >>> vtor.check('float_list', ())
     []
     >>> vtor.check('float_list', [])
@@ -1152,11 +1152,11 @@
 def is_string_list(value, min=None, max=None):
     """
     Check that the value is a list of strings.
-    
+
     You can optionally specify the minimum and maximum number of members.
-    
+
     Each list member is checked that it is a string.
-    
+
     >>> vtor.check('string_list', ())
     []
     >>> vtor.check('string_list', [])
@@ -1178,11 +1178,11 @@
 def is_ip_addr_list(value, min=None, max=None):
     """
     Check that the value is a list of IP addresses.
-    
+
     You can optionally specify the minimum and maximum number of members.
-    
+
     Each list member is checked that it is an IP address.
-    
+
     >>> vtor.check('ip_addr_list', ())
     []
     >>> vtor.check('ip_addr_list', [])
@@ -1201,11 +1201,11 @@
     Check that a value is a list, coercing strings into
     a list with one member. Useful where users forget the
     trailing comma that turns a single value into a list.
-    
+
     You can optionally specify the minimum and maximum number of members.
     A minumum of greater than one will fail if the user only supplies a
     string.
-    
+
     >>> vtor.check('force_list', ())
     []
     >>> vtor.check('force_list', [])
@@ -1216,8 +1216,8 @@
     if not isinstance(value, (list, tuple)):
         value = [value]
     return is_list(value, min, max)
-    
-    
+
+
 
 fun_dict = {
     'integer': is_integer,
@@ -1233,20 +1233,20 @@
     Check that the value is a list.
     Allow specifying the type of each member.
     Work on lists of specific lengths.
-    
+
     You specify each member as a positional argument specifying type
-    
+
     Each type should be one of the following strings :
       'integer', 'float', 'ip_addr', 'string', 'boolean'
-    
+
     So you can specify a list of two strings, followed by
     two integers as :
-    
+
       mixed_list('string', 'string', 'integer', 'integer')
-    
+
     The length of the list must match the number of positional
     arguments you supply.
-    
+
     >>> mix_str = "mixed_list('integer', 'float', 'ip_addr', 'string', 'boolean')"
     >>> check_res = vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a', True))
     >>> check_res == [1, 2.0, '1.2.3.4', 'a', True]
@@ -1266,10 +1266,10 @@
     >>> vtor.check(mix_str, 0)
     Traceback (most recent call last):
     VdtTypeError: the value "0" is of the wrong type.
-    
+
     This test requires an elaborate setup, because of a change in error string
     output from the interpreter between Python 2.2 and 2.3 .
-    
+
     >>> res_seq = (
     ...     'passed an incorrect value "',
     ...     'yoda',
@@ -1299,7 +1299,7 @@
 def is_option(value, *options):
     """
     This check matches the value to any of a set of options.
-    
+
     >>> vtor.check('option("yoda", "jedi")', 'yoda')
     'yoda'
     >>> vtor.check('option("yoda", "jedi")', 'jed')
@@ -1319,7 +1319,7 @@
 def _test(value, *args, **keywargs):
     """
     A function that exists for test purposes.
-    
+
     >>> checks = [
     ...     '3, 6, min=1, max=3, test=list(a, b, c)',
     ...     '3',
@@ -1353,7 +1353,7 @@
     (3, ('3',), {'test': ['a', 'b', 'c'], 'max': '3'})
     (3, ('3',), {'test': ["'a'", 'b', 'x=(c)'], 'max': '3'})
     (3, (), {'test': 'x=fish(3)'})
-    
+
     >>> v = Validator()
     >>> v.check('integer(default=6)', '3')
     3
@@ -1371,7 +1371,7 @@
     KeyError: 'Check "pass" has no default value.'
     >>> v.get_default_value('pass(default=list(1, 2, 3, 4))')
     ['1', '2', '3', '4']
-    
+
     >>> v = Validator()
     >>> v.check("pass(default=None)", None, True)
     >>> v.check("pass(default='None')", None, True)
@@ -1380,18 +1380,18 @@
     'None'
     >>> v.check('pass(default=list(1, 2, 3, 4))', None, True)
     ['1', '2', '3', '4']
-    
+
     Bug test for unicode arguments
     >>> v = Validator()
     >>> v.check(u'string(min=4)', u'test')
     u'test'
-    
+
     >>> v = Validator()
     >>> v.get_default_value(u'string(min=4, default="1234")')
     u'1234'
     >>> v.check(u'string(min=4, default="1234")', u'test')
     u'test'
-    
+
     >>> v = Validator()
     >>> default = v.get_default_value('string(default=None)')
     >>> default == None
@@ -1402,7 +1402,7 @@
 
 def _test2():
     """
-    >>> 
+    >>>
     >>> v = Validator()
     >>> v.get_default_value('string(default="#ff00dd")')
     '#ff00dd'
@@ -1436,8 +1436,8 @@
     >>> vtor.check("string_list(default=list('\n'))", '', missing=True)
     ['\n']
     """
-    
-    
+
+
 if __name__ == '__main__':
     # run the code tests in doctest format
     import sys
diff --git a/TestON/lib/pox/core.py b/TestON/lib/pox/core.py
index 8b31e7a..dc8cab6 100644
--- a/TestON/lib/pox/core.py
+++ b/TestON/lib/pox/core.py
@@ -306,26 +306,26 @@
       log.warn("Warning: Registered '%s' multipled times" % (name,))
     self.components[name] = component
     self.raiseEventNoErrors(ComponentRegistered, name, component)
-    
+
   def listenToDependencies(self, sink, components):
     """
     If a component depends on having other components
-    registered with core before it can boot, it can use this method to 
+    registered with core before it can boot, it can use this method to
     check for registration, and listen to events on those dependencies.
-    
+
     Note that event handlers named with the _handle* pattern in the sink must
     include the name of the desired source as a prefix. For example, if topology is a
     dependency, a handler for topology's SwitchJoin event must be labeled:
        def _handle_topology_SwitchJoin(...)
-    
+
     sink - the component waiting on dependencies
     components - a list of dependent component names
-    
+
     Returns whether all of the desired components are registered.
     """
     if components == None or len(components) == 0:
       return True
-  
+
     got = set()
     for c in components:
       if self.hasComponent(c):
diff --git a/TestON/lib/updatedriver/fvtadd.py b/TestON/lib/updatedriver/fvtadd.py
index bba273e..93528bc 100644
--- a/TestON/lib/updatedriver/fvtadd.py
+++ b/TestON/lib/updatedriver/fvtadd.py
@@ -1,8 +1,8 @@
 class FVTADD :
     def __init__(self):
         self.default = ''
-    
-   
+
+
     def runTest(self,self) :
         return TemplateTest.runTest(self)
 
diff --git a/TestON/lib/updatedriver/fvtdriver.py b/TestON/lib/updatedriver/fvtdriver.py
index dc6c4c0..df2bd01 100644
--- a/TestON/lib/updatedriver/fvtdriver.py
+++ b/TestON/lib/updatedriver/fvtdriver.py
@@ -1,7 +1,7 @@
 class driver :
     def __init__(self):
         self.default = ''
- 
+
 
     def runTest(self,self) :
         return TemplateTest.runTest(self)
diff --git a/TestON/tests/CHOtest/CHOtest.py b/TestON/tests/CHOtest/CHOtest.py
index 994a710..140d089 100644
--- a/TestON/tests/CHOtest/CHOtest.py
+++ b/TestON/tests/CHOtest/CHOtest.py
@@ -116,7 +116,7 @@
                                      onpass="Test step PASS",
                                      onfail="Test step FAIL" )
             statusResult = ( statusResult and onos_status )
-        
+
         main.step( "Start ONOS CLI on all nodes" )
         cliResult = main.TRUE
         main.log.step(" Start ONOS cli using thread ")
@@ -135,7 +135,7 @@
             t.join()
             startCliResult = startCliResult and t.result
         time2 = time.time()
-        
+
         if not startCliResult:
                 main.log.info("ONOS CLI did not start up properly")
                 main.cleanup()
@@ -168,7 +168,7 @@
             "________________________________________________________________________" )
         main.case(
             "Assign and Balance all Mininet switches across controllers" )
-        
+
         main.step( "Stop any previous Mininet network topology" )
         cliResult = main.TRUE
         if main.newTopo == main.params['TOPO3']['topo']:
@@ -177,7 +177,7 @@
         main.step( "Start Mininet with Att topology" )
         main.newTopo = main.params['TOPO1']['topo']
         startStatus = main.Mininet1.startNet(topoFile = main.newTopo)
-        
+
         main.step( "Assign switches to controllers" )
         for i in range( 1, ( main.numMNswitches + 1 ) ):  # 1 to ( num of switches +1 )
             main.Mininet1.assignSwController(
@@ -202,7 +202,7 @@
 
         main.step( "Balance devices across controllers" )
         balanceResult = main.ONOScli1.balanceMasters()
-		# giving some breathing time for ONOS to complete re-balance
+        # giving some breathing time for ONOS to complete re-balance
         time.sleep( 5 )
 
         topology_output = main.ONOScli1.topology()
@@ -260,10 +260,10 @@
             main.log.report( "Controller assignment successfull" )
         else:
             main.log.report( "Controller assignment failed" )
-        
+
         main.step( "Balance devices across controllers" )
         balanceResult = main.ONOScli1.balanceMasters()
-		# giving some breathing time for ONOS to complete re-balance
+        # giving some breathing time for ONOS to complete re-balance
         time.sleep( 5 )
 
         case21Result = switch_mastership
@@ -273,7 +273,7 @@
             actual=case21Result,
             onpass="Starting new Chordal topology test PASS",
             onfail="Starting new Chordal topology test FAIL" )
-        
+
     def CASE22( self, main ):
         """
         This test script Loads a new Topology (Spine) on CHO setup and balances all switches
@@ -287,7 +287,7 @@
         main.numMNlinks = int ( main.params[ 'TOPO3' ][ 'numLinks' ] )
         main.numMNhosts = int ( main.params[ 'TOPO3' ][ 'numHosts' ] )
         main.pingTimeout = 600
-        
+
         main.log.report(
             "Load Spine and Leaf topology and Balance all Mininet switches across controllers" )
         main.log.report(
@@ -314,7 +314,7 @@
                 switch_mastership = switch_mastership and main.TRUE
             else:
                 switch_mastership = main.FALSE
-        
+
         if switch_mastership == main.TRUE:
             main.log.report( "Controller assignment successfull" )
         else:
@@ -347,7 +347,7 @@
         main.deviceLinks = []
         main.deviceActiveLinksCount = []
         main.devicePortsEnabledCount = []
-        
+
         main.log.report(
             "Collect and Store topology details from ONOS before running any Tests" )
         main.log.report(
@@ -410,7 +410,7 @@
 
             main.step( "Collect and store each Device active links Count" )
             time1 = time.time()
-            
+
             for i in xrange( 1,( main.numMNswitches + 1 ), int( main.numCtrls) ):
                 pool = []
                 for cli in main.CLIs:
@@ -434,13 +434,13 @@
             main.log.info("Time for counting all enabled links of the switches: %2f seconds" %(time2-time1))
 
         else:
-            main.log.info("Devices (expected): %s, Links (expected): %s" % 
+            main.log.info("Devices (expected): %s, Links (expected): %s" %
                     ( str( main.numMNswitches ), str( main.numMNlinks ) ) )
             main.log.info("Devices (actual): %s, Links (actual): %s" %
                     ( numOnosDevices , numOnosLinks ) )
             main.log.info("Topology does not match, exiting CHO test...")
             topoResult = main.FALSE
-            # It's better exit here from running the test            
+            # It's better exit here from running the test
             main.cleanup()
             main.exit()
 
@@ -481,7 +481,7 @@
         if appCheck != main.TRUE:
             main.log.warn( main.CLIs[0].apps() )
             main.log.warn( main.CLIs[0].appIDs() )
- 
+
         time.sleep( 10 )
 
         main.step( "Verify Pingall" )
@@ -501,7 +501,7 @@
             main.log.report( "Pingall Test in Reactive mode failed" )
 
         main.step( "Disable Reactive forwarding" )
-       
+
         main.log.info( "Uninstall reactive forwarding app" )
         appResults = appResults and main.CLIs[0].deactivateApp( "org.onosproject.fwd" )
         pool = []
@@ -561,7 +561,7 @@
         if appCheck != main.TRUE:
             main.log.warn( main.CLIs[0].apps() )
             main.log.warn( main.CLIs[0].appIDs() )
- 
+
         time.sleep( 10 )
 
         main.step( "Verify Pingall" )
@@ -581,7 +581,7 @@
             main.log.report( "Pingall Test in Reactive mode failed" )
 
         main.step( "Disable Reactive forwarding" )
-       
+
         main.log.info( "Uninstall reactive forwarding app" )
         appResults = appResults and main.CLIs[0].deactivateApp( "org.onosproject.fwd" )
         pool = []
@@ -641,7 +641,7 @@
         if appCheck != main.TRUE:
             main.log.warn( main.CLIs[0].apps() )
             main.log.warn( main.CLIs[0].appIDs() )
- 
+
         time.sleep( 10 )
 
         main.step( "Verify Pingall" )
@@ -661,7 +661,7 @@
             main.log.report( "Pingall Test in Reactive mode failed" )
 
         main.step( "Disable Reactive forwarding" )
-       
+
         main.log.info( "Uninstall reactive forwarding app" )
         appResults = appResults and main.CLIs[0].deactivateApp( "org.onosproject.fwd" )
         pool = []
@@ -694,7 +694,7 @@
         Compare current ONOS topology with reference data
         """
         import re
-        
+
         devicesDPIDTemp = []
         hostMACsTemp = []
         deviceLinksTemp = []
@@ -732,12 +732,12 @@
         time2 = time.time()
         main.log.info("Time for counting enabled ports of the switches: %2f seconds" %(time2-time1))
         main.log.info (
-            "Device Enabled ports EXPECTED: %s" % 
-	     str( main.devicePortsEnabledCount ) )
+            "Device Enabled ports EXPECTED: %s" %
+            str( main.devicePortsEnabledCount ) )
         main.log.info (
-            "Device Enabled ports ACTUAL: %s" % 
+            "Device Enabled ports ACTUAL: %s" %
             str( devicePortsEnabledCountTemp ) )
-        
+
         if ( cmp( main.devicePortsEnabledCount,
                   devicePortsEnabledCountTemp ) == 0 ):
             stepResult1 = main.TRUE
@@ -799,8 +799,8 @@
         main.case( "Install 300 host intents" )
         main.step( "Add host Intents" )
         intentResult = main.TRUE
-        hostCombos = list( itertools.combinations( main.hostMACs, 2 ) ) 
-        
+        hostCombos = list( itertools.combinations( main.hostMACs, 2 ) )
+
         intentIdList = []
         time1 = time.time()
         for i in xrange( 0, len( hostCombos ), int(main.numCtrls) ):
@@ -865,15 +865,15 @@
         main.log.report( "Add 600 host intents and verify pingall (Chordal Topo)" )
         main.log.report( "_______________________________________" )
         import itertools
-        
+
         main.case( "Install 600 host intents" )
         main.step( "Add host Intents" )
         intentResult = main.TRUE
-        hostCombos = list( itertools.combinations( main.hostMACs, 2 ) ) 
-        
+        hostCombos = list( itertools.combinations( main.hostMACs, 2 ) )
+
         intentIdList = []
         time1 = time.time()
-        
+
         for i in xrange( 0, len( hostCombos ), int(main.numCtrls) ):
             pool = []
             for cli in main.CLIs:
@@ -913,7 +913,7 @@
                                  onfail="PING ALL FAIL" )
 
         case14Result = ( intentResult and pingResult )
-        
+
         utilities.assert_equals(
             expect=main.TRUE,
             actual=case14Result,
@@ -927,11 +927,11 @@
         main.log.report( "Add 2278 host intents and verify pingall (Spine Topo)" )
         main.log.report( "_______________________________________" )
         import itertools
-        
+
         main.case( "Install 2278 host intents" )
         main.step( "Add host Intents" )
         intentResult = main.TRUE
-        hostCombos = list( itertools.combinations( main.hostMACs, 2 ) ) 
+        hostCombos = list( itertools.combinations( main.hostMACs, 2 ) )
         main.pingTimeout = 300
         intentIdList = []
         time1 = time.time()
@@ -974,7 +974,7 @@
                                  onfail="PING ALL FAIL" )
 
         case15Result = ( intentResult and pingResult )
-        
+
         utilities.assert_equals(
             expect=main.TRUE,
             actual=case15Result,
@@ -1282,9 +1282,9 @@
         Randomly bring some links down and verify ping all ( Host Intents-Chordal Topo)
         """
         import random
-        import itertools 
+        import itertools
         link_sleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
-        
+
         main.log.report( "Randomly bring some core links down and verify ping all (Host Intents-Chordal Topo)" )
         main.log.report( "___________________________________________________________________________" )
         main.case( "Host intents - Randomly bring some core links down and verify ping all" )
@@ -1296,7 +1296,7 @@
         main.randomLinks = random.sample(switchesLinksComb, 5 )
         print main.randomLinks
         main.step( "Cut links on random devices" )
-        
+
         for switch in main.randomLinks:
             main.Mininet1.link(
                 END1=switch[0],
@@ -1341,7 +1341,7 @@
         """
         import random
         link_sleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
-       
+
         main.log.report(
             "Bring the core links up that are down and verify ping all (Host Intents-Chordal Topo" )
         main.log.report(
@@ -1349,7 +1349,7 @@
         main.case(
             "Host intents - Bring the core links up that are down and verify ping all" )
         main.step( "Bring randomly cut links on devices up" )
-        
+
         for switch in main.randomLinks:
             main.Mininet1.link(
                 END1=switch[0],
@@ -1394,9 +1394,9 @@
         Randomly bring some links down and verify ping all ( Point Intents-Chordal Topo)
         """
         import random
-        import itertools 
+        import itertools
         link_sleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
-        
+
         main.log.report( "Randomly bring some core links down and verify ping all ( Point Intents-Chordal Topo)" )
         main.log.report( "___________________________________________________________________________" )
         main.case( "Point intents - Randomly bring some core links down and verify ping all" )
@@ -1408,7 +1408,7 @@
         main.randomLinks = random.sample(switchesLinksComb, 5 )
         print main.randomLinks
         main.step( "Cut links on random devices" )
-        
+
         for switch in main.randomLinks:
             main.Mininet1.link(
                 END1=switch[0],
@@ -1453,7 +1453,7 @@
         """
         import random
         link_sleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
-       
+
         main.log.report(
             "Bring the core links up that are down and verify ping all ( Point Intents-Chordal Topo" )
         main.log.report(
@@ -1461,7 +1461,7 @@
         main.case(
             "Point intents - Bring the core links up that are down and verify ping all" )
         main.step( "Bring randomly cut links on devices up" )
-        
+
         for switch in main.randomLinks:
             main.Mininet1.link(
                 END1=switch[0],
@@ -1518,10 +1518,10 @@
         link2End2bot = main.params[ 'SPINECORELINKS' ][ 'linkS10bot' ].split( ',' )
         link_sleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
         main.pingTimeout = 400
-        
+
         main.log.report( "Bring some core links down and verify ping all (Host Intents-Spine Topo)" )
         main.log.report( "___________________________________________________________________________" )
-        
+
         linkIndex = range(4)
         linkIndexS9 = random.sample(linkIndex,1)[0]
         linkIndex.remove(linkIndexS9)
@@ -1624,7 +1624,7 @@
         utilities.assert_equals( expect=main.TRUE, actual=caseResult84,
                                  onpass="Link Up Test PASS",
                                  onfail="Link Up Test FAIL" )
-    
+
     def CASE90( self ):
         """
         Install 600 point intents and verify ping all (Att Topology)
@@ -1636,8 +1636,8 @@
         main.case( "Install 600 point intents" )
         main.step( "Add point Intents" )
         intentResult = main.TRUE
-        deviceCombos = list( itertools.permutations( main.deviceDPIDs, 2 ) ) 
-        
+        deviceCombos = list( itertools.permutations( main.deviceDPIDs, 2 ) )
+
         intentIdList = []
         time1 = time.time()
         for i in xrange( 0, len( deviceCombos ), int(main.numCtrls) ):
@@ -1680,7 +1680,7 @@
                                  onfail="PING ALL FAIL" )
 
         case90Result = ( intentResult and pingResult )
-        
+
         utilities.assert_equals(
             expect=main.TRUE,
             actual=case90Result,
@@ -1698,8 +1698,8 @@
         main.case( "Install 600 point intents" )
         main.step( "Add point Intents" )
         intentResult = main.TRUE
-        deviceCombos = list( itertools.permutations( main.deviceDPIDs, 2 ) ) 
-        
+        deviceCombos = list( itertools.permutations( main.deviceDPIDs, 2 ) )
+
         intentIdList = []
         time1 = time.time()
         for i in xrange( 0, len( deviceCombos ), int(main.numCtrls) ):
@@ -1743,13 +1743,13 @@
                                  onfail="PING ALL FAIL" )
 
         case91Result = ( intentResult and pingResult )
-        
+
         utilities.assert_equals(
             expect=main.TRUE,
             actual=case91Result,
             onpass="Install 600 point Intents and Ping All test PASS",
             onfail="Install 600 point Intents and Ping All test FAIL" )
-    
+
     def CASE92( self ):
         """
         Install 4556 point intents and verify ping all (Spine Topology)
@@ -1809,13 +1809,13 @@
                                  onfail="PING ALL FAIL" )
 
         case92Result = ( intentResult and pingResult )
-        
+
         utilities.assert_equals(
             expect=main.TRUE,
             actual=case92Result,
             onpass="Install 4556 point Intents and Ping All test PASS",
             onfail="Install 4556 point Intents and Ping All test FAIL" )
-     
+
     def CASE93( self ):
         """
         Install multi-single point intents and verify Ping all works
@@ -1866,7 +1866,7 @@
         checkIntentStateResult = main.ONOScli3.checkIntentState( intentsId = intentIdList ) and checkIntentStateResult
         checkIntentStateResult = main.ONOScli4.checkIntentState( intentsId = intentIdList ) and checkIntentStateResult
         checkIntentStateResult = main.ONOScli5.checkIntentState( intentsId = intentIdList ) and checkIntentStateResult
-        
+
         if checkIntentStateResult:
             main.log.info( "All intents are installed correctly " )
 
@@ -1890,7 +1890,7 @@
             actual=case93Result,
             onpass="Install 25 multi to single point Intents and Ping All test PASS",
             onfail="Install 25 multi to single point Intents and Ping All test FAIL" )
-        
+
     def CASE94( self ):
         """
         Install multi-single point intents and verify Ping all works
@@ -1927,7 +1927,7 @@
                 thread.join()
                 intentIdList.append(thread.result)
         time2 = time.time()
-        main.log.info("Time for adding point intents: %2f seconds" %(time2-time1)) 
+        main.log.info("Time for adding point intents: %2f seconds" %(time2-time1))
         time.sleep(5)
         main.step( "Verify Ping across all hosts" )
         pingResult = main.FALSE
@@ -1946,7 +1946,7 @@
             actual=case94Result,
             onpass="Install 25 multi to single point Intents and Ping All test PASS",
             onfail="Install 25 multi to single point Intents and Ping All test FAIL" )
-    
+
     #def CASE95 multi-single point intent for Spine
 
     def CASE96( self ):
@@ -1984,7 +1984,7 @@
                 thread.join()
                 intentIdList.append(thread.result)
         time2 = time.time()
-        main.log.info("Time for adding point intents: %2f seconds" %(time2-time1)) 
+        main.log.info("Time for adding point intents: %2f seconds" %(time2-time1))
         time.sleep(5)
         main.step( "Verify Ping across all hosts" )
         pingResult = main.FALSE
@@ -2039,7 +2039,7 @@
                 thread.join()
                 intentIdList.append(thread.result)
         time2 = time.time()
-        main.log.info("Time for adding point intents: %2f seconds" %(time2-time1)) 
+        main.log.info("Time for adding point intents: %2f seconds" %(time2-time1))
         time.sleep(5)
         main.step( "Verify Ping across all hosts" )
         pingResult = main.FALSE
@@ -2101,7 +2101,7 @@
                 thread.join()
                 intentIdList.append(thread.result)
         time2 = time.time()
-        main.log.info("Time for adding point intents: %2f seconds" %(time2-time1)) 
+        main.log.info("Time for adding point intents: %2f seconds" %(time2-time1))
         time.sleep(5)
         main.step( "Verify Ping across all hosts" )
         pingResult = main.FALSE
@@ -2246,13 +2246,13 @@
             pool.append(t)
             t.start()
             threadID = threadID + 1
-            
+
         results = []
         for thread in pool:
             thread.join()
             results.append(thread.result)
         time2 = time.time()
-        
+
         if( all(result == main.TRUE for result in results) == False):
                 main.log.info("Did not install onos-app-ifwd feature properly")
                 #main.cleanup()
@@ -2261,7 +2261,7 @@
             main.log.info("Successful feature:install onos-app-ifwd")
             installResult = main.TRUE
         main.log.info("Time for feature:install onos-app-ifwd: %2f seconds" %(time2-time1))
-        
+
         main.step( "Verify Pingall" )
         ping_result = main.FALSE
         time1 = time.time()
@@ -2272,7 +2272,7 @@
             "Time taken for Ping All: " +
             str( timeDiff ) +
             " seconds" )
-        
+
         if ping_result == main.TRUE:
             main.log.report( "Pingall Test in Reactive mode successful" )
         else:
@@ -2280,7 +2280,7 @@
 
         main.step( "Disable Intent based Reactive forwarding" )
         uninstallResult = main.FALSE
-        
+
         pool = []
         time1 = time.time()
         for cli,feature in main.CLIs:
@@ -2289,13 +2289,13 @@
             pool.append(t)
             t.start()
             threadID = threadID + 1
-            
+
         results = []
         for thread in pool:
             thread.join()
             results.append(thread.result)
         time2 = time.time()
-        
+
         if( all(result == main.TRUE for result in results) == False):
                 main.log.info("Did not uninstall onos-app-ifwd feature properly")
                 uninstallResult = main.FALSE
diff --git a/TestON/tests/FUNCintent/Dependency/newFuncTopo.py b/TestON/tests/FUNCintent/Dependency/newFuncTopo.py
index 5552aa9..5edf7f7 100755
--- a/TestON/tests/FUNCintent/Dependency/newFuncTopo.py
+++ b/TestON/tests/FUNCintent/Dependency/newFuncTopo.py
@@ -16,121 +16,121 @@
 
 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'] ) )
-		newName = '%s.%d' % ( intf, vlan )
-		intf.name = newName
-		self.nameToIntf[ newName ] = intf
-		return r
+        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'] ) )
+        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()
-		self.cmd( 'ifconfig %s inet 0' % intf )
-		self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
-		return r
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        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
+        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' )
+    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' )
 
-		# 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' )
+        # 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' )
 
-		# 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' )
+        # 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' )
 
-		s1 = self.addSwitch( 's1' )
-		s2 = self.addSwitch( 's2' )
-		s3 = self.addSwitch( 's3' )
-		s4 = self.addSwitch( 's4' )
-		s5 = self.addSwitch( 's5' )
-		s6 = self.addSwitch( 's6' )
-		s7 = self.addSwitch( 's7' )
+        s1 = self.addSwitch( 's1' )
+        s2 = self.addSwitch( 's2' )
+        s3 = self.addSwitch( 's3' )
+        s4 = self.addSwitch( 's4' )
+        s5 = self.addSwitch( 's5' )
+        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)
-		topos = { 'mytopo': ( lambda: MyTopo() ) }
+        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
 
diff --git a/TestON/tests/HAclusterRestart/dependencies/obelisk.py b/TestON/tests/HAclusterRestart/dependencies/obelisk.py
index fb6ccdb..4378a9b 100755
--- a/TestON/tests/HAclusterRestart/dependencies/obelisk.py
+++ b/TestON/tests/HAclusterRestart/dependencies/obelisk.py
@@ -9,9 +9,9 @@
         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))	
+        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')
diff --git a/TestON/tests/HAminorityRestart/dependencies/obelisk.py b/TestON/tests/HAminorityRestart/dependencies/obelisk.py
index fb6ccdb..4378a9b 100755
--- a/TestON/tests/HAminorityRestart/dependencies/obelisk.py
+++ b/TestON/tests/HAminorityRestart/dependencies/obelisk.py
@@ -9,9 +9,9 @@
         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))	
+        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')
diff --git a/TestON/tests/HAsanity/dependencies/obelisk.py b/TestON/tests/HAsanity/dependencies/obelisk.py
index fb6ccdb..4378a9b 100755
--- a/TestON/tests/HAsanity/dependencies/obelisk.py
+++ b/TestON/tests/HAsanity/dependencies/obelisk.py
@@ -9,9 +9,9 @@
         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))	
+        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')
diff --git a/TestON/tests/HAsingleInstanceRestart/dependencies/obelisk.py b/TestON/tests/HAsingleInstanceRestart/dependencies/obelisk.py
index fb6ccdb..4378a9b 100755
--- a/TestON/tests/HAsingleInstanceRestart/dependencies/obelisk.py
+++ b/TestON/tests/HAsingleInstanceRestart/dependencies/obelisk.py
@@ -9,9 +9,9 @@
         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))	
+        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')
diff --git a/TestON/tests/SAMPscaleTopo/Dependency/newFuncTopo.py b/TestON/tests/SAMPscaleTopo/Dependency/newFuncTopo.py
index 5552aa9..5edf7f7 100755
--- a/TestON/tests/SAMPscaleTopo/Dependency/newFuncTopo.py
+++ b/TestON/tests/SAMPscaleTopo/Dependency/newFuncTopo.py
@@ -16,121 +16,121 @@
 
 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'] ) )
-		newName = '%s.%d' % ( intf, vlan )
-		intf.name = newName
-		self.nameToIntf[ newName ] = intf
-		return r
+        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'] ) )
+        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()
-		self.cmd( 'ifconfig %s inet 0' % intf )
-		self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
-		return r
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        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
+        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' )
+    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' )
 
-		# 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' )
+        # 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' )
 
-		# 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' )
+        # 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' )
 
-		s1 = self.addSwitch( 's1' )
-		s2 = self.addSwitch( 's2' )
-		s3 = self.addSwitch( 's3' )
-		s4 = self.addSwitch( 's4' )
-		s5 = self.addSwitch( 's5' )
-		s6 = self.addSwitch( 's6' )
-		s7 = self.addSwitch( 's7' )
+        s1 = self.addSwitch( 's1' )
+        s2 = self.addSwitch( 's2' )
+        s3 = self.addSwitch( 's3' )
+        s4 = self.addSwitch( 's4' )
+        s5 = self.addSwitch( 's5' )
+        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)
-		topos = { 'mytopo': ( lambda: MyTopo() ) }
+        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
 
diff --git a/TestON/tests/SAMPstartTemplate/Dependency/newFuncTopo.py b/TestON/tests/SAMPstartTemplate/Dependency/newFuncTopo.py
index 57ad42f..7fe68c1 100755
--- a/TestON/tests/SAMPstartTemplate/Dependency/newFuncTopo.py
+++ b/TestON/tests/SAMPstartTemplate/Dependency/newFuncTopo.py
@@ -16,125 +16,125 @@
 
 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'] ) )
-		newName = '%s.%d' % ( intf, vlan )
-		intf.name = newName
-		self.nameToIntf[ newName ] = intf
-		return r
+        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'] ) )
+        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()
-		self.cmd( 'ifconfig %s inet 0' % intf )
-		self.cmd( 'ip -6 addr add %s dev %s' % ( v6Addr, intf ) )
-		return r
+        r = super( Host, self ).config( **params )
+        intf = self.defaultIntf()
+        self.cmd( 'ifconfig %s inet 0' % intf )
+        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
+        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' )
+    def __init__( self ):
+        # Initialize topology
+        Topo.__init__( self )
 
-		# 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' )
+        # 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' )
 
-		# 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' )
+        # 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' )
 
-		s1 = self.addSwitch( 's1' )
-		s2 = self.addSwitch( 's2' )
-		s3 = self.addSwitch( 's3' )
-		s4 = self.addSwitch( 's4' )
-		s5 = self.addSwitch( 's5' )
-		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)
+        # 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' )
 
-		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)
+        s1 = self.addSwitch( 's1' )
+        s2 = self.addSwitch( 's2' )
+        s3 = self.addSwitch( 's3' )
+        s4 = self.addSwitch( 's4' )
+        s5 = self.addSwitch( 's5' )
+        s6 = self.addSwitch( 's6' )
+        s7 = self.addSwitch( 's7' )
 
-		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(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(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(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(s3,s4)
-		self.addLink(s3,s6)
-		
-		self.addLink(s4,s7)
-		topos = { 'mytopo': ( lambda: MyTopo() ) }
+        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)
+        topos = { 'mytopo': ( lambda: MyTopo() ) }
 
 # HERE THE CODE DEFINITION OF THE TOPOLOGY ENDS
 
diff --git a/TestON/tests/SCPFcbench/SCPFcbench.py b/TestON/tests/SCPFcbench/SCPFcbench.py
index fd15862..647bf52 100644
--- a/TestON/tests/SCPFcbench/SCPFcbench.py
+++ b/TestON/tests/SCPFcbench/SCPFcbench.py
@@ -14,19 +14,19 @@
     def __init__( self ):
         self.default = ''
 
-    def CASE1( self, main ):           
-                                        
-        import time 
-        import os                    
-        global init       
+    def CASE1( self, main ):
+
+        import time
+        import os
+        global init
         main.case("pre-condition for cbench test.")
 
-        try: 
-            if type(init) is not bool: 
-                init = False  
-        except NameError: 
-            init = False 
-       
+        try:
+            if type(init) is not bool:
+                init = False
+        except NameError:
+            init = False
+
         #Load values from params file
         checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
         gitPull = main.params[ 'GIT' ][ 'autopull' ]
@@ -36,25 +36,25 @@
         MN1Ip = os.environ[ main.params[ 'MN' ][ 'ip1' ] ]
         maxNodes = int(main.params[ 'availableNodes' ])
         skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
-        cellName = main.params[ 'ENV' ][ 'cellName' ]        
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
 
-        # -- INIT SECTION, ONLY RUNS ONCE -- # 
-        if init == False: 
+        # -- INIT SECTION, ONLY RUNS ONCE -- #
+        if init == False:
             init = True
             global clusterCount             #number of nodes running
             global ONOSIp                   #list of ONOS IP addresses
-            global scale 
-            
+            global scale
+
             clusterCount = 0
             ONOSIp = [ 0 ]
-            scale = (main.params[ 'SCALE' ]).split(",")            
+            scale = (main.params[ 'SCALE' ]).split(",")
             clusterCount = int(scale[0])
 
-            #Populate ONOSIp with ips from params 
-            for i in range(1, maxNodes + 1): 
+            #Populate ONOSIp with ips from params
+            for i in range(1, maxNodes + 1):
                 ipString = os.environ[main.params['CTRL']['ip1']]
-                ONOSIp.append(ipString)   
-            
+                ONOSIp.append(ipString)
+
             #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
             if skipMvn != "yes":
                 mvnResult = main.ONOSbench.cleanInstall()
@@ -69,46 +69,46 @@
                 checkoutResult = main.TRUE
                 pullResult = main.TRUE
                 main.log.info( "Skipped git checkout and pull" )
-        
+
         # -- END OF INIT SECTION --#
-         
+
         clusterCount = int(scale[0])
-        scale.remove(scale[0])       
-        
-        #kill off all onos processes 
+        scale.remove(scale[0])
+
+        #kill off all onos processes
         main.log.step("Safety check, killing all ONOS processes")
         main.log.step("before initiating enviornment setup")
         for node in range(1, maxNodes + 1):
             main.ONOSbench.onosDie(ONOSIp[node])
-        
+
         #Uninstall everywhere
         main.log.step( "Cleaning Enviornment..." )
         for i in range(1, maxNodes + 1):
             main.log.info(" Uninstalling ONOS " + str(i) )
             main.ONOSbench.onosUninstall( ONOSIp[i] )
-     
+
         time.sleep(10)
         main.ONOSbench.handle.sendline(" ")
         main.ONOSbench.handle.expect(":~")
-        print "pexpect: \n" + main.ONOSbench.handle.before 
+        print "pexpect: \n" + main.ONOSbench.handle.before
 
 
         print "Cellname is: "+ cellName + "ONOS IP is: " + str(ONOSIp)
         main.ONOSbench.createCellFile(BENCHIp,cellName,MN1Ip,"drivers,openflow,fwd",[ONOSIp[1]])
- 
+
         main.step( "Set Cell" )
         main.ONOSbench.setCell(cellName)
 
-        #main.ONOSbench.handle.sendline(" ") 
-        #main.ONOSbench.handle.expect(":~") 
-        #print "pexpect: \n" + main.ONOSbench.handle.before 
+        #main.ONOSbench.handle.sendline(" ")
+        #main.ONOSbench.handle.expect(":~")
+        #print "pexpect: \n" + main.ONOSbench.handle.before
 
         main.step( "Creating ONOS package" )
-        packageResult = main.ONOSbench.onosPackage()  
+        packageResult = main.ONOSbench.onosPackage()
 
         main.step( "verify cells" )
         verifyCellResult = main.ONOSbench.verifyCell()
-      
+
         main.log.report( "Initializing " + str( clusterCount ) + " node cluster." )
         for node in range(1, clusterCount + 1):
             main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
@@ -124,53 +124,53 @@
                 main.log.report( "ONOS " + str(node) + " didn't start!" )
         main.log.info("Startup sequence complete")
 
-        for i in range(5): 
+        for i in range(5):
             main.ONOSbench.onosCfgSet(ONOSIp[1], "org.onosproject.fwd.ReactiveForwarding","packetOutOnly true")
             time.sleep(5)
-            main.ONOSbench.handle.sendline("onos $OC1 cfg get|grep packetOutOnly") 
-            main.ONOSbench.handle.expect(":~") 
+            main.ONOSbench.handle.sendline("onos $OC1 cfg get|grep packetOutOnly")
+            main.ONOSbench.handle.expect(":~")
             check = main.ONOSbench.handle.before
             if "value=true" in check:
-                main.log.info("cfg set successful") 
+                main.log.info("cfg set successful")
                 stepResult = main.TRUE
-                break 
-            if i == 4: 
+                break
+            if i == 4:
                 main.log.info("Cfg set failed")
                 stepResult = main.FALSE
-            else: 
+            else:
                 time.sleep(5)
 
-        utilities.assert_equals( expect=main.TRUE, 
-                                 actual=stepResult, 
-                                 onpass="Successfully configure onos for cbench test ", 
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 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")
         validFlag = False
         mode = main.params[ 'TEST' ][ 'mode' ]
         if mode != "t":
-            mode = " " 
+            mode = " "
 
         runCbench = ( "ssh " + CBENCHuser + "@" + ONOSIp[1] + " cbench -c localhost -p 6633 -m 1000 -l 25 -s 16 -M 100000 -w 15 -D 10000 -" + mode )
         main.ONOSbench.handle.sendline(runCbench)
         time.sleep(30)
-        main.ONOSbench.handle.expect(":~") 
+        main.ONOSbench.handle.expect(":~")
         output = main.ONOSbench.handle.before
         main.log.info(output)
 
         output = output.splitlines()
-        for line in output: 
+        for line in output:
             if "RESULT: " in line:
                 validFlag = True
                 print line
-                resultLine = line.split(" ") 
+                resultLine = line.split(" ")
                 for word in resultLine:
-                    if word == "min/max/avg/stdev": 
+                    if word == "min/max/avg/stdev":
                         resultsIndex = resultLine.index(word)
                         print resultsIndex
                         break
@@ -180,27 +180,27 @@
                 finalDataList = finalDataString.split("/")
                 avg = finalDataList[2]
                 stdev = finalDataList[3]
-                                                     
-                main.log.info("Average: \t\t\t" + avg) 
-                main.log.info("Standard Deviation: \t" + stdev) 
-            
+
+                main.log.info("Average: \t\t\t" + avg)
+                main.log.info("Standard Deviation: \t" + stdev)
+
 
                 commit = main.ONOSbench.getVersion()
                 commit = (commit.split(" "))[1]
 
                 try:
                     dbFileName="/tmp/CbenchDB"
-                    dbfile = open(dbFileName, "w+") 
-                    temp = "'" + commit + "'," 
-                    temp += "'" + mode + "'," 
+                    dbfile = open(dbFileName, "w+")
+                    temp = "'" + commit + "',"
+                    temp += "'" + mode + "',"
                     temp += "'" + avg + "',"
-                    temp += "'" + stdev + "'\n" 
+                    temp += "'" + stdev + "'\n"
                     dbfile.write(temp)
                     dbfile.close()
-                    main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], outputMode="d") 
+                    main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], outputMode="d")
                 except IOError:
                     main.log.warn("Error opening " + dbFileName + " to write results.")
-                
+
                 stepResult = main.TRUE
                 break
         if ( validFlag == False ):
diff --git a/TestON/tests/SCPFflowTp1g/SCPFflowTp1g.py b/TestON/tests/SCPFflowTp1g/SCPFflowTp1g.py
index a82acf4..525fe74 100644
--- a/TestON/tests/SCPFflowTp1g/SCPFflowTp1g.py
+++ b/TestON/tests/SCPFflowTp1g/SCPFflowTp1g.py
@@ -13,7 +13,7 @@
     def __init__( self ):
         self.default = ''
 
-    def CASE1( self, main ):          
+    def CASE1( self, main ):
 
         import time
         global init
@@ -32,8 +32,8 @@
         BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
         main.maxNodes = int(main.params[ 'max' ])
         skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
-        cellName = main.params[ 'ENV' ][ 'cellName' ]       
-    
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+
         main.log.info("==========DEBUG VERSION 3===========")
 
         # -- INIT SECTION, ONLY RUNS ONCE -- #
@@ -71,7 +71,7 @@
                 checkoutResult = main.TRUE
                 pullResult = main.TRUE
                 main.log.info( "Skipped git checkout and pull" )
-            
+
             commit = main.ONOSbench.getVersion()
             commit = (commit.split(" "))[1]
 
@@ -84,7 +84,7 @@
         scale.remove(scale[0])
         main.log.info("CLUSTER COUNT: " + str(clusterCount))
 
-        #kill off all onos processes 
+        #kill off all onos processes
         main.log.step("Safety check, killing all ONOS processes")
         main.log.step("before initiating enviornment setup")
         for node in range(1, main.maxNodes + 1):
@@ -100,16 +100,16 @@
         main.log.info("Creating cell file")
         cellIp = []
         for node in range (1, clusterCount + 1):
-            cellIp.append(ONOSIp[node])        
-        
+            cellIp.append(ONOSIp[node])
+
         main.ONOSbench.createCellFile(BENCHIp,cellName,"localhost",str(Apps), cellIp)
         main.log.info("Cell Ip list: " + str(cellIp))
-        
+
         main.step( "Set Cell" )
-        main.ONOSbench.setCell(cellName)       
- 
+        main.ONOSbench.setCell(cellName)
+
         main.step( "Creating ONOS package" )
-        packageResult = main.ONOSbench.onosPackage()  
+        packageResult = main.ONOSbench.onosPackage()
 
         main.step( "verify cells" )
         verifyCellResult = main.ONOSbench.verifyCell()
@@ -127,21 +127,21 @@
                     break
             if not isup:
                 main.log.report( "ONOS " + str(node) + " didn't start!" )
-        
+
         for node in range(1, clusterCount + 1):
             exec "a = main.ONOS%scli.startOnosCli" %str(node)
             a(ONOSIp[node])
-         
+
         main.log.info("Startup sequence complete")
-        main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], outputMode="d") 
+        main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], outputMode="d")
     def CASE2( self, main ):
         #
-        # This is the flow TP test 
+        # This is the flow TP test
         #
-        import os.path  
-        import numpy       
+        import os.path
+        import numpy
         import math
-        import time 
+        import time
         import datetime
         import traceback
 
@@ -173,9 +173,9 @@
         flowRuleBackup = str(main.params[ 'TEST' ][ 'enableFlowRuleStoreBackup' ])
         main.log.info("Flow Rule Backup is set to:" + flowRuleBackup)
 
-        servers = str(clusterCount) 
-        
-        if clusterCount == 1: 
+        servers = str(clusterCount)
+
+        if clusterCount == 1:
             neighborList = ['0']
             currentNeighbors = "r"
         else:
@@ -183,7 +183,7 @@
                 neighborList = [str(clusterCount-1)]
                 currentNeighbors = "r"
             else:
-                neighborList = ['0'] 
+                neighborList = ['0']
 
         main.log.info("neightborlist: " + str(neighborList))
 
@@ -192,32 +192,32 @@
 
         for n in neighborList:
             main.log.step("\tSTARTING TEST")
-            main.log.step("\tLOADING FROM SERVERS:  \t" + str(clusterCount) ) 
-            main.log.step("\tNEIGHBORS:\t" + n )  
+            main.log.step("\tLOADING FROM SERVERS:  \t" + str(clusterCount) )
+            main.log.step("\tNEIGHBORS:\t" + n )
             main.log.info("=============================================================")
             main.log.info("=============================================================")
             #write file to configure nil link
             ipCSV = ""
             for i in range (1, int(main.maxNodes) + 1):
                 tempstr = "ip" + str(i)
-                ipCSV += main.params[ 'CTRL' ][ tempstr ] 
+                ipCSV += main.params[ 'CTRL' ][ tempstr ]
                 if i < int(main.maxNodes):
                     ipCSV +=","
-            
+
             for i in range(3):
                 main.ONOSbench.onosCfgSet(ONOSIp[1], "org.onosproject.provider.nil.NullProviders", "deviceCount 35")
                 main.ONOSbench.onosCfgSet(ONOSIp[1], "org.onosproject.provider.nil.NullProviders", "topoShape linear")
-                main.ONOSbench.onosCfgSet(ONOSIp[1], "org.onosproject.provider.nil.NullProviders", "enabled true") 
+                main.ONOSbench.onosCfgSet(ONOSIp[1], "org.onosproject.provider.nil.NullProviders", "enabled true")
 
                 time.sleep(5)
                 main.ONOSbench.handle.sendline("onos $OC1 summary")
                 main.ONOSbench.handle.expect(":~")
                 check = main.ONOSbench.handle.before
-                main.log.info("\nStart up check: \n" + check + "\n") 
-                if "SCC(s)=1," in check: 
-                    break 
+                main.log.info("\nStart up check: \n" + check + "\n")
+                if "SCC(s)=1," in check:
+                    break
                 time.sleep(5)
-                
+
             #devide flows
             flows = int(main.params[ 'TEST' ][ 'flows' ])
             main.log.info("Flow Target  = " + str(flows))
@@ -230,99 +230,99 @@
             serverEnvVars = ""
             for i in range (1,int(servers)+1):
                 serverEnvVars += ("-s " + ONOSIp[i] + " ")
-            
+
             data = [[""]*int(servers)]*int(sampleSize)
             maxes = [""]*int(sampleSize)
 
             flowCMD = "python3 " + homeDir + "/onos/tools/test/bin/"
             flowCMD += testCMD[0] + " " + str(flows) + " " + testCMD[1]
-            flowCMD += " " + str(n) + " " + str(serverEnvVars) + "-j" 
+            flowCMD += " " + str(n) + " " + str(serverEnvVars) + "-j"
 
             main.log.info(flowCMD)
             #time.sleep(60)
-            
-            for test in range(0, warmUp + sampleSize): 
-                if test < warmUp: 
+
+            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) + " ======") 
+                else:
+                     main.log.info("====== Test run: " + str(test-warmUp+1) + " ======")
 
                 main.ONOSbench.handle.sendline(flowCMD)
                 main.ONOSbench.handle.expect(":~")
                 rawResult = main.ONOSbench.handle.before
                 main.log.info("Raw results: \n" + rawResult + "\n")
 
-                if "failed" in rawResult: 
+                if "failed" in rawResult:
                     main.log.report("FLOW_TESTER.PY FAILURE")
                     main.log.report( " \n" + rawResult + " \n")
                     for i in range(clusterCount):
                         main.log.report("=======================================================")
-                        main.log.report(" ONOS " + str(i) + "LOG REPORT") 
+                        main.log.report(" ONOS " + str(i) + "LOG REPORT")
                         main.ONOSbench.logReport(ONOSIp[i], ["ERROR", "WARNING", "EXCEPT"], outputMode="d")
-                    main.ONOSbench.handle.sendline("onos $OC1 flows") 
-                    main.ONOSbench.handle.expect(":~") 
+                    main.ONOSbench.handle.sendline("onos $OC1 flows")
+                    main.ONOSbench.handle.expect(":~")
                     main.log.info(main.ONOSbench.handle.before)
 
                     break
-            
+
             ########################################################################################
                 result = [""]*(clusterCount)
-        
+
                 #print("rawResult: " + rawResult)
 
                 rawResult = rawResult.splitlines()
 
-                for node in range(1, clusterCount + 1):        
+                for node in range(1, clusterCount + 1):
                     for line in rawResult:
-                        #print("line: " + line) 
+                        #print("line: " + line)
                         if ONOSIp[node] in line and "server" in line:
-                            temp = line.split(" ") 
+                            temp = line.split(" ")
                             for word in temp:
-                                #print ("word: " + word) 
-                                if "elapsed" in repr(word): 
+                                #print ("word: " + word)
+                                if "elapsed" in repr(word):
                                     index = temp.index(word) + 1
                                     myParsed = (temp[index]).replace(",","")
                                     myParsed = myParsed.replace("}","")
                                     myParsed = int(myParsed)
                                     result[node-1] = myParsed
                                     main.log.info( ONOSIp[node] + " : " + str(myParsed))
-                                    break 
+                                    break
 
                 if test >= warmUp:
-                    for i in result: 
-                        if i == "": 
+                    for i in result:
+                        if i == "":
                             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)")                
+                    main.log.info("Throughput time: " + str(maxes[test-warmUp]) + "(ms)")
 
                     data[test-warmUp] = result
 
-                # wait for flows = 0 
-                for checkCount in range(0,5): 
+                # wait for flows = 0
+                for checkCount in range(0,5):
                     time.sleep(10)
                     main.ONOSbench.handle.sendline("onos $OC1 summary")
                     main.ONOSbench.handle.expect(":~")
                     flowCheck = main.ONOSbench.handle.before
-                    if "flows=0," in flowCheck: 
+                    if "flows=0," in flowCheck:
                         main.log.info("Flows removed")
                         break
-                    else: 
-                        for line in flowCheck.splitlines(): 
-                            if "flows=" in line: 
-                                main.log.info("Current Summary: " + line) 
-                    if checkCount == 2: 
+                    else:
+                        for line in flowCheck.splitlines():
+                            if "flows=" in line:
+                                main.log.info("Current Summary: " + line)
+                    if checkCount == 2:
                         main.log.info("Flows are stuck, moving on ")
 
 
                 time.sleep(5)
-                
+
             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)")
@@ -330,16 +330,16 @@
 
             nodeString = ""
             for i in range(1, int(servers) + 1):
-                nodeString += ("\tNode " + str(i)) 
-             
+                nodeString += ("\tNode " + str(i))
+
             for test in range(0, sampleSize ):
                 main.log.info("\t Test iteration " + str(test + 1) )
                 main.log.info("\t------------------")
-                main.log.info(nodeString)       
+                main.log.info(nodeString)
                 resultString = ""
 
                 for i in range(0, int(servers) ):
-                    resultString += ("\t" + str(data[test][i]) ) 
+                    resultString += ("\t" + str(data[test][i]) )
                 main.log.info(resultString)
 
                 print("\n")
@@ -348,19 +348,19 @@
             main.log.info("Average of max value from each test iteration: " + str(avgOfMaxes))
 
             stdOfMaxes = numpy.std(maxes)
-            main.log.info("Standard Deviation of max values: " + str(stdOfMaxes))       
+            main.log.info("Standard Deviation of max values: " + str(stdOfMaxes))
             print("\n\n")
 
             avgTP = int(main.params[ 'TEST' ][ 'flows' ])  / avgOfMaxes #result in kflows/second
-            
+
             tp = []
-            for i in maxes: 
+            for i in maxes:
                 tp.append((int(main.params[ 'TEST' ][ 'flows' ]) / i ))
 
             stdTP = numpy.std(tp)
 
             main.log.info("Average thoughput:  " + str(avgTP) + " Kflows/second" )
-            main.log.info("Standard deviation of throughput: " + str(stdTP) + " Kflows/second") 
+            main.log.info("Standard deviation of throughput: " + str(stdTP) + " Kflows/second")
 
             resultsLog = open("/tmp/flowTP1gDB","a")
             resultString = ("'" + commit + "',")
@@ -369,9 +369,9 @@
             resultString += (str(clusterCount) + ",")
             resultString += (str(n) + ",")
             resultString += (str(avgTP) + "," + str(stdTP) + "\n")
-            resultsLog.write(resultString) 
+            resultsLog.write(resultString)
             resultsLog.close()
-            
+
             main.log.report("Result line to file: " + resultString)
-           
-        main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], outputMode="d") 
+
+        main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], outputMode="d")
diff --git a/TestON/tests/SCPFintentEventTp/SCPFintentEventTp.py b/TestON/tests/SCPFintentEventTp/SCPFintentEventTp.py
index bf661fc..fb3f7db 100644
--- a/TestON/tests/SCPFintentEventTp/SCPFintentEventTp.py
+++ b/TestON/tests/SCPFintentEventTp/SCPFintentEventTp.py
@@ -35,7 +35,7 @@
         BENCHUser = main.params[ 'BENCH' ][ 'user' ]
         MN1Ip = main.params[ 'MN' ][ 'ip1' ]
         maxNodes = int(main.params[ 'max' ])
-        main.maxNodes = maxNodes 
+        main.maxNodes = maxNodes
         skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
         cellName = main.params[ 'ENV' ][ 'cellName' ]
         numSwitches = (main.params[ 'TEST' ][ 'numSwitches' ]).split(",")
@@ -46,12 +46,12 @@
         main.warnings = [0]*11
         main.errors = [0]*11
 
-        # -- INIT SECTION, ONLY RUNS ONCE -- # 
-        if init == False: 
+        # -- INIT SECTION, ONLY RUNS ONCE -- #
+        if init == False:
             init = True
             global clusterCount             #number of nodes running
             global ONOSIp                   #list of ONOS IP addresses
-            global scale 
+            global scale
             global commit
 
             clusterCount = 0
@@ -59,10 +59,10 @@
             print ONOSIp
             print main.ONOSbench.onosIps.values()
 
-            scale = (main.params[ 'SCALE' ]).split(",")            
+            scale = (main.params[ 'SCALE' ]).split(",")
             clusterCount = int(scale[0])
 
-            #Populate ONOSIp with ips from params 
+            #Populate ONOSIp with ips from params
             ONOSIp.extend(main.ONOSbench.getOnosIps())
 
             #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
@@ -80,31 +80,31 @@
                 pullResult = main.TRUE
                 main.log.info( "Skipped git checkout and pull" )
 
-            main.log.step("Grabbing commit number") 
+            main.log.step("Grabbing commit number")
             commit = main.ONOSbench.getVersion()
             commit = (commit.split(" "))[1]
-        
-            main.log.step("Creating results file") 
+
+            main.log.step("Creating results file")
             resultsDB = open("/tmp/IntentEventTPDB", "w+")
             resultsDB.close()
 
         # -- END OF INIT SECTION --#
 
-        main.log.step("Adjusting scale") 
-        print str(scale) 
+        main.log.step("Adjusting scale")
+        print str(scale)
         print str(ONOSIp)
         clusterCount = int(scale[0])
-        scale.remove(scale[0])       
-       
+        scale.remove(scale[0])
+
         MN1Ip = ONOSIp[len(ONOSIp) -1]
         BENCHIp = ONOSIp[len(ONOSIp) -2]
- 
-        #kill off all onos processes 
+
+        #kill off all onos processes
         main.log.step("Safety check, killing all ONOS processes")
         main.log.step("before initiating enviornment setup")
         for node in range(maxNodes):
             main.ONOSbench.onosDie(ONOSIp[node])
-       
+
         MN1Ip = ONOSIp[len(ONOSIp) -1]
         BENCHIp = ONOSIp[len(ONOSIp) -2]
 
@@ -117,13 +117,13 @@
         time.sleep(10)
         main.ONOSbench.handle.sendline(" ")
         main.ONOSbench.handle.expect(":~")
-        
+
         #construct the cell file
         main.log.info("Creating cell file")
         cellIp = []
         for node in range (clusterCount):
             cellIp.append(ONOSIp[node])
-         
+
         main.ONOSbench.createCellFile("localhost",cellName,MN1Ip,str(Apps), cellIp)
 
         main.step( "Set Cell" )
@@ -134,11 +134,11 @@
             myDistribution.append(numSwitches[node])
 
         main.step( "Creating ONOS package" )
-        packageResult = main.ONOSbench.onosPackage()  
+        packageResult = main.ONOSbench.onosPackage()
 
         main.step( "verify cells" )
         verifyCellResult = main.ONOSbench.verifyCell()
-      
+
         main.log.report( "Initializeing " + str( clusterCount ) + " node cluster." )
         for node in range(clusterCount):
             main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
@@ -158,7 +158,7 @@
 
         main.ONOSbench.onosCfgSet( ONOSIp[0], "org.onosproject.store.flow.impl.NewDistributedFlowRuleStore", "backupEnabled false")
 
-        devices = int(clusterCount)*10 
+        devices = int(clusterCount)*10
 
         main.log.step("Setting up null provider")
         for i in range(3):
@@ -188,7 +188,7 @@
 
             main.ONOSbench.handle.sendline("onos $OC1 summary")
             main.ONOSbench.handle.expect(":~")
-            
+
             main.log.info("before" + main.ONOSbench.handle.before)
             clusterCheck = main.ONOSbench.handle.before
             print("\nBefore: " + str(clusterCheck))
@@ -206,7 +206,7 @@
             lastOutput = clusterCheck
             time.sleep(5)
         main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"])
-    def CASE2( self, main ): 
+    def CASE2( self, main ):
         import time
         import json
         import string
@@ -227,7 +227,7 @@
                 currentNeighbors = "a"
                 neighbors = ['0']
             else:
-                currentNeighbors = "r" 
+                currentNeighbors = "r"
                 neighbors = ['a']
 
         if clusterCount == 1:
@@ -243,21 +243,21 @@
         debug = main.params[ 'debugMode' ]
         numKeys = main.params[ 'TEST' ][ 'numKeys' ]
         cyclePeriod = main.params[ 'TEST' ][ 'cyclePeriod' ]
-        #neighbors = (main.params[ 'TEST' ][ 'neighbors' ]).split(",") 
+        #neighbors = (main.params[ 'TEST' ][ 'neighbors' ]).split(",")
         metricList = [intentsRate, intentsWithdrawn, intentsFailed]
 
-        for n in range(0, len(neighbors)): 
-            if neighbors[n] == 'a': 
+        for n in range(0, len(neighbors)):
+            if neighbors[n] == 'a':
                 neighbors[n] = str(clusterCount -1)
                 if int(clusterCount) == 1:
                     neighbors = neighbors.pop()
- 
+
         for n in neighbors:
-            main.log.info("Run with " + n + " neighbors") 
+            main.log.info("Run with " + n + " neighbors")
             time.sleep(5)
             main.ONOSbench.handle.sendline("onos $OC1 cfg set org.onosproject.intentperf.IntentPerfInstaller numKeys " + numKeys )
             main.ONOSbench.handle.expect(":~")
-            main.ONOSbench.handle.sendline("onos $OC1 cfg set org.onosproject.intentperf.IntentPerfInstaller numNeighbors " + n ) 
+            main.ONOSbench.handle.sendline("onos $OC1 cfg set org.onosproject.intentperf.IntentPerfInstaller numNeighbors " + n )
             main.ONOSbench.handle.expect(":~")
             main.ONOSbench.handle.sendline("onos $OC1 cfg set org.onosproject.intentperf.IntentPerfInstaller cyclePeriod " + cyclePeriod )
             main.ONOSbench.handle.expect(":~")
@@ -321,9 +321,9 @@
             main.ONOSbench.handle.sendline(cmd)
             main.ONOSbench.handle.expect(":~")
             main.log.info("Stopping intentperf" )
-   
+
             resultsDB = open("/tmp/IntentEventTPDB", "a")
-            for node in groupResult: 
+            for node in groupResult:
 
                 resultString = "'" + commit + "',"
                 resultString += "'1gig',"
@@ -333,8 +333,8 @@
                 resultString += str(node) + ","
                 resultString += str(0) + "\n" #no stddev
                 resultsDB.write(resultString)
-            
-            resultsDB.close() 
-            
-            main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"])            
+
+            resultsDB.close()
+
+            main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"])
 
diff --git a/TestON/tests/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py b/TestON/tests/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py
index ef92e58..582afb7 100644
--- a/TestON/tests/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py
+++ b/TestON/tests/SCPFintentInstallWithdrawLat/SCPFintentInstallWithdrawLat.py
@@ -13,16 +13,16 @@
     def __init__( self ):
         self.default = ''
 
-    def CASE1( self, main ):           
-                                        
-        import time                     
-        global init       
-        try: 
-            if type(init) is not bool: 
-                init = False  
-        except NameError: 
-            init = False 
-       
+    def CASE1( self, main ):
+
+        import time
+        global init
+        try:
+            if type(init) is not bool:
+                init = False
+        except NameError:
+            init = False
+
         #Load values from params file
         checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
         gitPull = main.params[ 'GIT' ][ 'autopull' ]
@@ -33,23 +33,23 @@
         MN1Ip = main.params[ 'MN' ][ 'ip1' ]
         main.maxNodes = int(main.params[ 'max' ])
         skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
-        cellName = main.params[ 'ENV' ][ 'cellName' ]        
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
         switchCount = main.params[ 'TEST' ][ 'switchCount' ]
 
-        # -- INIT SECTION, ONLY RUNS ONCE -- # 
-        if init == False: 
+        # -- INIT SECTION, ONLY RUNS ONCE -- #
+        if init == False:
             init = True
             global clusterCount             #number of nodes running
             global ONOSIp                   #list of ONOS IP addresses
-            global scale 
-            global commit            
-    
+            global scale
+            global commit
+
             clusterCount = 0
             ONOSIp = [ 0 ]
-            scale = (main.params[ 'SCALE' ]).split(",")            
+            scale = (main.params[ 'SCALE' ]).split(",")
             clusterCount = int(scale[0])
 
-            #Populate ONOSIp with ips from params 
+            #Populate ONOSIp with ips from params
             ONOSIp = [0]
             ONOSIp.extend(main.ONOSbench.getOnosIps())
 
@@ -67,7 +67,7 @@
                 checkoutResult = main.TRUE
                 pullResult = main.TRUE
                 main.log.info( "Skipped git checkout and pull" )
-       
+
             commit = main.ONOSbench.getVersion()
             commit = (commit.split(" "))[1]
 
@@ -75,22 +75,22 @@
             resultsDB.close()
 
         # -- END OF INIT SECTION --#
-         
-        clusterCount = int(scale[0])
-        scale.remove(scale[0])       
 
-        #kill off all onos processes 
+        clusterCount = int(scale[0])
+        scale.remove(scale[0])
+
+        #kill off all onos processes
         main.log.step("Safety check, killing all ONOS processes")
         main.log.step("before initiating enviornment setup")
         for node in range(1, main.maxNodes + 1):
             main.ONOSbench.onosDie(ONOSIp[node])
-        
+
         #Uninstall everywhere
         main.log.step( "Cleaning Enviornment..." )
         for i in range(1, main.maxNodes + 1):
             main.log.info(" Uninstalling ONOS " + str(i) )
             main.ONOSbench.onosUninstall( ONOSIp[i] )
-       
+
         #construct the cell file
         main.log.info("Creating cell file")
         cellIp = []
@@ -101,13 +101,13 @@
 
         main.step( "Set Cell" )
         main.ONOSbench.setCell(cellName)
-        
+
         main.step( "Creating ONOS package" )
-        packageResult = main.ONOSbench.onosPackage()  
+        packageResult = main.ONOSbench.onosPackage()
 
         main.step( "verify cells" )
         verifyCellResult = main.ONOSbench.verifyCell()
-      
+
         main.log.report( "Initializeing " + str( clusterCount ) + " node cluster." )
         for node in range(1, clusterCount + 1):
             main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
@@ -124,24 +124,24 @@
 
         main.ONOS1cli.startOnosCli( ONOSIp[1] )
         main.log.info("Startup sequence complete")
-        
+
         time.sleep(30)
-        
+
         for i in range(3):
-            main.ONOSbench.onosCfgSet( ONOSIp[1], "org.onosproject.provider.nil.NullProviders", ("deviceCount " + str(switchCount)) ) 
+            main.ONOSbench.onosCfgSet( ONOSIp[1], "org.onosproject.provider.nil.NullProviders", ("deviceCount " + str(switchCount)) )
             main.ONOSbench.onosCfgSet( ONOSIp[1], "org.onosproject.provider.nil.NullProviders", "topoShape linear")
             main.ONOSbench.onosCfgSet( ONOSIp[1], "org.onosproject.provider.nil.NullProviders", "enabled true")
             if main.ONOSbench.verifySummary(ONOSIp[1], switchCount):
                 break
-            else: 
-                print "Failed- looping" 
+            else:
+                print "Failed- looping"
 
         main.ONOSbench.handle.sendline("""onos $OC1 "balance-masters" """)
         main.ONOSbench.handle.expect(":~")
         main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"])
 
     def CASE2( self, main ):
-         
+
         import time
         import numpy
 
@@ -169,18 +169,18 @@
             time.sleep(2)
 
         links = "--"
-        for i in range(8): 
+        for i in range(8):
             if debug: main.log.info("top of loop")
             main.ONOSbench.handle.sendline("onos $OC1 links")
             main.ONOSbench.handle.expect(":~")
             links = main.ONOSbench.handle.before
             if "=null:" in links:
-                break 
+                break
             if debug: main.log.info(str(links))
-            if i > 3: 
-                main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], "d")  
-            if i == 7: 
-                main.log.error("link data missing") 
+            if i > 3:
+                main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], "d")
+            if i == 7:
+                main.log.error("link data missing")
             time.sleep(3)
 
         links = links.splitlines()
@@ -236,21 +236,21 @@
                         if "withdraw" in line:
                             withdrawn.append(int(line.split(" ")[5]))
 
-                    for line in myRawResult: 
-                        if "Failure:" in line: 
+                    for line in myRawResult:
+                        if "Failure:" in line:
                             main.log.error("INTENT TEST FAILURE, ABORTING TESTCASE")
                             testStatus = "fail"
-                if testStatus == "fail": 
-                    break 
-                            
+                if testStatus == "fail":
+                    break
+
                     print("installed: " + str(installed))
                     print("withraw: " + str(withdrawn) + "\n")
-                    if withdrawn[len(withdrawn) -1] > 1000 or installed[len(installed) -1] > 1000: 
+                    if withdrawn[len(withdrawn) -1] > 1000 or installed[len(installed) -1] > 1000:
                         main.log.info("ABNORMAL VALUE, CHECKING LOG")
                         main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], outputMode="d")
 
-            if testStatus == "fail": 
-                break 
+            if testStatus == "fail":
+                break
             main.log.report("----------------------------------------------------")
             main.log.report("Scale: " + str(clusterCount) + "\tIntent batch size: " + str(intentSize))
             main.log.report("Data samples: " + str(sampleSize) + "\tWarm up tests: " + str(warmUp))
diff --git a/TestON/tests/SCPFintentRerouteLat/SCPFintentRerouteLat.py b/TestON/tests/SCPFintentRerouteLat/SCPFintentRerouteLat.py
index 07871f9..3b74dcf 100644
--- a/TestON/tests/SCPFintentRerouteLat/SCPFintentRerouteLat.py
+++ b/TestON/tests/SCPFintentRerouteLat/SCPFintentRerouteLat.py
@@ -36,20 +36,20 @@
         skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
         cellName = main.params[ 'ENV' ][ 'cellName' ]
 
-        # -- INIT SECTION, ONLY RUNS ONCE -- # 
-        if init == False: 
+        # -- INIT SECTION, ONLY RUNS ONCE -- #
+        if init == False:
             init = True
             global clusterCount             #number of nodes running
             global ONOSIp                   #list of ONOS IP addresses
-            global scale 
+            global scale
             global commit
 
             clusterCount = 0
             ONOSIp = [ 0 ]
-            scale = (main.params[ 'SCALE' ]).split(",")            
+            scale = (main.params[ 'SCALE' ]).split(",")
             clusterCount = int(scale[0])
 
-            #Populate ONOSIp with ips from params 
+            #Populate ONOSIp with ips from params
             ONOSIp = [0]
             ONOSIp.extend(main.ONOSbench.getOnosIps())
 
@@ -68,7 +68,7 @@
                 checkoutResult = main.TRUE
                 pullResult = main.TRUE
                 main.log.info( "Skipped git checkout and pull" )
-            
+
             commit = main.ONOSbench.getVersion()
             commit = (commit.split(" "))[1]
 
@@ -76,22 +76,22 @@
             resultsDB.close()
 
         # -- END OF INIT SECTION --#
-         
+
         clusterCount = int(scale[0])
-        scale.remove(scale[0])       
-      
-        #kill off all onos processes 
+        scale.remove(scale[0])
+
+        #kill off all onos processes
         main.log.step("Safety check, killing all ONOS processes")
         main.log.step("before initiating enviornment setup")
         for node in range(1, main.maxNodes + 1):
             main.ONOSbench.onosDie(ONOSIp[node])
-        
+
         #Uninstall everywhere
         main.log.step( "Cleaning Enviornment..." )
         for i in range(1, main.maxNodes + 1):
             main.log.info(" Uninstalling ONOS " + str(i) )
             main.ONOSbench.onosUninstall( ONOSIp[i] )
-       
+
         #construct the cell file
         main.log.info("Creating cell file")
         cellIp = []
@@ -102,13 +102,13 @@
 
         main.step( "Set Cell" )
         main.ONOSbench.setCell(cellName)
-        
+
         main.step( "Creating ONOS package" )
-        packageResult = main.ONOSbench.onosPackage()  
+        packageResult = main.ONOSbench.onosPackage()
 
         main.step( "verify cells" )
         verifyCellResult = main.ONOSbench.verifyCell()
-      
+
         main.log.report( "Initializing " + str( clusterCount ) + " node cluster." )
         for node in range(1, clusterCount + 1):
             main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
@@ -123,7 +123,7 @@
             if not isup:
                 main.log.report( "ONOS " + str(node) + " didn't start!" )
         main.log.info("Startup sequence complete")
-    
+
         deviceMastership = (main.params[ 'TEST' ][ "s" + str(clusterCount) ]).split(",")
         print("Device mastership list: " + str(deviceMastership))
 
@@ -149,9 +149,9 @@
                 main.ONOSbench.handle.sendline(cmd)
                 main.ONOSbench.handle.expect(":~")
                 time.sleep(4)
-                
-                cmd = ( "onos $OC" + node + " roles|grep 00000" + str(index)) 
-                main.log.info(cmd) 
+
+                cmd = ( "onos $OC" + node + " roles|grep 00000" + str(index))
+                main.log.info(cmd)
                 main.ONOSbench.handle.sendline(cmd)
                 main.ONOSbench.handle.expect(":~")
                 check = main.ONOSbench.handle.before
@@ -163,7 +163,7 @@
         main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"])
 
     def CASE2( self, main ):
-         
+
         import time
         import numpy
         import datetime
@@ -233,7 +233,7 @@
                         #main.ONOSbench.logReport(ONOSIp[(clusterCount-1)], ["ERROR", "WARNING", "EXCEPT"], "d")
                         main.ONOSbench.sendline("onos $OC1 summary")
                         main.ONOSbench.sendline("onos $OC1 devices")
-                        main.ONOSbench.sendline("onos $OC1 links") 
+                        main.ONOSbench.sendline("onos $OC1 links")
                         main.ONOSbench.expect(":~")
                         main.log.info(main.ONOSbench.before)
 
@@ -265,7 +265,7 @@
                         break
 
                 cutTimestamp = (temp.split(" "))[0] + " " + (temp.split(" "))[1]
-                if debug: main.log.info("Cut timestamp: " + cutTimestamp) 
+                if debug: main.log.info("Cut timestamp: " + cutTimestamp)
 
                 #validate link count and flow count
                 for i in range(0, 40):
@@ -279,7 +279,7 @@
                         main.log.error("Link or flow count incorrect, data invalid." + linkCheck)
                         main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], "d")
 
-                time.sleep(5) #trying to avoid negative values 
+                time.sleep(5) #trying to avoid negative values
 
                 #intents events metrics installed timestamp
                 IEMtimestamps = [0]*(clusterCount + 1)
@@ -340,12 +340,12 @@
                 if debug: main.log.info(cmd)
                 main.ONOSbench.handle.sendline(cmd)
                 main.ONOSbench.handle.expect(":~")
-                
+
                 #wait for intent withdraw
                 main.ONOSbench.handle.sendline(withdrawCmd)
-                main.log.info(withdrawCmd) 
+                main.log.info(withdrawCmd)
                 main.ONOSbench.handle.expect(":~")
-                if debug: main.log.info(main.ONOSbench.handle.before) 
+                if debug: main.log.info(main.ONOSbench.handle.before)
                 main.ONOSbench.handle.sendline("onos $OC1 intents|grep WITHDRAWN|wc -l")
                 main.ONOSbench.handle.expect(":~")
                 intentWithdrawCheck = main.ONOSbench.handle.before
@@ -373,7 +373,7 @@
             for i in myResult:
                 latTemp.append(i[0])
                 nodeTemp.append(i[1])
-                 
+
             mode = {}
             for i in nodeTemp:
                 if i in mode:
@@ -398,7 +398,7 @@
             main.log.report("________________________________________________________")
 
             resultsDB = open("/tmp/IntentRerouteLatDB", "a")
-            resultsDB.write("'" + commit + "',") 
+            resultsDB.write("'" + commit + "',")
             resultsDB.write(str(clusterCount) + ",")
             resultsDB.write(str(intents) + ",")
             resultsDB.write(str(average) + ",")
diff --git a/TestON/tests/SCPFswitchLat/SCPFswitchLat.py b/TestON/tests/SCPFswitchLat/SCPFswitchLat.py
index 81cbf16..439efff 100644
--- a/TestON/tests/SCPFswitchLat/SCPFswitchLat.py
+++ b/TestON/tests/SCPFswitchLat/SCPFswitchLat.py
@@ -37,11 +37,11 @@
         testONpath = os.getcwd() #testON/bin
         user = main.params[ 'CTRL' ][ 'user' ]
 
-        # -- INIT SECTION, ONLY RUNS ONCE -- # 
-        if init == False: 
+        # -- INIT SECTION, ONLY RUNS ONCE -- #
+        if init == False:
             init = True
             global clusterCount             #number of nodes running
-            global scale 
+            global scale
             global commit
             global timeToPost
             global runNum
@@ -66,7 +66,7 @@
             clusterCount = 0
             main.ONOSIp = main.ONOSbench.getOnosIps()
 
-            scale = (main.params[ 'SCALE' ]).split(",")            
+            scale = (main.params[ 'SCALE' ]).split(",")
             clusterCount = int(scale[0])
 
             #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
@@ -84,10 +84,10 @@
                 pullResult = main.TRUE
                 main.log.info( "Skipped git checkout and pull" )
 
-            main.log.step("Grabbing commit number") 
+            main.log.step("Grabbing commit number")
             commit = main.ONOSbench.getVersion()       ####
             commit = (commit.split(" "))[1]
-        
+
             temp = testONpath.replace("bin","") + "tests/SCPFswitchLat/Dependency/"
             main.ONOSbench.copyMininetFile("topo-perf-1sw.py", temp, user, "localhost" )
             #main.ONOSbench.handle.expect(":~")
@@ -96,19 +96,19 @@
             print switchEventResultPath
             fSwitchLog = open(switchEventResultPath, "w+")
             fSwitchLog.write("")
-            fSwitchLog.close() 
+            fSwitchLog.close()
 
         # -- END OF INIT SECTION --#
 
-        main.log.step("Adjusting scale") 
+        main.log.step("Adjusting scale")
         clusterCount = int(scale[0])
-        scale.remove(scale[0])       
-       
-        #kill off all onos processes 
+        scale.remove(scale[0])
+
+        #kill off all onos processes
         main.log.step("Safety check, killing all ONOS processes before initiating enviornment setup")
         for node in range(main.maxNodes):
             main.ONOSbench.onosDie(main.ONOSIp[node])
-       
+
         #Uninstall everywhere
         main.log.step( "Cleaning Enviornment..." )
         for i in range(main.maxNodes):
@@ -118,24 +118,24 @@
         time.sleep(10)
         main.ONOSbench.handle.sendline(" ")
         main.ONOSbench.handle.expect(":~")
-        
+
         #construct the cell file
         main.log.info("Creating cell file")
         cellIp = []
         for node in range (clusterCount):
             cellIp.append(main.ONOSIp[node])
-         
+
         main.ONOSbench.createCellFile(main.ONOSbench.ip_address, cellName, MN1Ip, str(Apps), cellIp)
 
         main.step( "Set Cell" )
         main.ONOSbench.setCell(cellName)
 
         main.step( "Creating ONOS package" )
-        packageResult = main.ONOSbench.onosPackage()  
+        packageResult = main.ONOSbench.onosPackage()
 
         main.step( "verify cells" )
         verifyCellResult = main.ONOSbench.verifyCell()
-         
+
         main.step('Starting mininet topology ')
         main.Mininet1.startNet()
 
@@ -151,7 +151,7 @@
             main.ONOSbench.handle.expect(":~")
             print main.ONOSbench.handle.before
             if "nodes=" in main.ONOSbench.handle.before:
-                break 
+                break
 
         for node in range(clusterCount):
             for i in range( 2 ):
@@ -164,26 +164,26 @@
         main.log.info("Startup sequence complete")
 
         #time.sleep(20)
-    
+
         main.step('Start onos cli')
-        for i in range(0,clusterCount): 
+        for i in range(0,clusterCount):
             cli1 = CLIs[i].startOnosCli(main.ONOSIp[i])
 
         main.step( 'Configuring application parameters' )
-        
+
         configName = 'org.onosproject.net.topology.impl.DefaultTopologyProvider'
         configParam = 'maxEvents 1'
         main.ONOSbench.onosCfgSet( main.ONOSIp[0], configName, configParam )
         configParam = 'maxBatchMs 0'
         main.ONOSbench.onosCfgSet( main.ONOSIp[0], configName, configParam )
         configParam = 'maxIdleMs 0'
-        main.ONOSbench.onosCfgSet( main.ONOSIp[0], configName, configParam ) 
+        main.ONOSbench.onosCfgSet( main.ONOSIp[0], configName, configParam )
 
     def CASE2(self, main):
         print "Cluster size: " + str(clusterCount)
         """
         Assign s3 to ONOSbench and measure latency
-        
+
         There are 4 levels of latency measurements to this test:
         1 ) End-to-end measurement: Complete end-to-end measurement
            from TCP ( SYN/ACK ) handshake to Graph change
@@ -207,7 +207,7 @@
         ONOSUser = main.params['CTRL']['user']
         numIter = main.params['TEST']['numIter']
         iterIgnore = int(main.params['TEST']['iterIgnore'])
-        
+
         deviceTimestampKey = main.params['JSON']['deviceTimestamp']
         graphTimestampKey = main.params['JSON']['graphTimestamp']
 
@@ -218,7 +218,7 @@
         thresholdObj = thresholdStr.split(',')
         thresholdMin = int(thresholdObj[0])
         thresholdMax = int(thresholdObj[1])
-       
+
         # Look for 'role-request' messages,
         # which replaces the 'vendor' messages previously seen
         # on OVS 2.0.1
@@ -238,7 +238,7 @@
         # TCP Syn/Ack -> Feature Reply latency collection for each node
         tcpToFeatureLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
         # Feature Reply -> Role Request latency collection for each node
-        featureToRoleRequestLatNodeIter = numpy.zeros((clusterCount, 
+        featureToRoleRequestLatNodeIter = numpy.zeros((clusterCount,
             int(numIter)))
         # Role Request -> Role Reply latency collection for each node
         roleRequestToRoleReplyLatNodeIter = numpy.zeros((clusterCount,
@@ -250,7 +250,7 @@
         deviceToGraphLatNodeIter = numpy.zeros((clusterCount,
             int(numIter)))
         endToEndLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
-        
+
         # Switch disconnect measurement lists
         # Mininet Fin / Ack -> Mininet Ack
         finAckTransactionLatNodeIter = numpy.zeros((clusterCount,
@@ -262,7 +262,7 @@
         deviceToGraphDiscLatNodeIter = numpy.zeros((clusterCount,
             int(numIter)))
         endToEndDiscLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
-        
+
         assertion = main.TRUE
         localTime = time.strftime('%x %X')
         localTime = localTime.replace('/', '')
@@ -276,7 +276,7 @@
         main.log.report('Latency of adding one switch to controller')
         main.log.report('First ' + str(iterIgnore) + ' iterations ignored' + ' for jvm warmup time')
         main.log.report('Total iterations of test: ' + str(numIter))
-        
+
         for i in range(0, int(numIter)):
             main.log.info('Starting tshark capture')
             main.ONOSbench.tsharkGrep(tsharkTcpString, tsharkTcpOutput)
@@ -285,23 +285,23 @@
             main.ONOSbench.tsharkGrep(tsharkFeatureReply, tsharkFeatureOutput)
 
             time.sleep(10)
-           
+
             main.log.info('Assigning s3 to controller')
             main.Mininet1.assignSwController(sw='s3',
                     ip=main.ONOSIp[0])
-               
+
             jsonStr = []
-            for node in range (0, clusterCount): 
+            for node in range (0, clusterCount):
                 metricsSwUp = CLIs[node].topologyEventsMetrics()
                 jsonStr.append(metricsSwUp)
-          
+
             time.sleep(10)
 
             main.log.info('Stopping all Tshark processes')
             main.ONOSbench.tsharkStop()
-           
+
             time.sleep(5)
-           
+
             '''
             main.log.info('Copying over tshark files')
             os.system('scp ' + ONOSUser + '@' + main.ONOSIp[0] +
@@ -321,7 +321,7 @@
             tempText = tcpFile.readline()
             tempText = tempText.split(' ')
             main.log.info('Object read in from TCP capture: ' + str(tempText))
-            
+
             if len(tempText) > 1:
                 t0Tcp = float(tempText[1]) * 1000.0
             else:
@@ -329,7 +329,7 @@
                 t0Tcp = 0
                 assertion = main.FALSE
             tcpFile.close()
-           
+
             # Get Role reply output
             ofFile = open(tsharkOfOutput, 'r')
             lineOfp = ''
@@ -350,7 +350,7 @@
                 t0Ofp = 0
                 assertion = main.FALSE
             ofFile.close()
-           
+
             # Get role request output
             roleFile = open(tsharkRoleOutput, 'r')
             tempText = roleFile.readline()
@@ -378,7 +378,7 @@
                 elif tempText[2] != ' ' and float(tempText[2]) > 1400000000.0:
                     temp = tempText[2]
                 else:
-                    temp = 0 
+                    temp = 0
                 featureTimestamp = float(temp) * 1000.0
             else:
                 main.log.error('Tshark output file for feature reply' +
@@ -397,33 +397,33 @@
                     deviceTimestamp = jsonObj[deviceTimestampKey]['value']
                 else:
                     main.log.error( "Unexpected JSON object" )
-                    # If we could not obtain the JSON object, 
+                    # If we could not obtain the JSON object,
                     # set the timestamps to 0, which will be
                     # excluded from the measurement later on
                     # (realized as invalid)
                     graphTimestamp = 0
                     deviceTimestamp = 0
-                
+
                 endToEnd = int(graphTimestamp) - int(t0Tcp)
-                
+
                 # Below are measurement breakdowns of the end-to-end
-                # measurement. 
+                # measurement.
                 tcpToFeature = int(featureTimestamp) - int(t0Tcp)
                 featureToRole = int(roleTimestamp) - int(featureTimestamp)
                 roleToOfp = float(t0Ofp) - float(roleTimestamp)
                 ofpToDevice = float(deviceTimestamp) - float(t0Ofp)
-                # Timestamps gathered from ONOS are millisecond 
+                # Timestamps gathered from ONOS are millisecond
                 # precision. They are returned as integers, thus no
                 # need to be more precise than 'int'. However,
-                # the processing seems to be mostly under 1 ms, 
-                # thus this may be a problem point to handle any 
+                # the processing seems to be mostly under 1 ms,
+                # thus this may be a problem point to handle any
                 # submillisecond output that we are unsure of.
                 # For now, this will be treated as 0 ms if less than 1 ms
                 deviceToGraph = int(graphTimestamp) - int(deviceTimestamp)
-                
+
                 if endToEnd >= thresholdMin and\
                    endToEnd < thresholdMax and i >= iterIgnore:
-                    endToEndLatNodeIter[node][i] = endToEnd 
+                    endToEndLatNodeIter[node][i] = endToEnd
                     main.log.info("ONOS "+str(nodeNum)+ " end-to-end: "+
                             str(endToEnd) + " ms")
                 else:
@@ -431,10 +431,10 @@
                             "measurement ignored due to excess in "+
                             "threshold or premature iteration: ")
                     main.log.info(str(endToEnd))
-                        
+
                 if tcpToFeature >= thresholdMin and\
                    tcpToFeature < thresholdMax and i >= iterIgnore:
-                    tcpToFeatureLatNodeIter[node][i] = tcpToFeature 
+                    tcpToFeatureLatNodeIter[node][i] = tcpToFeature
                     main.log.info("ONOS "+str(nodeNum)+ " tcp-to-feature: "+
                             str(tcpToFeature) + " ms")
                 else:
@@ -445,7 +445,7 @@
 
                 if featureToRole >= thresholdMin and\
                    featureToRole < thresholdMax and i >= iterIgnore:
-                    featureToRoleRequestLatNodeIter[node][i] = featureToRole 
+                    featureToRoleRequestLatNodeIter[node][i] = featureToRole
                     main.log.info("ONOS "+str(nodeNum)+ " feature-to-role: "+
                             str(featureToRole) + " ms")
                 else:
@@ -464,10 +464,10 @@
                             "measurement ignored due to excess in "+
                             "threshold or premature iteration: ")
                     main.log.info(str(roleToOfp))
-                
+
                 if ofpToDevice >= thresholdMin and\
                    ofpToDevice < thresholdMax and i >= iterIgnore:
-                    roleReplyToDeviceLatNodeIter[node][i] = ofpToDevice 
+                    roleReplyToDeviceLatNodeIter[node][i] = ofpToDevice
                     main.log.info("ONOS "+str(nodeNum)+ " reply-to-device: "+
                             str(ofpToDevice) + " ms")
                 else:
@@ -489,26 +489,26 @@
                             "was set to 0 ms because of precision "+
                             "uncertainty. ")
                     else:
-                        main.log.info("ONOS "+str(nodeNum)+ 
+                        main.log.info("ONOS "+str(nodeNum)+
                             " device-to-graph "+
                             "measurement ignored due to excess in "+
                             "threshold or premature iteration: ")
-                        main.log.info(str(deviceToGraph))   
-                            
+                        main.log.info(str(deviceToGraph))
+
             # ********************
             time.sleep(5)
-        
+
             # Get device id to remove
             deviceIdJsonStr = main.ONOS1cli.devices()
-            
+
             main.log.info( "Device obj obtained: " + str(deviceIdJsonStr) )
             deviceId = json.loads(deviceIdJsonStr)
 
             deviceList = []
             for device in deviceId:
                 deviceList.append(device['id'])
-           
-            # Measure switch down metrics 
+
+            # Measure switch down metrics
             # TCP FIN/ACK -> TCP FIN
             # TCP FIN -> Device Event
             # Device Event -> Graph Event
@@ -516,53 +516,53 @@
 
             # The -A 1 grep option allows us to grab 1 extra line after the
             # last tshark output grepped originally
-            main.ONOSbench.tsharkGrep( tsharkFinAckSequence, tsharkFinAckOutput, 
+            main.ONOSbench.tsharkGrep( tsharkFinAckSequence, tsharkFinAckOutput,
                     grepOptions = '-A 1' )
-           
+
             time.sleep( 5 )
 
             removeJsonList = []
             main.step('Remove switch from controller')
             main.Mininet1.deleteSwController('s3')
-            firstDevice = deviceList[0] 
+            firstDevice = deviceList[0]
 
             time.sleep( 5 )
-            
+
             # We need to get metrics before removing
             # device from the store below.
             for node in range(0, clusterCount):
                 metricsSwDown = CLIs[node].topologyEventsMetrics
                 jsonStr = metricsSwDown()
-                removeJsonList.append( json.loads(jsonStr) ) 
-           
+                removeJsonList.append( json.loads(jsonStr) )
+
             main.ONOSbench.tsharkStop()
-            
+
             main.log.info( "Removing device " +str(firstDevice)+
                     " from ONOS" )
-           
+
             #if deviceId:
             main.ONOS1cli.deviceRemove(firstDevice)
 
             #main.log.info('Copying over tshark files')
             #os.system('scp ' + ONOSUser + '@' + main.ONOSIp[0] + ':' + tsharkFinAckOutput + ' /tmp/')
-           
+
             time.sleep( 10 )
             finAckOutputList = []
             with open(tsharkFinAckOutput, 'r') as f:
                 tempLine = f.readlines()
                 main.log.info('Object read in from FinAck capture: ' +
                     "\n".join(tempLine))
-                
+
                 index = 1
                 for line in tempLine:
                     obj = line.split(' ')
-           
-                    # There are at least 3 objects in field (valid 
+
+                    # There are at least 3 objects in field (valid
                     # tshark output is lengthy)
                     if len(obj) > 2:
                         # If first index of object is like an epoch time
                         if obj[1] != ' ' and float(obj[1]) > 1400000000.0:
-                            temp = obj[1] 
+                            temp = obj[1]
                         elif obj[2] != ' 'and float(obj[2]) > 1400000000.0:
                             temp = obj[2]
                         elif obj[3] != ' 'and float(obj[3]) > 1400000000.0:
@@ -582,13 +582,13 @@
                         tFinAck = 0
                         tAck = 0
                         assertion = main.FALSE
-                    
+
                     index += 1
 
             # with open() as f takes care of closing file
 
             time.sleep(5)
-            
+
             for node in range(0, clusterCount):
                 nodeNum = node+1
                 jsonObj = removeJsonList[node]
@@ -599,26 +599,26 @@
                     main.log.info("Device timestamp: "+str(deviceTimestamp))
                 else:
                     main.log.error( "Unexpected JSON object" )
-                    # If we could not obtain the JSON object, 
+                    # If we could not obtain the JSON object,
                     # set the timestamps to 0, which will be
                     # excluded from the measurement later on
                     # (realized as invalid)
                     graphTimestamp = 0
                     deviceTimestamp = 0
-               
+
                 finAckTransaction = float(tAck) - float(tFinAck)
                 ackToDevice = float(deviceTimestamp) - float(tAck)
                 deviceToGraph = float(graphTimestamp) - float(deviceTimestamp)
                 endToEndDisc = int(graphTimestamp) - int(tFinAck)
-    
+
                 if endToEndDisc >= thresholdMin and\
                    endToEndDisc < thresholdMax and i >= iterIgnore:
                     endToEndDiscLatNodeIter[node][i] = endToEndDisc
-                    main.log.info("ONOS "+str(nodeNum) + 
+                    main.log.info("ONOS "+str(nodeNum) +
                             "end-to-end disconnection: "+
                             str(endToEndDisc) + " ms" )
                 else:
-                    main.log.info("ONOS " + str(nodeNum) + 
+                    main.log.info("ONOS " + str(nodeNum) +
                             " end-to-end disconnection "+
                             "measurement ignored due to excess in "+
                             "threshold or premature iteration: ")
@@ -626,7 +626,7 @@
 
                 if finAckTransaction >= thresholdMin and\
                    finAckTransaction < thresholdMax and i >= iterIgnore:
-                    finAckTransactionLatNodeIter[node][i] = finAckTransaction 
+                    finAckTransactionLatNodeIter[node][i] = finAckTransaction
                     main.log.info("ONOS "+str(nodeNum)+
                             " fin/ack transaction: "+
                             str(finAckTransaction) + " ms")
@@ -674,12 +674,12 @@
             roleToOfpList = []
             ofpToDeviceList = []
             deviceToGraphList = []
-            
+
             finAckTransactionList = []
             ackToDeviceList = []
             deviceToGraphDiscList = []
             endToEndDiscList = []
-            
+
             # LatNodeIter 2d arrays contain all iteration latency
             # for each node of the current scale cluster size
             # Switch connection measurements
@@ -704,7 +704,7 @@
             for item in roleReplyToDeviceLatNodeIter[node]:
                 if item >= 0.0:
                     ofpToDeviceList.append(item)
-            
+
             for item in featureToRoleRequestLatNodeIter[node]:
                 if item > 0.0:
                     featureToRoleList.append(item)
@@ -717,7 +717,7 @@
             for item in endToEndDiscLatNodeIter[node]:
                 if item > 0.0:
                     endToEndDiscList.append(item)
-                    
+
             for item in finAckTransactionLatNodeIter[node]:
                 if item > 0.0:
                     finAckTransactionList.append(item)
@@ -738,13 +738,13 @@
 
             featureToRoleAvg = round(numpy.mean(featureToRoleList), 2)
             featureToRoleStdDev = round(numpy.std(featureToRoleList), 2)
-            
+
             roleToOfpAvg = round(numpy.mean(roleToOfpList), 2)
             roleToOfpStdDev = round(numpy.std(roleToOfpList), 2)
 
             ofpToDeviceAvg = round(numpy.mean(ofpToDeviceList), 2)
             ofpToDeviceStdDev = round(numpy.std(ofpToDeviceList), 2)
-            
+
             deviceToGraphAvg = round(numpy.mean(deviceToGraphList), 2)
             deviceToGraphStdDev = round(numpy.std(deviceToGraphList), 2)
 
@@ -753,55 +753,55 @@
 
             finAckAvg = round(numpy.mean(finAckTransactionList), 2)
             finAckStdDev = round(numpy.std(finAckTransactionList), 2)
-            
+
             ackToDeviceAvg = round(numpy.mean(ackToDeviceList), 2)
             ackToDeviceStdDev = round(numpy.std(ackToDeviceList), 2)
-            
+
             deviceToGraphDiscAvg = round(numpy.mean(deviceToGraphDiscList), 2)
             deviceToGraphDiscStdDev = round(numpy.std(deviceToGraphDiscList), 2)
 
             main.log.report(' - Node ' + str(node + 1) + ' Summary - ')
             main.log.report(' - Switch Connection Statistics - ')
-            
+
             main.log.report(' End-to-end Avg: ' + str(endToEndAvg) +
                     ' ms' + ' End-to-end Std dev: ' +
                     str(endToEndStdDev) + ' ms')
-            
+
             main.log.report(' Tcp-to-feature-reply Avg: ' +
                     str(tcpToFeatureAvg) + ' ms')
             main.log.report(' Tcp-to-feature-reply Std dev: '+
                     str(tcpToFeatureStdDev) + ' ms')
-            
+
             main.log.report(' Feature-reply-to-role-request Avg: ' +
                     str(featureToRoleAvg) + ' ms')
             main.log.report(' Feature-reply-to-role-request Std Dev: ' +
                     str(featureToRoleStdDev) + ' ms')
-            
+
             main.log.report(' Role-request-to-role-reply Avg: ' +
                     str(roleToOfpAvg) +' ms')
             main.log.report(' Role-request-to-role-reply Std dev: ' +
                     str(roleToOfpStdDev) + ' ms')
-            
+
             main.log.report(' Role-reply-to-device Avg: ' +
                     str(ofpToDeviceAvg) +' ms')
             main.log.report(' Role-reply-to-device Std dev: ' +
                     str(ofpToDeviceStdDev) + ' ms')
-            
+
             main.log.report(' Device-to-graph Avg: ' +
                     str(deviceToGraphAvg) + ' ms')
             main.log.report( 'Device-to-graph Std dev: ' +
                     str(deviceToGraphStdDev) + ' ms')
-            
+
             main.log.report(' - Switch Disconnection Statistics - ')
-            main.log.report(' End-to-end switch disconnect Avg: ' + 
+            main.log.report(' End-to-end switch disconnect Avg: ' +
                     str(endToEndDiscAvg) + ' ms')
             main.log.report(' End-to-end switch disconnect Std dev: ' +
                     str(endToEndDiscStdDev) + ' ms')
             main.log.report(' Fin/Ack-to-Ack Avg: ' + str(finAckAvg) + ' ms')
             main.log.report(' Fin/Ack-to-Ack Std dev: ' +
                     str(finAckStdDev) + ' ms')
-            
-            main.log.report(' Ack-to-device Avg: ' + str(ackToDeviceAvg) + 
+
+            main.log.report(' Ack-to-device Avg: ' + str(ackToDeviceAvg) +
                     ' ms')
             main.log.report(' Ack-to-device Std dev: ' + str(ackToDeviceStdDev) +
                     ' ms')
@@ -815,8 +815,8 @@
             dbCmdList.append(
                     "INSERT INTO switch_latency_details VALUES('" +
                     timeToPost + "','switch_latency_results'," +
-                    jenkinsBuildNumber + ',' + str(clusterCount) + ",'baremetal" + 
-                    str(node + 1) + "'," + 
+                    jenkinsBuildNumber + ',' + str(clusterCount) + ",'baremetal" +
+                    str(node + 1) + "'," +
                     str(endToEndAvg) + ',' +
                     str(tcpToFeatureAvg) + ',' +
                     str(featureToRoleAvg) + ',' +
@@ -826,7 +826,7 @@
                     str(endToEndDiscAvg) + ',' +
                     str(finAckAvg) + ',' +
                     str(ackToDeviceAvg) + ',' +
-                    str(deviceToGraphDiscAvg) + 
+                    str(deviceToGraphDiscAvg) +
                     ');')
 
         if debugMode == 'on':
@@ -836,13 +836,13 @@
         for line in dbCmdList:
             if line:
                 fResult.write(line + '\n')
-                main.log.report(line) 
+                main.log.report(line)
         fResult.close()
-        
+
         assertion = main.TRUE
-        
+
         utilities.assert_equals(expect=main.TRUE, actual=assertion,
-                onpass='Switch latency test successful', 
+                onpass='Switch latency test successful',
                 onfail='Switch latency test failed')
 
         main.Mininet1.stopNet()
