Merge branch 'master' of https://github.com/OPENNETWORKINGLAB/ONLabTest into scale_out

Conflicts:
	TestON/drivers/common/cli/onosclidriver.py
	TestON/drivers/common/cli/onosdriver.py
	TestON/tests/LinkEventTP/LinkEventTP.params
	TestON/tests/LinkEventTP/LinkEventTP.py
diff --git a/.gitignore b/.gitignore
index 6cccacc..ae5f64f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 *.swp
+*.swo
 TestON/logs/*
 *.pyc
diff --git a/README.md b/README.md
index 5986719..ef2c912 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,12 @@
 TestON is the testing platform that all the ONOS tests are being run on currently. 
 
 
-Setup 
+Code Style
+-------------
+At ON.Lab, we have adopted the [Mininet Python style](https://github.com/mininet/mininet/wiki/Mininet-Python-Style) for our drivers and testcases. The one exception is that TestON does not correctly parse multiline comments in testcases when the ending triple double quotes are on the same line as the comment. Therefore, in the testcases, the ending triple double quotes must be on it's own line.
+
+
+Setup
 -------------
 
 0. Pull the git repo from https://github.com/OPENNETWORKINGLAB/ONLabTest.git 
diff --git a/TestON/core/Thread.py b/TestON/core/Thread.py
new file mode 100644
index 0000000..e20abc3
--- /dev/null
+++ b/TestON/core/Thread.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+import threading
+
+class Thread(threading.Thread):
+    def __init__(self, target = None, threadID=None, name="", args=(), kwargs={}):
+        super(Thread, self).__init__()
+        self.threadID = threadID
+        self.name = name
+        self.target = target
+        self.args = args
+        self.kwargs = kwargs
+        self.result = None
+
+    def run( self ):
+        try:
+            if self.target is not None:
+                if len(self.args) != 0:
+                    self.result = self.target( *self.args )
+                else:
+                    self.result = self.target()
+        except Exception as e:
+            print "Thread-" + str(self.threadID) + \
+                  ":something went wrong with " + self.name + " method"
+            print e
diff --git a/TestON/core/iniparser.py b/TestON/core/iniparser.py
index b952f2d..c350a20 100644
--- a/TestON/core/iniparser.py
+++ b/TestON/core/iniparser.py
@@ -48,7 +48,7 @@
             try :
                 parsedInfo = ConfigObj(self.fileName)
                 return parsedInfo
-            except :
+            except Exception:
                 print "There is no such file to parse "+fileName
         else:
             return 0
diff --git a/TestON/core/jsonparser.py b/TestON/core/jsonparser.py
index 8726e87..fea797a 100644
--- a/TestON/core/jsonparser.py
+++ b/TestON/core/jsonparser.py
@@ -21,7 +21,6 @@
 
 '''
 
-import re
 import json
 class JsonParser:
     '''
@@ -37,7 +36,7 @@
         response_dict = {}
         try :
             response_dict = json.loads(json_response)
-        except :
+        except Exception:
             main.log.error("Json Parser is unable to parse the string")
         return response_dict         
     
@@ -50,7 +49,7 @@
         json_response = {}
         try :
             json_response = json.dumps(response_dict)
-        except :
+        except Exception:
             main.log.error("Json Parser is unable to parse the string")
         return json_response  
     '''
diff --git a/TestON/core/teston.py b/TestON/core/teston.py
index 8934e50..70de8ec 100644
--- a/TestON/core/teston.py
+++ b/TestON/core/teston.py
@@ -31,6 +31,7 @@
 import __builtin__
 import new
 import xmldict
+import importlib
 module = new.module("test")
 import openspeak
 global path, drivers_path, core_path, tests_path,logs_path
@@ -46,10 +47,8 @@
 sys.path.append(tests_path)
 
 from core.utilities import Utilities
+from core.Thread import Thread
 
-import logging 
-import datetime
-from optparse import OptionParser
 
 class TestON:
     '''
@@ -79,18 +78,18 @@
         self.init_result = self.TRUE
         self.testResult = "Summary"
         self.stepName =""
-        self.EXPERIMENTAL_MODE = False   
+        self.EXPERIMENTAL_MODE = False
         self.test_target = None
         self.lastcommand = None
-        self.testDir = tests_path 
-        self.configFile = config_path + "teston.cfg" 
+        self.testDir = tests_path
+        self.configFile = config_path + "teston.cfg"
         self.parsingClass = "xmlparser"
         self.parserPath = core_path + "/xmlparser"
         self.loggerPath = core_path + "/logger"
         self.loggerClass = "Logger"
         self.logs_path = logs_path
         self.driver = ''
-	
+        self.Thread = Thread
         
         self.configparser()
         verifyOptions(options)
@@ -111,7 +110,7 @@
                 if 'test_target' in self.componentDictionary[component].keys():
                     self.test_target = component
              
-        # Checking for the openspeak file and test script 
+        # Checking for the openspeak file and test script
         self.logger.initlog(self)
 
         # Creating Drivers Handles
@@ -142,7 +141,7 @@
             try :
                 self.configDict = xmldict.xml_to_dict(xml)
                 return self.configDict
-            except :
+            except Exception:
                 print "There is no such file to parse " + self.configFile
                         
     def componentInit(self,component):
@@ -151,7 +150,7 @@
         '''
         global driver_options
         self.log.info("Creating component Handle: "+component)
-        driver_options = {}         
+        driver_options = {}
         if 'COMPONENTS' in self.componentDictionary[component].keys():
             driver_options =dict(self.componentDictionary[component]['COMPONENTS'])
 
@@ -160,7 +159,7 @@
         driver_options ['type'] = driverName
         
         classPath = self.getDriverPath(driverName.lower())
-        driverModule = __import__(classPath, globals(), locals(), [driverName.lower()], -1)
+        driverModule = importlib.import_module(classPath)
         driverClass = getattr(driverModule, driverName)
         driverObject = driverClass()
          
@@ -171,7 +170,7 @@
                                               options = driver_options)
         if not connect_result:
             self.log.error("Exiting form the test execution because the connecting to the "+component+" component failed.")
-            self.exit() 
+            self.exit()
             
         vars(self)[component] = driverObject
                         
@@ -186,7 +185,7 @@
         self.testCaseResult = {}
         self.TOTAL_TC = 0
         self.TOTAL_TC_RUN = 0
-        self.TOTAL_TC_PLANNED = 0 
+        self.TOTAL_TC_PLANNED = 0
         self.TOTAL_TC_NORESULT = 0
         self.TOTAL_TC_FAIL = 0
         self.TOTAL_TC_PASS = 0
@@ -194,19 +193,19 @@
         self.stepCount = 0
         self.CASERESULT = self.TRUE
         
-        import testparser 
+        import testparser
         testFile = self.tests_path + "/"+self.TEST + "/"+self.TEST + ".py"
         test = testparser.TestParser(testFile)
         self.testscript = test.testscript
         self.code = test.getStepCode()
-	repeat= int(self.params['repeat']) if ('repeat' in self.params) else 1
-	main.TOTAL_TC_PLANNED = len(self.testcases_list)*repeat
+        repeat= int(self.params['repeat']) if ('repeat' in self.params) else 1
+        self.TOTAL_TC_PLANNED = len(self.testcases_list)*repeat
         
         result = self.TRUE
-	while(repeat):
+        while(repeat):
             for self.CurrentTestCaseNumber in self.testcases_list:
-                result = self.runCase(self.CurrentTestCaseNumber) 
-	    repeat-=1                   
+                result = self.runCase(self.CurrentTestCaseNumber)
+            repeat-=1
         return result
     
     def runCase(self,testCaseNumber):
@@ -219,16 +218,16 @@
         stopped = False
         try :
             self.stepList = self.code[self.testCaseNumber].keys()
-        except KeyError,e:
-            main.log.error("There is no Test-Case "+ self.testCaseNumber)
-            return main.FALSE
+        except KeyError:
+            self.log.error("There is no Test-Case "+ self.testCaseNumber)
+            return self.FALSE
         
         self.stepCount = 0
         while self.stepCount < len(self.code[self.testCaseNumber].keys()):
             result = self.runStep(self.stepList,self.code,self.testCaseNumber)
-            if result == main.FALSE:
+            if result == self.FALSE:
                 break
-            elif result == main.TRUE :
+            elif result == self.TRUE:
                 continue
             
         if not stopped :
@@ -243,8 +242,11 @@
                 exec code[testCaseNumber][step] in module.__dict__
                 self.stepCount = self.stepCount + 1
             except TypeError,e:
+                print "Exception in the following section of code: Test Step " +\
+                      str(testCaseNumber) + "." + str(step) + " ):"
+                #print code[testCaseNumber][step]
                 self.stepCount = self.stepCount + 1
-                self.log.error(e)
+                self.log.exception(e)
             return main.TRUE
         
         if cli.stop:
@@ -258,8 +260,8 @@
         
     def addCaseHeader(self):
         caseHeader = "\n"+"*" * 30+"\n Result summary for Testcase"+str(self.CurrentTestCaseNumber)+"\n"+"*" * 30+"\n"
-        self.log.exact(caseHeader) 
-        caseHeader = "\n"+"*" * 40 +"\nStart of Test Case"+str(self.CurrentTestCaseNumber)+" : " 
+        self.log.exact(caseHeader)
+        caseHeader = "\n"+"*" * 40 +"\nStart of Test Case"+str(self.CurrentTestCaseNumber)+" : "
         for driver in self.componentDictionary.keys():
             vars(self)[driver+'log'].info(caseHeader)
     
@@ -282,28 +284,29 @@
         '''
         result = self.TRUE
         self.logger.testSummary(self)
-        
+
         #self.reportFile.close()
-        
+
 
         #utilities.send_mail()
         try :
             for component in self.componentDictionary.keys():
-                tempObject  = vars(self)[component]    
-                print "Disconnecting "+str(tempObject)
-         
+                tempObject  = vars(self)[component]
+                print "Disconnecting " + str(tempObject)
                 tempObject.disconnect()
-            #tempObject.execute(cmd="exit",prompt="(.*)",timeout=120) 
+            #tempObject.execute(cmd="exit",prompt="(.*)",timeout=120)
 
         except(Exception):
+            self.log.exception( "Exception while disconnecting from " +
+                                 str( component ) )
             #print " There is an error with closing hanldes"
             result = self.FALSE
         # Closing all the driver's session files
         for driver in self.componentDictionary.keys():
            vars(self)[driver].close_log_handles()
-           
+
         return result
-        
+
     def pause(self):
         '''
         This function will pause the test's execution, and will continue after user provide 'resume' command.
@@ -380,7 +383,7 @@
         if self.stepCount > 1 :
             stepHeader = "\n"+"-"*45+"\nEnd of Step "+previousStep+"\n"+"-"*45+"\n"
         
-        stepHeader += "\n"+"-"*45+"\nStart of Step"+stepName+"\n"+"-"*45+"\n" 
+        stepHeader += "\n"+"-"*45+"\nStart of Step"+stepName+"\n"+"-"*45+"\n"
         for driver in self.componentDictionary.keys():
             vars(self)[driver+'log'].info(stepHeader)
             
@@ -388,10 +391,10 @@
         '''
            Test's each test-case information will append to the logs.
         '''
-        self.CurrentTestCase = testCaseName 
+        self.CurrentTestCase = testCaseName
         testCaseName = " " + str(testCaseName) + ""
         self.log.case(testCaseName)
-        caseHeader = testCaseName+"\n"+"*" * 40+"\n" 
+        caseHeader = testCaseName+"\n"+"*" * 40+"\n"
         for driver in self.componentDictionary.keys():
             vars(self)[driver+'log'].info(caseHeader)
         
@@ -423,7 +426,7 @@
         ''' It will load the default response parser '''
         response_dict = {}
         response_dict = self.response_to_dict(response, return_format)
-        return_format_string = self.dict_to_return_format(response,return_format,response_dict)   
+        return_format_string = self.dict_to_return_format(response,return_format,response_dict)
         return return_format_string
     
     def response_to_dict(self,response,return_format):
@@ -433,8 +436,8 @@
         xml_match = re.search('^\s*\<', response)
         ini_match = re.search('^\s*\[', response)
         if json_match :
-            main.log.info(" Response is in 'JSON' format and Converting to '"+return_format+"' format")
-            # Formatting the json string 
+            self.log.info(" Response is in 'JSON' format and Converting to '"+return_format+"' format")
+            # Formatting the json string
             
             response = re.sub(r"{\s*'?(\w)", r'{"\1', response)
             response = re.sub(r",\s*'?(\w)", r',"\1', response)
@@ -444,27 +447,26 @@
             try :
                 import json
                 response_dict = json.loads(response)
-            except Exception , e :
-                print e
-                main.log.error("Json Parser is unable to parse the string")
+            except Exception, e:
+                self.log.exception( e )
+                self.log.error("Json Parser is unable to parse the string")
             return response_dict
         
         elif ini_match :
-            main.log.info(" Response is in 'INI' format and Converting to '"+return_format+"' format")
+            self.log.info(" Response is in 'INI' format and Converting to '"+return_format+"' format")
             from configobj import ConfigObj
             response_file = open("respnse_file.temp",'w')
             response_file.write(response)
-            response_file.close() 
+            response_file.close()
             response_dict = ConfigObj("respnse_file.temp")
             return response_dict
             
         elif xml_match :
-            main.log.info(" Response is in 'XML' format and Converting to '"+return_format+"' format")
+            self.log.info(" Response is in 'XML' format and Converting to '"+return_format+"' format")
             try :
-                from core import dicttoobject
                 response_dict = xmldict.xml_to_dict("<response> "+str(response)+" </response>")
             except Exception, e:
-                main.log.error(e)
+                self.log.exception( e )
             return response_dict
         
     def dict_to_return_format(self,response,return_format,response_dict):
@@ -485,14 +487,14 @@
                         table_data = table_data + get_table(temp_val)
                 else :
                     table_data = table_data + str(value_to_convert) +"\t"
-                return table_data 
+                return table_data
             
             for value in response_dict.values() :
                 response_table =  response_table + get_table(value)
                 
 
                 
-            #response_table = response_table + '\t'.join(response_dict.values())
+            # response_table = response_table + '\t'.join(response_dict.values())
                 
             return response_table
         
@@ -510,7 +512,6 @@
             
         elif return_format == 'xml':
             ''' Will return in xml format'''
-            from core import dicttoobject
             response_xml = xmldict.dict_to_xml(response_dict)
             response_xml = re.sub(">\s*<", ">\n<", response_xml)
             return "\n"+response_xml
@@ -537,7 +538,7 @@
     import pprint
     pp = pprint.PrettyPrinter(indent=4)
 
-    #pp.pprint(options)
+    # pp.pprint(options)
     verifyTest(options)
     verifyExample(options)
     verifyTestScript(options)
@@ -566,14 +567,14 @@
         main.classPath = "examples."+main.TEST+"."+main.TEST
                
 def verifyLogdir(options):
-    #Verifying Log directory option      
+    # Verifying Log directory option
     if options.logdir:
         main.logdir = options.logdir
     else :
-        main.logdir = main.FALSE  
+        main.logdir = main.FALSE
         
 def verifyMail(options):
-    # Checking the mailing list 
+    # Checking the mailing list
     if options.mail:
         main.mail = options.mail
     elif main.params.has_key('mail'):
@@ -582,10 +583,10 @@
         main.mail = 'paxweb@paxterrasolutions.com'
 
 def verifyTestCases(options):
-    #Getting Test cases list 
+    # Getting Test cases list
     if options.testcases:
-	testcases_list = options.testcases 
-        #sys.exit() 
+        testcases_list = options.testcases
+        # sys.exit()
         testcases_list = re.sub("(\[|\])", "", options.testcases)
         main.testcases_list = eval(testcases_list+",")
     else :
@@ -593,27 +594,27 @@
             temp = eval(main.params['testcases']+",")
             list1=[]
             if type(temp[0])==list:
-	        for test in temp:
-      	            for testcase in test:
-	                if type(testcase)==int:
-		            testcase=[testcase]
-	                list1.extend(testcase)
-	    else :
-	    	temp=list(temp)
-      	        for testcase in temp:
-	            if type(testcase)==int:
-		        testcase=[testcase]
-	            list1.extend(testcase)
-	    main.testcases_list=list1	                                     
+                for test in temp:
+                    for testcase in test:
+                        if type(testcase)==int:
+                            testcase=[testcase]
+                        list1.extend(testcase)
+            else :
+                temp=list(temp)
+                for testcase in temp:
+                    if type(testcase)==int:
+                        testcase=[testcase]
+                    list1.extend(testcase)
+            main.testcases_list=list1
         else :
             print "testcases not specifed in params, please provide in params file or 'testcases' commandline argument"
-            sys.exit() 
+            sys.exit()
                   
 def verifyTestScript(options):
     '''
     Verifyies test script.
     '''
-    main.openspeak = openspeak.OpenSpeak()        
+    main.openspeak = openspeak.OpenSpeak()
     openspeakfile = main.testDir+"/" + main.TEST + "/" + main.TEST + ".ospk"
     testfile = main.testDir+"/" + main.TEST + "/" + main.TEST + ".py"
     if os.path.exists(openspeakfile) :
@@ -629,20 +630,20 @@
         testModule = __import__(main.classPath, globals(), locals(), [main.TEST], -1)
     except(ImportError):
         print "There was an import error, it might mean that there is no test like "+main.TEST
-        main.exit()       
+        main.exit()
 
     testClass = getattr(testModule, main.TEST)
     main.testObject = testClass()
     load_parser()
-    main.params = main.parser.parseParams(main.classPath)    
-    main.topology = main.parser.parseTopology(main.classPath) 
+    main.params = main.parser.parseParams(main.classPath)
+    main.topology = main.parser.parseTopology(main.classPath)
     
 def verifyParams():
     try :
         main.params = main.params['PARAMS']
     except(KeyError):
         print "Error with the params file: Either the file not specified or the format is not correct"
-        main.exit()            
+        main.exit()
     
     try :
         main.topology = main.topology['TOPOLOGY']
@@ -681,9 +682,9 @@
                     main.exit()
             else :
                 print "No Such File Exists !!"+ confighash['config']['parser']['file'] +"using default parser"
-                load_defaultParser() 
-        elif confighash['config']['parser']['file'] == None or confighash['config']['parser']['class'] == None :  
-            load_defaultParser() 
+                load_defaultParser()
+        elif confighash['config']['parser']['file'] == None or confighash['config']['parser']['class'] == None :
+            load_defaultParser()
     else:
         load_defaultParser()
 
@@ -694,7 +695,7 @@
     moduleList = main.parserPath.split("/")
     newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
     try :
-        parsingClass = main.parsingClass 
+        parsingClass = main.parsingClass
         parsingModule = __import__(newModule, globals(), locals(), [parsingClass], -1)
         parsingClass = getattr(parsingModule, parsingClass)
         main.parser = parsingClass()
@@ -733,8 +734,8 @@
             else :
                 print "No Such File Exists !!"+confighash['config']['logger']['file']+ "Using default logger"
                 load_defaultlogger()
-        elif confighash['config']['parser']['file'] == None or confighash['config']['parser']['class'] == None :  
-            load_defaultlogger() 
+        elif confighash['config']['parser']['file'] == None or confighash['config']['parser']['class'] == None :
+            load_defaultlogger()
     else:
         load_defaultlogger()
 
@@ -745,14 +746,14 @@
     moduleList = main.loggerPath.split("/")
     newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
     try :
-        loggerClass = main.loggerClass 
+        loggerClass = main.loggerClass
         loggerModule = __import__(newModule, globals(), locals(), [loggerClass], -1)
         loggerClass = getattr(loggerModule, loggerClass)
         main.logger = loggerClass()
 
     except ImportError:
         print sys.exc_info()[1]
-        main.exit()    
+        main.exit()
 
 def load_defaultlogger():
     '''
@@ -761,7 +762,7 @@
     moduleList = main.loggerPath.split("/")
     newModule = ".".join([moduleList[len(moduleList) - 2],moduleList[len(moduleList) - 1]])
     try :
-        loggerClass = main.loggerClass 
+        loggerClass = main.loggerClass
         loggerModule = __import__(newModule, globals(), locals(), [loggerClass], -1)
         loggerClass = getattr(loggerModule, loggerClass)
         main.logger = loggerClass()
diff --git a/TestON/core/testparser.py b/TestON/core/testparser.py
index f158259..37f50f0 100644
--- a/TestON/core/testparser.py
+++ b/TestON/core/testparser.py
@@ -96,7 +96,7 @@
                 if step == 0 :
                     i = 0
                     block = ''
-                    while i <= index :
+                    while i < index :
                         block += caseStatements[i]
                         i = i + 1
                     stepCode[step] = block   
diff --git a/TestON/core/utilities.py b/TestON/core/utilities.py
index b6bed3e..671dba5 100644
--- a/TestON/core/utilities.py
+++ b/TestON/core/utilities.py
@@ -29,11 +29,9 @@
 '''
 import re
 from configobj import ConfigObj
-import pydoc
 from core import ast as ast
 import smtplib
 
-import mimetypes
 import email
 import os
 import email.mime.application
@@ -265,7 +263,7 @@
             try :
                 parsedInfo = ConfigObj(self.fileName)
                 return parsedInfo
-            except :
+            except Exception:
                 print "There is no such file to parse "+fileName 
         else:
             return 0   
diff --git a/TestON/core/xmldict.py b/TestON/core/xmldict.py
index 34e9cfc..f873014 100644
--- a/TestON/core/xmldict.py
+++ b/TestON/core/xmldict.py
@@ -37,7 +37,7 @@
         root = ElementTree.XML(root_or_str)
     try :
         return {root.tag: _from_xml(root, strict)}
-    except :
+    except Exception:
         return None
 
 def dict_to_xml(dict_xml):
diff --git a/TestON/core/xmlparser.py b/TestON/core/xmlparser.py
index 3cb4aee..a46750a 100644
--- a/TestON/core/xmlparser.py
+++ b/TestON/core/xmlparser.py
@@ -39,7 +39,7 @@
             try :
                 parsedInfo = xmldict.xml_to_dict(xml)
                 return parsedInfo
-            except :
+            except Exception:
                 print "There is no such file to parse " + fileName 
         else :
             print "file name is not correct"
diff --git a/TestON/dependencies/Jenkins_getresult_HA.py b/TestON/dependencies/Jenkins_getresult_HA.py
new file mode 100755
index 0000000..9cb3b8b
--- /dev/null
+++ b/TestON/dependencies/Jenkins_getresult_HA.py
@@ -0,0 +1,120 @@
+#!/usr/bin/env python
+
+import sys
+import os
+import re
+import datetime
+import time
+import argparse
+import shutil
+
+parser = argparse.ArgumentParser()
+parser.add_argument("-n", "--name", help="Comma Separated string of test names. Ex: --name='test1, test2, test3'")
+parser.add_argument("-w", "--workspace", help="The name of the Jenkin's job/workspace where csv files will be saved'")
+args = parser.parse_args()
+
+#Pass in test names as a comma separated string argument. 
+#Example: ./Jenkins_getresult.py "Test1,Test2,Test3,Test4"
+name_list = args.name.split(",")
+result_list = map(lambda x: x.strip(), name_list)
+job = args.workspace
+if job is None:
+    job = ""
+print job
+
+#NOTE: testnames list should be in order in which it is run
+testnames = result_list
+output = ''
+header = ''
+graphs = ''
+testdate = datetime.datetime.now()
+#workspace = "/var/lib/jenkins/workspace/ONOS-HA"
+workspace = "/var/lib/jenkins/workspace/"
+workspace = workspace + job
+
+header +="<p>**************************************</p>"
+header +=testdate.strftime('Jenkins test result for %H:%M on %b %d, %Y. %Z')
+
+
+#NOTE: CASE SPECIFIC THINGS
+
+#THIS LINE IS LOUSY FIXME
+if any("HA" in s for s in testnames):
+    ##Graphs
+    graphs += '<ac:structured-macro ac:name="html">\n'
+    graphs += '<ac:plain-text-body><![CDATA[\n'
+    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/getPlot?index=2&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
+    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/getPlot?index=1&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
+    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/getPlot?index=0&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
+    graphs += '<iframe src="https://onos-jenkins.onlab.us/job/'+job+'/plot/getPlot?index=3&width=500&height=300" noborder="0" width="500" height="300" scrolling="yes" seamless="seamless"></iframe>\n'
+    graphs += ']]></ac:plain-text-body>\n'
+    graphs += '</ac:structured-macro>\n'
+    header +="<p> <a href='https://wiki.onosproject.org/display/OST/Test+Plan+-+HA'>Test Plan for HA Test Cases</a></p>"
+
+
+# ***
+
+
+#TestON reporting
+for test in testnames:
+    passes = 0
+    fails = 0
+    name = os.popen("ls /home/admin/ONLabTest/TestON/logs/ -rt | grep %s_ | tail -1" % test).read().split()[0]
+    path = "/home/admin/ONLabTest/TestON/logs/" + name + "/"
+    try:
+        #IF exists, move the csv file to the workspace
+        shutil.copy(path + test + ".csv", workspace)
+    except IOError:
+        #File probably doesn't exist
+        pass
+
+    output +="<p></p>"
+    #output +="   Date: %s, %s %s" % (name.split("_")[2], name.split("_")[1], name.split("_")[3]) + "<p>*******************<p>"
+    #Open the latest log folder 
+    output += "<h2>Test "+str(test)+"</h2><p>************************************</p>"
+
+    f = open(path + name + ".rpt")
+
+    #Parse through each line of logs and look for specific strings to output to wiki.
+    #NOTE: with current implementation, you must specify which output to output to wiki by using
+    #main.log.report("") since it is looking for the [REPORT] tag in the logs
+    for line in f:
+        if re.search("Result summary for Testcase", line):
+            output += "<h3>"+str(line)+"</h3>"
+            #output += "<br>"
+        if re.search("\[REPORT\]", line): 
+            line_split = line.split("] ")
+            #line string is split by bracket, and first two items (log tags) in list are omitted from output
+            #join is used to convert list to string
+            line_str = ''.join(line_split[2:])
+            output += "<p>"
+            output += line_str
+            output += "</p>"
+        if re.search("Result:", line):
+            output += "<p>"
+            output += line
+            output += "</p>"
+            if re.search("Pass", line):
+                passes = passes + 1
+            elif re.search("Fail", line):
+                fails = fails + 1
+    f.close()
+    #https://wiki.onosproject.org/display/OST/Test+Results+-+HA#Test+Results+-+HA
+    #Example anchor on new wiki:        #TestResults-HA-TestHATestSanity
+    page_name = "Master-HA"
+    if "ONOS-HA-Maint" in job:
+        #NOTE if page name starts with number it prepends 'id-' to anchor links
+        page_name = "id-1.0-HA"
+
+    header += "<li><a href=\'#" + str(page_name) + "-Test" + str(test) + "\'> " + str(test) + " - Results: " + str(passes) + " Passed, " + str(fails) + " Failed</a></li>"
+
+    #*********************
+    #include any other phrase specific to case you would like to include in wiki here
+    if test == "IntentPerf":
+        output += "URL to Historical Performance results data: <a href='http://10.128.5.54perf.html'>Perf Graph</a>"
+    #*********************
+
+#header_file = open("/tmp/header_ha.txt",'w')
+#header_file.write(header)
+output = header + graphs + output
+print output
diff --git a/TestON/dependencies/onos.properties.proactive b/TestON/dependencies/onos.properties.proactive
deleted file mode 100644
index 2b5150a..0000000
--- a/TestON/dependencies/onos.properties.proactive
+++ /dev/null
@@ -1,16 +0,0 @@
-floodlight.modules = net.floodlightcontroller.core.FloodlightProvider,\
-net.floodlightcontroller.threadpool.ThreadPool,\
-net.onrc.onos.core.topology.TopologyPublisher, \
-net.onrc.onos.core.datagrid.HazelcastDatagrid,\
-net.onrc.onos.core.flowprogrammer.FlowProgrammer,\
-net.onrc.onos.core.intent.runtime.PathCalcRuntimeModule,\
-net.onrc.onos.core.intent.runtime.PlanInstallModule,\
-net.onrc.onos.core.registry.ZookeeperRegistry
-net.floodlightcontroller.restserver.RestApiServer.port = 8080
-net.floodlightcontroller.core.FloodlightProvider.openflowport = 6633
-net.floodlightcontroller.core.FloodlightProvider.workerthreads = 16
-net.floodlightcontroller.forwarding.Forwarding.idletimeout = 5
-net.floodlightcontroller.forwarding.Forwarding.hardtimeout = 0
-net.onrc.onos.core.datagrid.HazelcastDatagrid.datagridConfig = conf/hazelcast.xml
-net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher.dbconf = conf/ramcloud.conf
-net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher.graph_db_store = ramcloud
diff --git a/TestON/dependencies/onos.properties.reactive b/TestON/dependencies/onos.properties.reactive
deleted file mode 100644
index 8d78222..0000000
--- a/TestON/dependencies/onos.properties.reactive
+++ /dev/null
@@ -1,19 +0,0 @@
-floodlight.modules = net.floodlightcontroller.core.FloodlightProvider,\
-net.floodlightcontroller.threadpool.ThreadPool,\
-net.onrc.onos.core.topology.TopologyPublisher, \
-net.onrc.onos.core.datagrid.HazelcastDatagrid,\
-net.onrc.onos.core.flowprogrammer.FlowProgrammer,\
-net.onrc.onos.core.intent.runtime.PathCalcRuntimeModule,\
-net.onrc.onos.core.intent.runtime.PlanInstallModule,\
-net.onrc.onos.core.registry.ZookeeperRegistry,\
-net.onrc.onos.apps.proxyarp.ProxyArpManager,\
-net.onrc.onos.core.main.config.DefaultConfiguration,\
-net.onrc.onos.apps.forwarding.Forwarding
-net.floodlightcontroller.restserver.RestApiServer.port = 8080
-net.floodlightcontroller.core.FloodlightProvider.openflowport = 6633
-net.floodlightcontroller.core.FloodlightProvider.workerthreads = 16
-net.floodlightcontroller.forwarding.Forwarding.idletimeout = 5
-net.floodlightcontroller.forwarding.Forwarding.hardtimeout = 0
-net.onrc.onos.core.datagrid.HazelcastDatagrid.datagridConfig = conf/hazelcast.xml
-net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher.dbconf = conf/ramcloud.conf
-net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher.graph_db_store = ramcloud
diff --git a/TestON/dependencies/pyintents.py b/TestON/dependencies/pyintents.py
deleted file mode 100755
index b593845..0000000
--- a/TestON/dependencies/pyintents.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#! /usr/bin/env python
-'''
-This file creates the ONOS intents for the sanity 4 nodes tests. These intents will be translated into flows by ONOS and pushed to the switches.
-'''
-
-import json
-import requests
-
-url = 'http://127.0.0.1:8080/wm/onos/datagrid/add/intents/json'
-headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
-
-
-'''response
-[{'intent_id':'5','status':'CREATED','log':['created, time:73268214932534']}]
-'''
-
-
-
-for i in range(6,16):
-    #intent = [{'intent_id': '%d' %i,'intent_type':'shortest_intent_type','intent_op':'add','srcSwitch':'8249','srcPort':1,'srcMac':'00:00:00:00:00:01','dstSwitch':'4103','dstPort':1,'dstMac':'00:00:00:00:00:02'}]
-    srcMac = '00:00:00:00:00:'+ str(hex(i)[2:]).zfill(2)
-    dstMac = '00:00:00:00:00:'+ str(hex(i+10)[2:])
-    srcSwitch = '00:00:00:00:00:00:10:'+ str(i).zfill(2)
-    dstSwitch = '00:00:00:00:00:00:20:'+ str(i+25)
-    srcPort = 1 
-    dstPort = 1 
-
-    intent = [{'intent_id': '%d' %(i),'intent_type':'shortest_intent_type','intent_op':'add','srcSwitch':srcSwitch,'srcPort':srcPort,'srcMac':srcMac,'dstSwitch':dstSwitch,'dstPort':dstPort,'dstMac':dstMac}]
-
-
-    print json.dumps(intent, sort_keys = True)
-
-
-    #r = requests.post(url, data=json.dumps(iid, sort_keys=True)+json.dumps(intent, sort_keys=True), headers = headers)
-    r = requests.post(url, data=json.dumps(intent, sort_keys=True), headers = headers)
-    print r
-    print r.content
-
-
-
-    intent = [{'intent_id': '%d' %(i+10),'intent_type':'shortest_intent_type','intent_op':'add','srcSwitch':dstSwitch,'srcPort':dstPort,'srcMac':dstMac,'dstSwitch':srcSwitch,'dstPort':srcPort,'dstMac':srcMac}]
-    print json.dumps(intent, sort_keys = True)
-    r = requests.post(url, data=json.dumps(intent, sort_keys=True), headers = headers)
-    print r
-    print r.content
-
diff --git a/TestON/dependencies/rmpyintents.py b/TestON/dependencies/rmpyintents.py
deleted file mode 100755
index 10bb5d4..0000000
--- a/TestON/dependencies/rmpyintents.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#! /usr/bin/env python
-
-'''
-This file removes the ONOS intents for the sanity 4 nodes tests. The flows associated with these intents should be deleted from the switches.
-'''
-
-import json
-import requests
-
-
-
-url = 'http://127.0.0.1:8080/wm/onos/datagrid/add/intents/json'
-headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
-
-
-'''response
-[{'intent_id':'5','status':'CREATED','log':['created, time:73268214932534']}]
-'''
-
-
-
-for i in range(6,16):
-    #intent = [{'intent_id': '%d' %i,'intent_type':'shortest_intent_type','intent_op':'remove','srcSwitch':'8249','srcPort':1,'srcMac':'00:00:00:00:00:01','dstSwitch':'4103','dstPort':1,'dstMac':'00:00:00:00:00:02'}]
-    srcMac = '00:00:00:00:00:'+ str(hex(i)[2:]).zfill(2)
-    dstMac = '00:00:00:00:00:'+ str(hex(i+10)[2:])
-    srcSwitch = '00:00:00:00:00:00:10:'+ str(i).zfill(2)
-    dstSwitch = '00:00:00:00:00:00:20:'+ str(i+25)
-    srcPort = 1 
-    dstPort = 1 
-
-    intent = [{'intent_id': '%d' %(i),'intent_type':'shortest_intent_type','intent_op':'remove','srcSwitch':srcSwitch,'srcPort':srcPort,'srcMac':srcMac,'dstSwitch':dstSwitch,'dstPort':dstPort,'dstMac':dstMac}]
-
-
-    print json.dumps(intent, sort_keys = True)
-
-
-    #r = requests.post(url, data=json.dumps(iid, sort_keys=True)+json.dumps(intent, sort_keys=True), headers = headers)
-    r = requests.post(url, data=json.dumps(intent, sort_keys=True), headers = headers)
-    print r
-    print r.content
-
-
-
-    intent = [{'intent_id': '%d' %(i+10),'intent_type':'shortest_intent_type','intent_op':'remove','srcSwitch':dstSwitch,'srcPort':dstPort,'srcMac':dstMac,'dstSwitch':srcSwitch,'dstPort':srcPort,'dstMac':srcMac}]
-    print json.dumps(intent, sort_keys = True)
-    r = requests.post(url, data=json.dumps(intent, sort_keys=True), headers = headers)
-    print r
-    print r.content
-
diff --git a/TestON/dependencies/rotate.sh b/TestON/dependencies/rotate.sh
index 0f879b6..42fec2d 100755
--- a/TestON/dependencies/rotate.sh
+++ b/TestON/dependencies/rotate.sh
@@ -51,4 +51,4 @@
 #Maybe this should be an argument? pack-and-rotate supports that
 nr_max=20
 
-pack-rotate-log ${root_dir}'/'${base_name} "${root_dir}/${base_name}*.pcap ${root_dir}/${base_name}*.log" ${nr_max}
+pack-rotate-log ${root_dir}'/'${base_name} "${root_dir}/${base_name}*.pcap ${root_dir}/${base_name}*.log*" ${nr_max}
diff --git a/TestON/dependencies/topo-HA.py b/TestON/dependencies/topo-HA.py
new file mode 100644
index 0000000..65613d6
--- /dev/null
+++ b/TestON/dependencies/topo-HA.py
@@ -0,0 +1,63 @@
+from mininet.topo import Topo
+class MyTopo( Topo ):
+    def __init__( self ):
+        Topo.__init__( self )
+        topSwitch = self.addSwitch('s1',dpid='1000'.zfill(16))
+        leftTopSwitch = self.addSwitch('s2',dpid='2000'.zfill(16))
+        rightTopSwitch = self.addSwitch('s5',dpid='5000'.zfill(16))
+        leftBotSwitch = self.addSwitch('s3',dpid='3000'.zfill(16))
+        rightBotSwitch = self.addSwitch('s6',dpid='6000'.zfill(16))	
+        midBotSwitch = self.addSwitch('s28',dpid='2800'.zfill(16))
+        
+        topHost = self.addHost( 'h1' )
+        leftTopHost = self.addHost('h2')
+        rightTopHost = self.addHost('h5')
+        leftBotHost = self.addHost('h3')
+        rightBotHost = self.addHost('h6')
+        midBotHost = self.addHost('h28')
+        self.addLink(topSwitch,topHost)
+        self.addLink(leftTopSwitch,leftTopHost)
+        self.addLink(rightTopSwitch,rightTopHost)
+        self.addLink(leftBotSwitch,leftBotHost)
+        self.addLink(rightBotSwitch,rightBotHost)
+        self.addLink(midBotSwitch,midBotHost)
+        self.addLink(leftTopSwitch,rightTopSwitch)
+        self.addLink(topSwitch,leftTopSwitch)
+        self.addLink(topSwitch,rightTopSwitch)
+        self.addLink(leftTopSwitch,leftBotSwitch)
+        self.addLink(rightTopSwitch,rightBotSwitch)
+        self.addLink(leftBotSwitch,midBotSwitch)
+        self.addLink(midBotSwitch,rightBotSwitch)
+
+        agg1Switch = self.addSwitch('s4',dpid = '3004'.zfill(16))
+        agg2Switch = self.addSwitch('s7',dpid = '6007'.zfill(16))
+        agg1Host = self.addHost('h4')
+        agg2Host = self.addHost('h7')
+        self.addLink(agg1Switch,agg1Host)
+        self.addLink(agg2Switch,agg2Host)
+        self.addLink(agg1Switch, leftBotSwitch)
+        self.addLink(agg2Switch, rightBotSwitch)
+
+        for i in range(10):
+            num = str(i+8)
+            switch = self.addSwitch('s'+num,dpid = ('30'+num.zfill(2)).zfill(16))
+            host = self.addHost('h'+num)
+            self.addLink(switch, host)
+            self.addLink(switch, agg1Switch)
+
+        for i in range(10):
+            num = str(i+18)
+            switch = self.addSwitch('s'+num,dpid = ('60'+num.zfill(2)).zfill(16))
+            host = self.addHost('h'+num)
+            self.addLink(switch, host)
+            self.addLink(switch, agg2Switch)
+
+topos = { 'mytopo': (lambda: MyTopo() ) }
+
+
+
+
+
+
+
+
diff --git a/TestON/drivers/common/cli/.onosclidriver.py.swo b/TestON/drivers/common/cli/.onosclidriver.py.swo
deleted file mode 100644
index 87ea889..0000000
--- a/TestON/drivers/common/cli/.onosclidriver.py.swo
+++ /dev/null
Binary files differ
diff --git a/TestON/drivers/common/cli/dpclidriver.py b/TestON/drivers/common/cli/dpclidriver.py
index 057a3f1..81743d3 100644
--- a/TestON/drivers/common/cli/dpclidriver.py
+++ b/TestON/drivers/common/cli/dpclidriver.py
@@ -1,16 +1,8 @@
 """
 Driver for blank dataplane VMs. Created for SDNIP test.
 """
-import time
 import pexpect
-import struct
-import fcntl
-import os
 import sys
-import signal
-import sys
-import re
-import json
 sys.path.append( "../" )
 from drivers.common.clidriver import CLI
 
@@ -26,9 +18,9 @@
 
         self.name = self.options[ 'name' ]
         self.handle = super( DPCliDriver, self ).connect( user_name=self.user_name,
-         		ip_address=self.ip_address,
-         		port=self.port,
-         		pwd=self.pwd )
+                        ip_address=self.ip_address,
+                        port=self.port,
+                        pwd=self.pwd )
 
         if self.handle:
             return self.handle
@@ -38,11 +30,17 @@
 
     def create_interfaces( self, net, number, start ):
         """
-        Creates a number,specified by 'number,' of subinterfaces on eth0. Ip addresses start at 'net'.'start'.1.1 with a 24 bit netmask. Addresses increment sequentially in the third quad,
-        therefore all interfaces are in different subnets on the same machine. When the third quad reaches 255, it is reset to 1 and the second quad is incremented.
-        Every single ip address is placed in a file in /tmp titled 'ip_table{net}.txt'
-        The file is used by 'pingall_interfaces()' as a fping argument
-        This method returns true if all interfaces are created without a hitch, and false if a single interface has issues
+        Creates a number,specified by 'number,' of subinterfaces on eth0.
+        Ip addresses start at 'net'.'start'.1.1 with a 24 bit netmask.
+        Addresses increment sequentially in the third quad, therefore all
+        interfaces are in different subnets on the same machine. When the
+        third quad reaches 255, it is reset to 1 and the second quad is
+        incremented. Every single ip address is placed in a file in /tmp
+        titled 'ip_table{net}.txt'. The file is used by 'pingall_interfaces()'
+        as a fping argument
+
+        This method returns true if all interfaces are created without a hitch,
+        and false if a single interface has issues
         """
         self.handle.sendline( "" )
         self.handle.expect( "\$" )
@@ -68,11 +66,11 @@
                     intf ) + " " + ip + " netmask 255.255.255.0" )
 
             i = self.handle.expect( [
-				    "\$",
+                                    "\$",
                                     "password",
                                     pexpect.TIMEOUT,
                                     pexpect.EOF ],
-                		    timeout=120 )
+                                    timeout=120 )
 
             if i == 0:
                 self.handle.sendline(
@@ -88,22 +86,27 @@
 
     def pingall_interfaces( self, netsrc, netstrt, netdst, destlogin, destip ):
         """
-        Copies the /tmp/ip_table{ net }.txt file from the machine you wish to ping, then runs fping with a source address of { netsrc }.{ netstrt }.1.1 on the copied file.
-        Check every single response for reachable or unreachable. If all are reachable, function returns true. If a SINGLE host is unreachable, then the function stops and returns false
-        If fping is not installed, this function will install fping then run the same command
+        Copies the /tmp/ip_table{ net }.txt file from the machine you wish to
+        ping, then runs fping with a source address of
+        { netsrc }.{ netstrt }.1.1 on the copied file.
+        Check every single response for reachable or unreachable. If all are
+        reachable, function returns true. If a SINGLE host is unreachable,
+        then the function stops and returns false. If fping is not installed,
+        this function will install fping then run the same command
         """
         self.handle.sendline( "" )
         self.handle.expect( "\$" )
 
-        self.handle.sendline( "scp " + str( destlogin ) + "@" + 
-			      str( destip ) + ":/tmp/local_ip.txt /tmp/ip_table" +
-			      str( net ) + ".txt" )
-        
-	i = self.handle.expect( [
-				"100%",
+        self.handle.sendline( "scp " + str( destlogin ) + "@" +
+                              str( destip ) +
+                              ":/tmp/local_ip.txt /tmp/ip_table" +
+                              str( netsrc ) + ".txt" )
+
+        i = self.handle.expect( [
+                                "100%",
                                 "password",
                                 pexpect.TIMEOUT ],
-		                timeout=30 )
+                                timeout=30 )
 
         if i == 0:
             main.log.info( "Copied ping file successfully" )
@@ -120,20 +123,20 @@
         self.handle.expect( "\$" )
 
         main.log.info( "Pinging interfaces on the " + str( netdst ) +
-		       " network from " + str( netsrc ) + "." + 
-		       str( netstrt ) + ".1.1" )
+                       " network from " + str( netsrc ) + "." +
+                       str( netstrt ) + ".1.1" )
         self.handle.sendline( "sudo fping -S " + str( netsrc ) + "." +
-			      str( netstrt ) + ".1.1 -f /tmp/ip_table" + 
-			      str( netdst ) + ".txt" )
+                              str( netstrt ) + ".1.1 -f /tmp/ip_table" +
+                              str( netdst ) + ".txt" )
         while 1:
             i = self.handle.expect( [
-				    "reachable",
+                                    "reachable",
                                     "unreachable",
                                     "\$",
                                     "password",
                                     pexpect.TIMEOUT,
                                     "not installed" ],
-				    timeout=45 )
+                                    timeout=45 )
             if i == 0:
                 result = main.TRUE
             elif i == 1:
@@ -142,6 +145,7 @@
                 return result
             elif i == 2:
                 main.log.info( "All interfaces reachable" )
+                result = main.FALSE
                 return result
             elif i == 3:
                 self.handle.sendline( self.pwd )
@@ -152,11 +156,10 @@
             elif i == 5:
                 main.log.info( "fping not installed, installing fping" )
                 self.handle.sendline( "sudo apt-get install fping" )
-                i = self.handle.expect(
-                    [ "password",
-                                      "\$",
-                                      pexpect.TIMEOUT ],
-                    timeout=60 )
+                i = self.handle.expect( [ "password",
+                                          "\$",
+                                          pexpect.TIMEOUT ],
+                                        timeout=60 )
                 if i == 0:
                     self.handle.sendline( self.pwd )
                     self.handle.expect( "\$", timeout=30 )
@@ -183,8 +186,8 @@
         try:
             self.handle.sendline( "exit" )
             self.handle.expect( "closed" )
-        except:
-            main.log.error( "Connection failed to the host" )
+        except pexpect.ExceptionPexpect:
+            main.log.exception( "Connection failed to the host" )
             response = main.FALSE
         return response
 
diff --git a/TestON/drivers/common/cli/emulator/flowvisordriver.py b/TestON/drivers/common/cli/emulator/flowvisordriver.py
index d0e6ea5..46c47a7 100644
--- a/TestON/drivers/common/cli/emulator/flowvisordriver.py
+++ b/TestON/drivers/common/cli/emulator/flowvisordriver.py
@@ -21,17 +21,10 @@
 
 FlowVisorDriver is the basic driver which will handle the Mininet functions
 """
-import pexpect
-import struct
-import fcntl
-import os
-import signal
 import re
 import sys
-import core.teston
 sys.path.append( "../" )
 from drivers.common.cli.emulatordriver import Emulator
-from drivers.common.clidriver import CLI
 
 
 class FlowVisorDriver( Emulator ):
@@ -147,15 +140,15 @@
         try :
             if self.dl_src and self.nw_dst:
                 flowspace = "any 100 dl_type=0x806,dl_src="+self.dl_src+",nw_dst="+self.nw_dst+" Slice:"+self.Slice+"=4"
-        except :
+        except Exception:
             try :
                 if self.nw_src and self.tp_dst:
                     flowspace = "any 100 dl_type=0x800,nw_proto=6,nw_src="+self.nw_src+",tp_dst="+self.tp_dst+" Slice:"+self.Slice+"=4"
-            except :
+            except Exception:
                 try :
                     if self.nw_src and self.tp_src:
                         flowspace = "any 100 dl_type=0x800,nw_proto=6,nw_src="+self.nw_src+",tp_src="+self.tp_dst+" Slice:"+self.Slice+"=4"
-                except :
+                except Exception:
                     main.log.error( "Please specify flowspace properly" )
         """
         # self.execute( cmd="clear",prompt="\$",timeout=10 )
diff --git a/TestON/drivers/common/cli/emulator/lincoedriver.py b/TestON/drivers/common/cli/emulator/lincoedriver.py
index d275df0..b1bc05a 100644
--- a/TestON/drivers/common/cli/emulator/lincoedriver.py
+++ b/TestON/drivers/common/cli/emulator/lincoedriver.py
@@ -14,20 +14,11 @@
 
 OCT 20 2014
 """
-import traceback
+
 import pexpect
-import struct
-import fcntl
-import os
-import signal
-import re
 import sys
-import core.teston
-import time
 sys.path.append( "../" )
-from math import pow
 from drivers.common.cli.emulatordriver import Emulator
-from drivers.common.clidriver import CLI
 
 
 class LincOEDriver( Emulator ):
@@ -45,7 +36,6 @@
         """
         Create ssh handle for Linc-OE cli
         """
-        import time
 
         for key in connectargs:
             vars( self )[ key ] = connectargs[ key ]
@@ -53,8 +43,8 @@
         self.name = self.options[ 'name' ]
         self.handle = \
             super( LincOEDriver, self ).connect(
-                userName=self.userName,
-                ipAddress=self.ipAddress,
+                user_name=self.user_name,
+                ip_address=self.ip_address,
                 port=None,
                 pwd=self.pwd )
 
@@ -73,7 +63,7 @@
         else:
             main.log.error( self.name +
                             ": Connection failed to the host " +
-                            self.userName + "@" + self.ipAddress )
+                            self.user_name + "@" + self.ip_address )
             main.log.error( self.name +
                             ": Failed to connect to Linc-OE" )
             return main.FALSE
@@ -94,9 +84,9 @@
             main.log.error(
                 self.name +
                 ": Connection failed to the host " +
-                self.userName +
+                self.user_name +
                 "@" +
-                self.ipAddress )
+                self.ip_address )
             main.log.error( self.name +
                             ": Failed to connect to Linc-OE" )
             return main.FALSE
@@ -127,10 +117,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " :::::::" )
-            main.log.error( traceback.printExc() )
-            main.log.info( self.name + " :::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -153,10 +141,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " :::::::" )
-            main.log.error( traceback.printExc() )
-            main.log.info( self.name + " :::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -175,10 +161,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " :::::::" )
-            main.log.error( traceback.printExc() )
-            main.log.info( self.name + " :::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -197,10 +181,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " :::::::" )
-            main.log.error( traceback.printExc() )
-            main.log.info( self.name + " :::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -220,10 +202,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " :::::::" )
-            main.log.error( traceback.printExc() )
-            main.log.info( self.name + " :::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -242,10 +222,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " :::::::" )
-            main.log.error( traceback.printExc() )
-            main.log.info( self.name + " :::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -265,10 +243,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " :::::::" )
-            main.log.error( traceback.printExc() )
-            main.log.info( self.name + " :::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -288,10 +264,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " :::::::" )
-            main.log.error( traceback.printExc() )
-            main.log.info( self.name + " :::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -329,16 +303,18 @@
             cmd = "sudo kill -9 `pgrep -f linc`"
             self.handle.sendline( cmd )
             self.handle.expect( "\$" )
-
+            # Close the ssh connection
+            self.handle.sendline( "" )
+            self.handle.expect( "\$" )
+            self.handle.sendline( "exit" )
+            self.handle.expect( "closed" )
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " :::::::" )
-            main.log.error( traceback.printExc() )
-            main.log.info( self.name + " :::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
diff --git a/TestON/drivers/common/cli/emulator/mininetclidriver.py b/TestON/drivers/common/cli/emulator/mininetclidriver.py
index 41d65a6..dc9de05 100644
--- a/TestON/drivers/common/cli/emulator/mininetclidriver.py
+++ b/TestON/drivers/common/cli/emulator/mininetclidriver.py
@@ -35,7 +35,6 @@
 
     Note that you may need to run 'sudo make develop' if your mnexec.c file
 changed when switching branches."""
-import traceback
 import pexpect
 import re
 import sys
@@ -52,6 +51,7 @@
     def __init__( self ):
         super( Emulator, self ).__init__()
         self.handle = self
+        self.name = None
         self.wrapped = sys.modules[ __name__ ]
         self.flag = 0
 
@@ -59,20 +59,49 @@
         """
            Here the main is the TestON instance after creating
            all the log handles."""
-        for key in connectargs:
-            vars( self )[ key ] = connectargs[ key ]
+        try:
+            for key in connectargs:
+                vars( self )[ key ] = connectargs[ key ]
 
-        self.name = self.options[ 'name' ]
-        self.handle = super(
-            MininetCliDriver,
-            self ).connect(
-            userName=self.userName,
-            ipAddress=self.ipAddress,
-            port=None,
-            pwd=self.pwd )
+            self.name = self.options[ 'name' ]
+            self.handle = super(
+                MininetCliDriver,
+                self ).connect(
+                user_name=self.user_name,
+                ip_address=self.ip_address,
+                port=None,
+                pwd=self.pwd )
 
-        self.sshHandle = self.handle
+            if self.handle:
+                main.log.info( "Connection successful to the host " +
+                               self.user_name +
+                               "@" +
+                               self.ip_address )
+                return main.TRUE
+            else:
+                main.log.error( "Connection failed to the host " +
+                                self.user_name +
+                                "@" +
+                                self.ip_address )
+                main.log.error( "Failed to connect to the Mininet CLI" )
+                return main.FALSE
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":     " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
 
+    def startNet( self, topoFile='', args='', timeout=120 ):
+        """
+        Starts Mininet accepts a topology(.py) file and/or an optional
+        argument ,to start the mininet, as a parameter.
+        Returns main.TRUE if the mininet starts successfully and
+                main.FALSE otherwise
+        """
         if self.handle:
             main.log.info(
                 self.name +
@@ -82,15 +111,15 @@
                                       'Cleanup\scomplete',
                                       pexpect.EOF,
                                       pexpect.TIMEOUT ],
-                                    120 )
+                                    timeout )
             if i == 0:
                 main.log.info( self.name + ": Sending sudo password" )
                 self.handle.sendline( self.pwd )
-                i = self.handle.expect( [ '%s:' % ( self.user ),
+                i = self.handle.expect( [ '%s:' % self.user,
                                           '\$',
                                           pexpect.EOF,
                                           pexpect.TIMEOUT ],
-                                        120 )
+                                        timeout )
             if i == 1:
                 main.log.info( self.name + ": Clean" )
             elif i == 2:
@@ -99,58 +128,83 @@
                 main.log.error(
                     self.name +
                     ": Something while cleaning MN took too long... " )
+            if topoFile == '' and args == '':
+                main.log.info( self.name + ": building fresh mininet" )
+                # for reactive/PARP enabled tests
+                cmdString = "sudo mn " + self.options[ 'arg1' ] +\
+                    " " + self.options[ 'arg2' ] +\
+                    " --mac --controller " +\
+                    self.options[ 'controller' ] + " " +\
+                    self.options[ 'arg3' ]
 
-            main.log.info( self.name + ": building fresh mininet" )
-            # for reactive/PARP enabled tests
-            cmdString = "sudo mn " + self.options[ 'arg1' ] +\
-                " " + self.options[ 'arg2' ] +\
-                " --mac --controller " +\
-                self.options[ 'controller' ] + " " +\
-                self.options[ 'arg3' ]
+                argList = self.options[ 'arg1' ].split( "," )
+                global topoArgList
+                topoArgList = argList[ 0 ].split( " " )
+                argList = map( int, argList[ 1: ] )
+                topoArgList = topoArgList[ 1: ] + argList
 
-            argList = self.options[ 'arg1' ].split( "," )
-            global topoArgList
-            topoArgList = argList[ 0 ].split( " " )
-            argList = map( int, argList[ 1: ] )
-            topoArgList = topoArgList[ 1: ] + argList
-
-            self.handle.sendline( cmdString )
-            self.handle.expect( [ "sudo mn", pexpect.EOF, pexpect.TIMEOUT ] )
-            while True:
+                self.handle.sendline( cmdString )
+                self.handle.expect( [ "sudo mn",
+                                    pexpect.EOF,
+                                    pexpect.TIMEOUT ] )
+                while True:
+                    i = self.handle.expect( [ 'mininet>',
+                                              '\*\*\*',
+                                              'Exception',
+                                              pexpect.EOF,
+                                              pexpect.TIMEOUT ],
+                                            timeout )
+                    if i == 0:
+                        main.log.info( self.name + ": mininet built" )
+                        return main.TRUE
+                    if i == 1:
+                        self.handle.expect(
+                            [ "\n", pexpect.EOF, pexpect.TIMEOUT ] )
+                        main.log.info( self.handle.before )
+                    elif i == 2:
+                        main.log.error(
+                            self.name +
+                            ": Launching mininet failed..." )
+                        return main.FALSE
+                    elif i == 3:
+                        main.log.error( self.name + ": Connection timeout" )
+                        return main.FALSE
+                    elif i == 4:  # timeout
+                        main.log.error(
+                            self.name +
+                            ": Something took too long... " )
+                        return main.FALSE
+                return main.TRUE
+            else:
+                main.log.info( "Starting topo file " + topoFile )
+                if args is None:
+                    args = ''
+                else:
+                    main.log.info( "args = " + args)
+                self.handle.sendline( 'sudo ' + topoFile + ' ' + args)
                 i = self.handle.expect( [ 'mininet>',
-                                          '\*\*\*',
-                                          'Exception',
                                           pexpect.EOF,
                                           pexpect.TIMEOUT ],
-                                        300 )
+                                        timeout)
                 if i == 0:
-                    main.log.info( self.name + ": mininet built" )
+                    main.log.info(self.name + ": Network started")
                     return main.TRUE
-                if i == 1:
-                    self.handle.expect(
-                        [ "\n", pexpect.EOF, pexpect.TIMEOUT ] )
-                    main.log.info( self.handle.before )
-                elif i == 2:
-                    main.log.error(
-                        self.name +
-                        ": Launching mininet failed..." )
-                    return main.FALSE
-                elif i == 3:
+                elif i == 1:
                     main.log.error( self.name + ": Connection timeout" )
                     return main.FALSE
-                elif i == 4:  # timeout
+                elif i == 2:  # timeout
                     main.log.error(
                         self.name +
                         ": Something took too long... " )
                     return main.FALSE
-            return main.TRUE
+                return main.TRUE
         else:  # if no handle
             main.log.error(
                 self.name +
                 ": Connection failed to the host " +
-                self.userName +
+                self.user_name +
                 "@" +
-                self.ipAddress )
+                self.ip_address )
             main.log.error( self.name + ": Failed to connect to the Mininet" )
             return main.FALSE
 
@@ -186,10 +240,8 @@
             numLinks = totalNumHosts + ( numSwitches - 1 )
             print "num_switches for %s(%d,%d) = %d and links=%d" %\
                 ( topoType, depth, fanout, numSwitches, numLinks )
-        topoDict = {}
-        topoDict = {
-            "num_switches": int( numSwitches ),
-            "num_corelinks": int( numLinks ) }
+        topoDict = { "num_switches": int( numSwitches ),
+                     "num_corelinks": int( numLinks ) }
         return topoDict
 
     def calculateSwAndLinks( self ):
@@ -339,6 +391,7 @@
             main.log.error( self.name + ": Connection failed to the host" )
 
     def verifySSH( self, **connectargs ):
+        # FIXME: Who uses this and what is the purpose? seems very specific
         try:
             response = self.execute(
                 cmd="h1 /usr/sbin/sshd -D&",
@@ -367,6 +420,99 @@
         else:
             return main.TRUE
 
+    def moveHost( self, host, oldSw, newSw, ):
+        """
+           Moves a host from one switch to another on the fly
+           Note: The intf between host and oldSw when detached
+                using detach(), will still show up in the 'net'
+                cmd, because switch.detach() doesn't affect switch.intfs[]
+                (which is correct behavior since the interfaces 
+                haven't moved).
+        """
+        if self.handle:
+            try:
+                # Bring link between oldSw-host down
+                cmd = "py net.configLinkStatus('" + oldSw + "'," + "'"+ host +\
+                      "'," + "'down')"
+                print "cmd1= ", cmd
+                response = self.execute( cmd=cmd,
+                                         prompt="mininet>",
+                                         timeout=10 )
+     
+                # Determine hostintf and Oldswitchintf
+                cmd = "px hintf,sintf = " + host + ".connectionsTo(" + oldSw +\
+                      ")[0]"
+                print "cmd2= ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+
+                # Determine ip and mac address of the host-oldSw interface
+                cmd = "px ipaddr = hintf.IP()"
+                print "cmd3= ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+
+                cmd = "px macaddr = hintf.MAC()"
+                print "cmd3= ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+                
+                # Detach interface between oldSw-host
+                cmd = "px " + oldSw + ".detach( sintf )"
+                print "cmd4= ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+
+                # Add link between host-newSw
+                cmd = "py net.addLink(" + host + "," + newSw + ")"
+                print "cmd5= ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+ 
+                # Determine hostintf and Newswitchintf
+                cmd = "px hintf,sintf = " + host + ".connectionsTo(" + newSw +\
+                      ")[0]"
+                print "cmd6= ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )                 
+
+                # Attach interface between newSw-host
+                cmd = "px " + newSw + ".attach( sintf )"
+                print "cmd3= ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+                
+                # Set ipaddress of the host-newSw interface
+                cmd = "px " + host + ".setIP( ip = ipaddr, intf = hintf)"
+                print "cmd7 = ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+
+                # Set macaddress of the host-newSw interface
+                cmd = "px " + host + ".setMAC( mac = macaddr, intf = hintf)"
+                print "cmd8 = ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+                
+                cmd = "net"
+                print "cmd9 = ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+                print "output = ", self.handle.before
+
+                # Determine ipaddress of the host-newSw interface
+                cmd = host + " ifconfig"
+                print "cmd10= ", cmd
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+                print "ifconfig o/p = ", self.handle.before
+                
+                return main.TRUE
+            except pexpect.EOF:
+                main.log.error( self.name + ": EOF exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
+                return main.FALSE
+
     def changeIP( self, host, intf, newIP, newNetmask ):
         """
            Changes the ip address of a host on the fly
@@ -414,7 +560,7 @@
 
     def addStaticMACAddress( self, host, GW, macaddr ):
         """
-           Changes the mac address of a geateway host"""
+           Changes the mac address of a gateway host"""
         if self.handle:
             try:
                 # h1  arp -s 10.0.1.254 00:00:00:00:11:11
@@ -424,7 +570,7 @@
                 response = self.handle.before
                 main.log.info( "response = " + response )
                 main.log.info(
-                    "Mac adrress of gateway " +
+                    "Mac address of gateway " +
                     GW +
                     " changed to " +
                     macaddr )
@@ -653,7 +799,7 @@
             self.handle.expect( "mininet>" )
             response = self.handle.before
             if re.search( 'Results:', response ):
-                main.log.info( self.name + ": iperf test succssful" )
+                main.log.info( self.name + ": iperf test successful" )
                 return main.TRUE
             else:
                 main.log.error( self.name + ": iperf test failed" )
@@ -805,6 +951,8 @@
         return main.TRUE
 
     def getVersion( self ):
+        #FIXME: What uses this? This should be refactored to get
+        #       version from MN and not some other file
         fileInput = path + '/lib/Mininet/INSTALL'
         version = super( Mininet, self ).getVersion()
         pattern = 'Mininet\s\w\.\w\.\w\w*'
@@ -880,10 +1028,8 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + ":" * 50 )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":" * 50 )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -911,10 +1057,10 @@
             dynamic_topo branch
         NOTE: cannot currently specify what type of switch
         required params:
-            switchname = name of the new switch as a string
-        optional keyvalues:
+            sw = name of the new switch as a string
+        optional keywords:
             dpid = "dpid"
-        returns: main.FASLE on an error, else main.TRUE
+        returns: main.FALSE on an error, else main.TRUE
         """
         dpid = kwargs.get( 'dpid', '' )
         command = "addswitch " + str( sw ) + " " + str( dpid )
@@ -946,8 +1092,8 @@
         NOTE: This uses a custom mn function. MN repo should be on
             dynamic_topo branch
         required params:
-            switchname = name of the switch as a string
-        returns: main.FASLE on an error, else main.TRUE"""
+            sw = name of the switch as a string
+        returns: main.FALSE on an error, else main.TRUE"""
         command = "delswitch " + str( sw )
         try:
             response = self.execute(
@@ -980,7 +1126,7 @@
            required params:
            node1 = the string node name of the first endpoint of the link
            node2 = the string node name of the second endpoint of the link
-           returns: main.FASLE on an error, else main.TRUE"""
+           returns: main.FALSE on an error, else main.TRUE"""
         command = "addlink " + str( node1 ) + " " + str( node2 )
         try:
             response = self.execute(
@@ -1012,7 +1158,7 @@
            required params:
            node1 = the string node name of the first endpoint of the link
            node2 = the string node name of the second endpoint of the link
-           returns: main.FASLE on an error, else main.TRUE"""
+           returns: main.FALSE on an error, else main.TRUE"""
         command = "dellink " + str( node1 ) + " " + str( node2 )
         try:
             response = self.execute(
@@ -1046,7 +1192,7 @@
             hostname = the string hostname
         optional key-value params
             switch = "switch name"
-            returns: main.FASLE on an error, else main.TRUE
+            returns: main.FALSE on an error, else main.TRUE
         """
         switch = kwargs.get( 'switch', '' )
         command = "addhost " + str( hostname ) + " " + str( switch )
@@ -1083,7 +1229,7 @@
            NOTE: this uses a custom mn function
            required params:
            hostname = the string hostname
-           returns: main.FASLE on an error, else main.TRUE"""
+           returns: main.FALSE on an error, else main.TRUE"""
         command = "delhost " + str( hostname )
         try:
             response = self.execute(
@@ -1108,20 +1254,66 @@
             main.exit()
 
     def disconnect( self ):
-        main.log.info( self.name + ": Disconnecting mininet..." )
+        """
+        Called at the end of the test to stop the mininet and
+        disconnect the handle.
+        """
+        self.handle.sendline('')
+        i = self.handle.expect( [ 'mininet>', pexpect.EOF, pexpect.TIMEOUT ],
+                                timeout=2)
+        if i == 0:
+            self.stopNet()
+        elif i == 1:
+            return main.TRUE
+        response = main.TRUE
+        # print "Disconnecting Mininet"
+        if self.handle:
+            self.handle.sendline( "exit" )
+            self.handle.expect( "exit" )
+            self.handle.expect( "(.*)" )
+        else:
+            main.log.error( "Connection failed to the host" )
+        return response
+
+    def stopNet( self, timeout=5):
+        """
+        Stops mininet.
+        Returns main.TRUE if the mininet successfully stops and
+                main.FALSE if the pexpect handle does not exist.
+
+        Will cleanup and exit the test if mininet fails to stop
+        """
+
+        main.log.info( self.name + ": Stopping mininet..." )
         response = ''
         if self.handle:
             try:
+                self.handle.sendline("")
+                i = self.handle.expect( [ 'mininet>',
+                                          '\$',
+                                          pexpect.EOF,
+                                          pexpect.TIMEOUT ],
+                                        timeout )
+                if i == 0:
+                    main.log.info( "Exiting mininet..." )
+               
                 response = self.execute(
                     cmd="exit",
                     prompt="(.*)",
                     timeout=120 )
-                response = self.execute(
-                    cmd="exit",
-                    prompt="(.*)",
-                    timeout=120 )
+                main.log.info( self.name + ": Stopped")
                 self.handle.sendline( "sudo mn -c" )
                 response = main.TRUE
+
+                if i == 1:
+                    main.log.info( " Mininet trying to exit while not " +
+                                   "in the mininet prompt" )
+                elif i == 2:
+                    main.log.error( "Something went wrong exiting mininet" )
+                elif i == 3:  # timeout
+                    main.log.error( "Something went wrong exiting mininet " +
+                                    "TIMEOUT" )
+                
             except pexpect.EOF:
                 main.log.error( self.name + ": EOF exception found" )
                 main.log.error( self.name + ":     " + self.handle.before )
@@ -1142,7 +1334,7 @@
             main.log.info( self.name + ": ARP successful" )
             self.handle.expect( [ "mininet", pexpect.EOF, pexpect.TIMEOUT ] )
             return main.TRUE
-        except:
+        except Exception:
             main.log.warn( self.name + ": ARP FAILURE" )
             self.handle.expect( [ "mininet", pexpect.EOF, pexpect.TIMEOUT ] )
             return main.FALSE
@@ -1193,12 +1385,10 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        else:
-            main.log.info( response )
 
     def startTcpdump( self, filename, intf="eth0", port="port 6633" ):
         """
-           Runs tpdump on an intferface and saves the file
+           Runs tpdump on an interface and saves the file
            intf can be specified, or the default eth0 is used"""
         try:
             self.handle.sendline( "" )
@@ -1248,15 +1438,14 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + ":" * 50 )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":" * 50 )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
     def stopTcpdump( self ):
-        "pkills tcpdump"
+        """
+            pkills tcpdump"""
         try:
             self.handle.sendline( "sh sudo pkill tcpdump" )
             self.handle.expect( "mininet>" )
@@ -1267,10 +1456,8 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + ":" * 50 )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":" * 50 )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1289,8 +1476,7 @@
             ports = []
             for port in switch.ports.values():
                 ports.append( { 'of_port': port.port_no,
-                                'mac': str( port.hw_addr ).replace( '\'',
-                                                                   '' ),
+                                'mac': str( port.hw_addr ).replace( '\'', '' ),
                                 'name': port.name } )
             output[ 'switches' ].append( {
                 "name": switch.name,
@@ -1299,12 +1485,12 @@
 
         # print "mn"
         # print json.dumps( output,
-        #                   sortKeys=True,
+        #                   sort_keys=True,
         #                   indent=4,
         #                   separators=( ',', ': ' ) )
         # print "onos"
         # print json.dumps( switchesJson,
-        #                   sortKeys=True,
+        #                   sort_keys=True,
         #                   indent=4,
         #                   separators=( ',', ': ' ) )
 
@@ -1371,17 +1557,15 @@
             ports = []
             for port in switch.ports.values():
                 # print port.hw_addr.toStr( separator='' )
-                tmpPort = {}
-                tmpPort[ 'of_port' ] = port.port_no
-                tmpPort[ 'mac' ] = str( port.hw_addr ).replace( '\'', '' )
-                tmpPort[ 'name' ] = port.name
-                tmpPort[ 'enabled' ] = port.enabled
+                tmpPort = { 'of_port': port.port_no,
+                            'mac': str( port.hw_addr ).replace( '\'', '' ),
+                            'name': port.name,
+                            'enabled': port.enabled }
 
                 ports.append( tmpPort )
-            tmpSwitch = {}
-            tmpSwitch[ 'name' ] = switch.name
-            tmpSwitch[ 'dpid' ] = str( switch.dpid ).zfill( 16 )
-            tmpSwitch[ 'ports' ] = ports
+            tmpSwitch = { 'name': switch.name,
+                          'dpid': str( switch.dpid ).zfill( 16 ),
+                          'ports': ports }
 
             output[ 'switches' ].append( tmpSwitch )
 
@@ -1462,8 +1646,7 @@
 
            This uses the sts TestONTopology object"""
         # FIXME: this does not look for extra links in ONOS, only checks that
-        # ONOS has what is in MN
-        linkResults = main.TRUE
+        #        ONOS has what is in MN
         output = { "switches": [] }
         onos = linksJson
         # iterate through the MN topology and pull out switches and and port
@@ -1475,8 +1658,7 @@
             for port in switch.ports.values():
                 # print port.hw_addr.toStr( separator='' )
                 ports.append( { 'of_port': port.port_no,
-                                'mac': str( port.hw_addr ).replace( '\'',
-                                                                   '' ),
+                                'mac': str( port.hw_addr ).replace( '\'', '' ),
                                 'name': port.name } )
             output[ 'switches' ].append( {
                 "name": switch.name,
@@ -1492,9 +1674,9 @@
         else:
             linkResults = main.FALSE
             main.log.report(
-                "Mininet has %i bidirectional links and " +
-                "ONOS has %i unidirectional links" %
-                ( len( mnLinks ), len( onos ) ) )
+                "Mininet has " + str( len( mnLinks ) ) +
+                " bidirectional links and ONOS has " +
+                str( len( onos ) ) + " unidirectional links" )
 
         # iterate through MN links and check if an ONOS link exists in
         # both directions
@@ -1552,7 +1734,7 @@
                         main.log.warn(
                             'The port numbers do not match for ' +
                             str( link ) +
-                            ' between ONOS and MN. When cheking ONOS for ' +
+                            ' between ONOS and MN. When checking ONOS for ' +
                             'link %s/%s -> %s/%s' %
                             ( node1,
                               port1,
@@ -1574,7 +1756,7 @@
                         main.log.warn(
                             'The port numbers do not match for ' +
                             str( link ) +
-                            ' between ONOS and MN. When cheking ONOS for ' +
+                            ' between ONOS and MN. When checking ONOS for ' +
                             'link %s/%s -> %s/%s' %
                             ( node2,
                               port2,
@@ -1598,6 +1780,64 @@
             linkResults = linkResults and firstDir and secondDir
         return linkResults
 
+    def compareHosts( self, topo, hostsJson ):
+        """
+           Compare mn and onos Hosts.
+           Since Mininet hosts are quiet, ONOS will only know of them when they
+           speak. For this reason, we will only check that the hosts in ONOS
+           stores are in Mininet, and not vice versa.
+           topo: sts TestONTopology object
+           hostsJson: parsed json object from the onos hosts api
+
+           This uses the sts TestONTopology object"""
+        import json
+        hostResults = main.TRUE
+        hosts = []
+        # iterate through the MN topology and pull out hosts
+        for mnHost in topo.graph.hosts:
+            interfaces = []
+            for intf in mnHost.interfaces:
+                interfaces.append( {
+                    "name": intf.name,  # str
+                    "ips": [ str( ip ) for ip in intf.ips ],  # list of IPAddrs
+                    # hw_addr is of type EthAddr, Not JSON serializable
+                    "hw_addr": str( intf.hw_addr ) } )
+            hosts.append( {
+                "name": mnHost.name,  # str
+                "interfaces": interfaces  } )  # list
+        for onosHost in hostsJson:
+            onosMAC = onosHost[ 'mac' ].lower()
+            match = False
+            for mnHost in hosts:
+                for mnIntf in mnHost[ 'interfaces' ]:
+                    if onosMAC == mnIntf[ 'hw_addr' ].lower() :
+                        match = True
+                        for ip in mnIntf[ 'ips' ]:
+                            if ip in onosHost[ 'ips' ]:
+                                pass  # all is well
+                            else:
+                                # misssing ip
+                                main.log.error( "ONOS host " + onosHost[ 'id' ]
+                                                + " has a different IP than " +
+                                                "the Mininet host." )
+                                output = json.dumps(
+                                                    onosHost,
+                                                    sort_keys=True,
+                                                    indent=4,
+                                                    separators=( ',', ': ' ) )
+                                main.log.info( output )
+                                hostResults = main.FALSE
+            if not match:
+                hostResults = main.FALSE
+                main.log.error( "ONOS host " + onosHost[ 'id' ] + " has no " +
+                                "corresponding Mininet host." )
+                output = json.dumps( onosHost,
+                                     sort_keys=True,
+                                     indent=4,
+                                     separators=( ',', ': ' ) )
+                main.log.info( output )
+        return hostResults
+
     def getHosts( self ):
         """
            Returns a list of all hosts
@@ -1627,7 +1867,7 @@
            updates the port address and status information for
            each port in mn"""
         # TODO: Add error checking. currently the mininet command has no output
-        main.log.info( "Updateing MN port information" )
+        main.log.info( "Updating MN port information" )
         try:
             self.handle.sendline( "" )
             self.handle.expect( "mininet>" )
diff --git a/TestON/drivers/common/cli/emulator/remotemininetdriver.py b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
index f5982bf..8e445a9 100644
--- a/TestON/drivers/common/cli/emulator/remotemininetdriver.py
+++ b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
@@ -21,7 +21,6 @@
 
 MininetCliDriver is the basic driver which will handle the Mininet functions
 """
-import traceback
 import pexpect
 import re
 import sys
@@ -40,11 +39,12 @@
     def __init__( self ):
         super( Emulator, self ).__init__()
         self.handle = self
+        self.name = None
         self.wrapped = sys.modules[ __name__ ]
         self.flag = 0
 
     def connect( self, **connectargs ):
-        """,userName, ipAddress, pwd,options ):
+        """,user_name, ip_address, pwd,options ):
          Here the main is the TestON instance after creating all the log
          handles."""
         for key in connectargs:
@@ -54,13 +54,11 @@
         self.handle = super(
             RemoteMininetDriver,
             self ).connect(
-            userName=self.userName,
-            ipAddress=self.ipAddress,
+            user_name=self.user_name,
+            ip_address=self.ip_address,
             port=None,
             pwd=self.pwd )
 
-        self.sshHandle = self.handle
-
         # Copying the readme file to process the
         if self.handle:
             return main.TRUE
@@ -68,9 +66,9 @@
         else:
             main.log.error(
                 "Connection failed to the host " +
-                self.userName +
+                self.user_name +
                 "@" +
-                self.ipAddress )
+                self.ip_address )
             main.log.error( "Failed to connect to the Mininet" )
             return main.FALSE
 
@@ -99,7 +97,7 @@
 
     def pingLong( self, **pingParams ):
         """
-        Starts a continuous ping on the mininet host outputing
+        Starts a continuous ping on the mininet host outputting
         to a file in the /tmp dir.
         """
         self.handle.sendline( "" )
@@ -109,8 +107,9 @@
         precmd = "sudo rm /tmp/ping." + args[ "SRC" ]
         self.execute( cmd=precmd, prompt="(.*)", timeout=10 )
         command = "sudo mininet/util/m " + args[ "SRC" ] + " ping " +\
-                args[ "TARGET" ] + " -i .2 -w " + str( args[ 'PINGTIME' ] ) +\
-                " -D > /tmp/ping." + args[ "SRC" ] + " &"
+                  args[ "TARGET" ] + " -i .2 -w " +\
+                  str( args[ 'PINGTIME' ] ) + " -D > /tmp/ping." +\
+                  args[ "SRC" ] + " &"
         main.log.info( command )
         self.execute( cmd=command, prompt="(.*)", timeout=10 )
         self.handle.sendline( "" )
@@ -182,7 +181,7 @@
 
     def pingHostOptical( self, **pingParams ):
         """
-        This function is only for Packey Optical related ping
+        This function is only for Packet Optical related ping
         Use the next pingHost() function for all normal scenarios )
         Ping from one mininet host to another
         Currently the only supported Params: SRC and TARGET
@@ -281,7 +280,7 @@
             port="port 6633",
             user="admin" ):
         """
-        Runs tpdump on an intferface and saves the file
+        Runs tcpdump on an interface and saves the file
         intf can be specified, or the default eth0 is used
         """
         try:
@@ -323,31 +322,25 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info(
-                    self.name + ":" * 60 )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":" * 80 )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
     def stopTcpdump( self ):
-        "pkills tcpdump"
+        """
+            pkills tcpdump"""
         try:
             self.handle.sendline( "sudo pkill tcpdump" )
             self.handle.sendline( "" )
-            self.handle.sendline( "" )
             self.handle.expect( "\$" )
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info(
-                    self.name + ":" * 60 )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":" * 80 )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -374,23 +367,31 @@
         """
         Called at the end of the test to disconnect the handle.
         """
-        response = ''
-        # print "Disconnecting Mininet"
         if self.handle:
-            self.handle.sendline( "exit" )
-            self.handle.expect( "exit" )
-            self.handle.expect( "(.*)" )
-            response = self.handle.before
-
+            # Close the ssh connection
+            self.handle.sendline( "" )
+            # self.handle.expect( "\$" )
+            i = self.handle.expect( [ '\$', 'mininet>', pexpect.TIMEOUT ],
+                                    timeout=2)
+            if i == 0:
+                self.handle.sendline( "exit" )
+                self.handle.expect( "closed" )
+            elif i == 1:
+                self.handle.sendline( "exit" )
+                self.handle.expect( "exit" )
+                self.handle.expect('\$')
+                self.handle.sendline( "exit" )
+                self.handle.expect( "exit" )
+                self.handle.expect( "closed" )
+                
         else:
             main.log.error( "Connection failed to the host" )
-            response = main.FALSE
-        return response
+        return main.TRUE
 
     def getFlowTable( self, protoVersion, sw ):
         """
          TODO document usage
-         TODO add option to look at cookies. ignoreing them for now
+         TODO add option to look at cookies. ignoring them for now
 
          print "get_flowTable(" + str( protoVersion ) +" " + str( sw ) +")"
          NOTE: Use format to force consistent flow table output across
@@ -563,7 +564,7 @@
                             str( rule ) )
 
                         infoString = "Rules added to " + str( self.name )
-                        infoString += "iptable rule added to block IP: " + \
+                        infoString += "iptables rule added to block IP: " + \
                             str( dstIp )
                         infoString += "Port: " + \
                             str( dstPort ) + " Rule: " + str( rule )
@@ -576,8 +577,9 @@
                         main.log.error(
                             self.name +
                             ": Timeout exception in setIpTables function" )
-                    except:
-                        main.log.error( traceback.print_exc() )
+                    except Exception:
+                        main.log.exception( self.name +
+                                            ": Uncaught exception!" )
                         main.cleanup()
                         main.exit()
                 else:
@@ -589,6 +591,7 @@
                 if actionType == 'remove':
                     # -D is the 'delete' rule of iptables
                     actionRemove = '-D'
+                    # noinspection PyBroadException
                     try:
                         self.handle.sendline( "" )
                         # Delete a specific rule specified into the function
@@ -619,8 +622,9 @@
                         main.log.error(
                             self.name +
                             ": Timeout exception in setIpTables function" )
-                    except:
-                        main.log.error( traceback.print_exc() )
+                    except Exception:
+                        main.log.exception( self.name +
+                                            ": Uncaught exception!" )
                         main.cleanup()
                         main.exit()
                 else:
diff --git a/TestON/drivers/common/cli/emulatordriver.py b/TestON/drivers/common/cli/emulatordriver.py
index bb8da7c..778a32b 100644
--- a/TestON/drivers/common/cli/emulatordriver.py
+++ b/TestON/drivers/common/cli/emulatordriver.py
@@ -19,12 +19,6 @@
 
 
 """
-import pexpect
-import struct
-import fcntl
-import os
-import sys
-import signal
 import sys
 sys.path.append( "../" )
 from drivers.common.clidriver import CLI
diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
index 2de9251..713388f 100644
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -19,7 +19,8 @@
 import sys
 import pexpect
 import re
-import traceback
+import json
+import types
 sys.path.append( "../" )
 from drivers.common.clidriver import CLI
 
@@ -30,6 +31,9 @@
         """
         Initialize client
         """
+        self.name = None
+        self.home = None
+        self.handle = None
         super( CLI, self ).__init__()
 
     def connect( self, **connectargs ):
@@ -44,11 +48,13 @@
                 if key == "home":
                     self.home = self.options[ 'home' ]
                     break
+            if self.home is None or self.home == "":
+                self.home = "~/ONOS"
 
             self.name = self.options[ 'name' ]
             self.handle = super( OnosCliDriver, self ).connect(
-                userName=self.userName,
-                ipAddress=self.ipAddress,
+                user_name=self.user_name,
+                ip_address=self.ip_address,
                 port=self.port,
                 pwd=self.pwd,
                 home=self.home )
@@ -60,15 +66,16 @@
             else:
                 main.log.info( "NO ONOS HANDLE" )
                 return main.FALSE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + ":::::::::::::::::::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":::::::::::::::::::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -76,25 +83,22 @@
         """
         Called when Test is complete to disconnect the ONOS handle.
         """
-        response = ''
+        response = main.TRUE
+        # noinspection PyBroadException
         try:
-            self.handle.sendline( "" )
-            i = self.handle.expect( [ "onos>", "\$" ] )
-            if i == 0:
-                self.handle.sendline( "system:shutdown" )
-                self.handle.expect( "Confirm" )
-                self.handle.sendline( "yes" )
-                self.handle.expect( "\$" )
+            self.logout()
             self.handle.sendline( "" )
             self.handle.expect( "\$" )
             self.handle.sendline( "exit" )
             self.handle.expect( "closed" )
-
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            response = main.FALSE
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":     " + self.handle.before )
-        except:
-            main.log.error( self.name + ": Connection failed to the host" )
+        except Exception:
+            main.log.exception( self.name + ": Connection failed to the host" )
             response = main.FALSE
         return response
 
@@ -104,25 +108,26 @@
         """
         try:
             self.handle.sendline( "" )
-            i = self.handle.expect( [
-                "onos>",
-                "\$" ], timeout=10 )
-            if i == 0:
+            i = self.handle.expect( [ "onos>", "\$", pexpect.TIMEOUT ],
+                                    timeout=10 )
+            if i == 0:  # In ONOS CLI
                 self.handle.sendline( "logout" )
                 self.handle.expect( "\$" )
-            elif i == 1:
+            elif i == 1:  # not in CLI
                 return main.TRUE
-
+            elif i == 3:  # Timeout
+                return main.FALSE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": eof exception found" )
             main.log.error( self.name + ":    " +
                             self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -143,7 +148,6 @@
                 # Note that this variable name is subject to change
                 #   and that this driver will have to change accordingly
                 self.handle.expect(str(cellname))
-
                 handleBefore = self.handle.before
                 handleAfter = self.handle.after
                 # Get the rest of the handle
@@ -156,21 +160,22 @@
 
                 return main.TRUE
 
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": eof exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
     def startOnosCli( self, ONOSIp, karafTimeout="" ):
         """
-        karafTimeout is an optional arugument. karafTimeout value passed
+        karafTimeout is an optional argument. karafTimeout value passed
         by user would be used to set the current karaf shell idle timeout.
         Note that when ever this property is modified the shell will exit and
         the subsequent login would reflect new idle timeout.
@@ -202,8 +207,8 @@
                 main.log.info( str( ONOSIp ) + " CLI Started successfully" )
                 if karafTimeout:
                     self.handle.sendline(
-                        "config:property-set -p org.apache.karaf.shel\
-                                l sshIdleTimeout " +
+                        "config:property-set -p org.apache.karaf.shell\
+                                 sshIdleTimeout " +
                         karafTimeout )
                     self.handle.expect( "\$" )
                     self.handle.sendline( "onos -w " + str( ONOSIp ) )
@@ -233,15 +238,49 @@
                                     str( ONOSIp ) + " timeout" )
                     return main.FALSE
 
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def log( self, cmdStr, level="" ):
+        """
+            log  the commands in the onos CLI.
+            returns main.TRUE on success
+            returns main.FALSE if Error occurred
+            Available level: DEBUG, TRACE, INFO, WARN, ERROR
+            Level defaults to INFO
+        """
+        try:
+            lvlStr = ""
+            if level:
+                lvlStr = "--level=" + level
+
+            self.handle.sendline( "" )
+            self.handle.expect( "onos>" )
+            self.handle.sendline( "log:log " + lvlStr + " " + cmdStr )
+            self.handle.expect( "onos>" )
+
+            response = self.handle.before
+            if re.search( "Error", response ):
+                return main.FALSE
+            return main.TRUE
+
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -255,36 +294,42 @@
         sent using this method.
         """
         try:
-            self.handle.sendline( "" )
-            self.handle.expect( "onos>" )
-
-            self.handle.sendline( "log:log \"Sending CLI command: '"
-                                  + cmdStr + "'\"" )
-            self.handle.expect( "onos>" )
+            logStr = "\"Sending CLI command: '" + cmdStr + "'\""
+            self.log( logStr )
             self.handle.sendline( cmdStr )
-            self.handle.expect( cmdStr )
-            self.handle.expect( "onos>" )
-
-            handle = self.handle.before
-
-            self.handle.sendline( "" )
-            self.handle.expect( "onos>" )
-
+            i = self.handle.expect( ["onos>", "\$", pexpect.TIMEOUT] )
+            response = self.handle.before
+            if i == 2:
+                self.handle.sendline()
+                self.handle.expect( "\$" )
+                response += self.handle.before
+                print response
+                try:
+                    print self.handle.after
+                except:
+                    pass
+            # TODO: do something with i
             main.log.info( "Command '" + str( cmdStr ) + "' sent to "
                            + self.name + "." )
+            # Remove control strings from output
             ansiEscape = re.compile( r'\x1b[^m]*m' )
-            handle = ansiEscape.sub( '', handle )
-
-            return handle
+            response = ansiEscape.sub( '', response )
+            # Remove extra return chars that get added
+            response = re.sub(  r"\s\r", "", response )
+            response = response.strip()
+            # parse for just the output, remove the cmd from response
+            output = response.split( cmdStr, 1 )[1]
+            return output
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -304,6 +349,7 @@
         Optional:
             * tcpPort
         """
+        # noinspection PyBroadException
         try:
             cmdStr = "add-node " + str( nodeId ) + " " +\
                 str( ONOSIp ) + " " + str( tcpPort )
@@ -315,15 +361,16 @@
             else:
                 main.log.info( "Node " + str( ONOSIp ) + " added" )
                 return main.TRUE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -342,15 +389,16 @@
 
             return main.TRUE
 
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -364,22 +412,23 @@
             cmdStr = "nodes"
             handle = self.sendline( cmdStr )
             return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
     def topology( self ):
         """
         Shows the current state of the topology
-        by issusing command: 'onos> onos:topology'
+        by issuing command: 'onos> onos:topology'
         """
         try:
             # either onos:topology or 'topology' will work in CLI
@@ -387,15 +436,16 @@
             handle = self.sendline( cmdStr )
             main.log.info( "onos:topology returned: " + str( handle ) )
             return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -409,6 +459,9 @@
             self.sendline( cmdStr )
             # TODO: Check for possible error responses from karaf
             return main.TRUE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
@@ -416,12 +469,10 @@
             main.log.report( "Exiting test" )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.log.report( "Failed to install feature" )
             main.log.report( "Exiting test" )
-            main.log.info( self.name + " ::::::" )
             main.cleanup()
             main.exit()
 
@@ -431,19 +482,26 @@
         by issuing command: 'onos> feature:uninstall <feature_str>'
         """
         try:
-            cmdStr = "feature:uninstall " + str( featureStr )
-            self.sendline( cmdStr )
-            # TODO: Check for possible error responses from karaf
+            cmdStr = 'feature:list -i | grep "' + featureStr + '"'
+            handle = self.sendline( cmdStr )
+            if handle != '':
+                cmdStr = "feature:uninstall " + str( featureStr )
+                self.sendline( cmdStr )
+                # TODO: Check for possible error responses from karaf
+            else:
+                main.log.info( "Feature needs to be installed before " +
+                               "uninstalling it" )
             return main.TRUE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -477,15 +535,16 @@
                 cmdStr = "devices"
                 handle = self.sendline( cmdStr )
                 return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -500,15 +559,16 @@
             self.sendline( cmdStr )
             # TODO: Check for error responses from ONOS
             return main.TRUE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -542,15 +602,16 @@
                 cmdStr = "links"
                 handle = self.sendline( cmdStr )
                 return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -572,7 +633,7 @@
                 escape sequences. In json.loads( somestring ), this somestring
                 variable is actually repr( somestring ) and json.loads would
                 fail with the escape sequence. So we take off that escape
-                sequence using the following commads:
+                sequence using the following commands:
 
                 ansiEscape = re.compile( r'\r\r\n\x1b[^m]*m' )
                 handle1 = ansiEscape.sub( '', handle )
@@ -585,15 +646,16 @@
                 cmdStr = "ports"
                 handle = self.sendline( cmdStr )
                 return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -630,15 +692,16 @@
                 cmdStr = "roles"
                 handle = self.sendline( cmdStr )
                 return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -654,7 +717,6 @@
         None if no match
         """
         try:
-            import json
             if deviceId is None:
                 return None
             else:
@@ -666,16 +728,16 @@
                     if str( deviceId ) in device[ 'id' ]:
                         return device
             return None
-
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -686,7 +748,6 @@
                  main.FALSE any device has no master
         """
         try:
-            import json
             rawRoles = self.roles()
             rolesJson = json.loads( rawRoles )
             # search json for the device with id then return the device
@@ -697,15 +758,16 @@
                     return main.FALSE
             return main.TRUE
 
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -724,15 +786,16 @@
                 path = handle.split( ";" )[ 0 ]
                 cost = handle.split( ";" )[ 1 ]
                 return ( path, cost )
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return ( handle, "Error" )
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -766,15 +829,16 @@
                 cmdStr = "hosts"
                 handle = self.sendline( cmdStr )
                 return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -782,12 +846,11 @@
         """
         Return the first host from the hosts api whose 'id' contains 'mac'
 
-        Note: mac must be a colon seperated mac address, but could be a
+        Note: mac must be a colon separated mac address, but could be a
               partial mac address
 
         Return None if there is no match
         """
-        import json
         try:
             if mac is None:
                 return None
@@ -798,18 +861,21 @@
                 # search json for the host with mac then return the device
                 for host in hostsJson:
                     # print "%s in  %s?" % ( mac, host[ 'id' ] )
-                    if mac in host[ 'id' ]:
+                    if not host:
+                        pass
+                    elif mac in host[ 'id' ]:
                         return host
             return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -842,15 +908,16 @@
 
             return onosHostList
 
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -860,25 +927,37 @@
             * hostIdOne: ONOS host id for host1
             * hostIdTwo: ONOS host id for host2
         Description:
-            Adds a host-to-host intent ( bidrectional ) by
+            Adds a host-to-host intent ( bidirectional ) by
             specifying the two hosts.
+        Returns:
+            A string of the intent id or None on Error
         """
         try:
             cmdStr = "add-host-intent " + str( hostIdOne ) +\
                 " " + str( hostIdTwo )
             handle = self.sendline( cmdStr )
-            main.log.info( "Host intent installed between " +
-                           str( hostIdOne ) + " and " + str( hostIdTwo ) )
-            return handle
+            if re.search( "Error", handle ):
+                main.log.error( "Error in adding Host intent" )
+                return None
+            else:
+                main.log.info( "Host intent installed between " +
+                               str( hostIdOne ) + " and " + str( hostIdTwo ) )
+                match = re.search('id=0x([\da-f]+),', handle)
+                if match:
+                    return match.group()[3:-1]
+                else:
+                    main.log.error( "Error, intent ID not found" )
+                    return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -889,6 +968,10 @@
             * egressDevice: device id of egress device
         Optional:
             TODO: Still needs to be implemented via dev side
+        Description:
+            Adds an optical intent by specifying an ingress and egress device
+        Returns:
+            A string of the intent id or None on error
         """
         try:
             cmdStr = "add-optical-intent " + str( ingressDevice ) +\
@@ -896,18 +979,28 @@
             handle = self.sendline( cmdStr )
             # If error, return error message
             if re.search( "Error", handle ):
-                return handle
+                main.log.error( "Error in adding Optical intent" )
+                return None
             else:
-                return main.TRUE
+                main.log.info( "Optical intent installed between " +
+                               str( ingressDevice ) + " and " +
+                               str( egressDevice ) )
+                match = re.search('id=0x([\da-f]+),', handle)
+                if match:
+                    return match.group()[3:-1]
+                else:
+                    main.log.error( "Error, intent ID not found" )
+                    return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -946,14 +1039,14 @@
         Description:
             Adds a point-to-point intent ( uni-directional ) by
             specifying device id's and optional fields
+        Returns:
+            A string of the intent id or None on error
 
         NOTE: This function may change depending on the
               options developers provide for point-to-point
               intent via cli
         """
         try:
-            cmd = ""
-
             # If there are no optional arguments
             if not ethType and not ethSrc and not ethDst\
                     and not bandwidth and not lambdaAlloc \
@@ -991,10 +1084,11 @@
                 cmd += " " + str( ingressDevice )
             else:
                 if not portIngress:
-                    main.log.error( "You must specify " +
-                                    "the ingress port" )
+                    main.log.error( "You must specify the ingress port" )
                     # TODO: perhaps more meaningful return
-                    return main.FALSE
+                    #       Would it make sense to throw an exception and exit
+                    #       the test?
+                    return None
 
                 cmd += " " + \
                     str( ingressDevice ) + "/" +\
@@ -1004,29 +1098,39 @@
                 cmd += " " + str( egressDevice )
             else:
                 if not portEgress:
-                    main.log.error( "You must specify " +
-                                    "the egress port" )
-                    return main.FALSE
+                    main.log.error( "You must specify the egress port" )
+                    return None
 
                 cmd += " " +\
                     str( egressDevice ) + "/" +\
                     str( portEgress )
 
             handle = self.sendline( cmd )
+            # If error, return error message
             if re.search( "Error", handle ):
                 main.log.error( "Error in adding point-to-point intent" )
-                return main.FALSE
+                return None
             else:
-                return main.TRUE
+                # TODO: print out all the options in this message?
+                main.log.info( "Point-to-point intent installed between " +
+                               str( ingressDevice ) + " and " +
+                               str( egressDevice ) )
+                match = re.search('id=0x([\da-f]+),', handle)
+                if match:
+                    return match.group()[3:-1]
+                else:
+                    main.log.error( "Error, intent ID not found" )
+                    return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1035,7 +1139,8 @@
             ingressDevice1,
             ingressDevice2,
             egressDevice,
-            portIngress="",
+            portIngress1="",
+            portIngress2="",
             portEgress="",
             ethType="",
             ethSrc="",
@@ -1075,14 +1180,14 @@
         Description:
             Adds a multipoint-to-singlepoint intent ( uni-directional ) by
             specifying device id's and optional fields
+        Returns:
+            A string of the intent id or None on error
 
         NOTE: This function may change depending on the
-              options developers provide for multipointpoint-to-singlepoint
+              options developers provide for multipoint-to-singlepoint
               intent via cli
         """
         try:
-            cmd = ""
-
             # If there are no optional arguments
             if not ethType and not ethSrc and not ethDst\
                     and not bandwidth and not lambdaAlloc\
@@ -1128,7 +1233,7 @@
                     main.log.error( "You must specify " +
                                     "the ingress port1" )
                     # TODO: perhaps more meaningful return
-                    return main.FALSE
+                    return None
 
                 cmd += " " + \
                     str( ingressDevice1 ) + "/" +\
@@ -1141,7 +1246,7 @@
                     main.log.error( "You must specify " +
                                     "the ingress port2" )
                     # TODO: perhaps more meaningful return
-                    return main.FALSE
+                    return None
 
                 cmd += " " + \
                     str( ingressDevice2 ) + "/" +\
@@ -1160,33 +1265,56 @@
                     str( portEgress )
             print "cmd= ", cmd
             handle = self.sendline( cmd )
+            # If error, return error message
             if re.search( "Error", handle ):
-                main.log.error( "Error in adding point-to-point intent" )
-                return self.handle
+                main.log.error( "Error in adding multipoint-to-singlepoint " +
+                                "intent" )
+                return None
             else:
-                return main.TRUE
+                # TODO: print out all the options in this message?
+                main.log.info( "Multipoint-to-singlepoint intent installed" +
+                               " between " + str( ingressDevice1 ) + ", " +
+                               str( ingressDevice2 ) + " and " +
+                               str( egressDevice ) )
+                match = re.search('id=0x([\da-f]+),', handle)
+                if match:
+                    return match.group()[3:-1]
+                else:
+                    main.log.error( "Error, intent ID not found" )
+                    return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
-    def removeIntent( self, intentId ):
+    def removeIntent( self, intentId, app='org.onosproject.cli',
+                      purge=False, sync=False ):
         """
-        Remove intent for specified intent id
-
+        Remove intent for specified application id and intent id
+        Optional args:- 
+        -s or --sync: Waits for the removal before returning
+        -p or --purge: Purge the intent from the store after removal  
+        
         Returns:
             main.False on error and
             cli output otherwise
         """
         try:
-            cmdStr = "remove-intent " + str( intentId )
+            cmdStr = "remove-intent "
+            if purge:
+                cmdStr += " -p"
+            if sync:
+                cmdStr += " -s"
+
+            cmdStr += " " + app + " " + str( intentId )
             handle = self.sendline( cmdStr )
             if re.search( "Error", handle ):
                 main.log.error( "Error in removing intent" )
@@ -1194,15 +1322,16 @@
             else:
                 # TODO: Should this be main.TRUE
                 return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1225,15 +1354,16 @@
                 cmdStr = "routes"
                 handle = self.sendline( cmdStr )
             return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1254,15 +1384,75 @@
                 cmdStr = "intents"
                 handle = self.sendline( cmdStr )
             return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def getIntentState(self, intentsId, intentsJson=None):
+        """
+            Check intent state.
+            Accepts a single intent ID (string type) or a list of intent IDs.
+            Returns the state(string type) of the id if a single intent ID is
+            accepted.
+            Returns a dictionary with intent IDs as the key and its
+            corresponding states as the values
+            Parameters:
+            intentId: intent ID (string type)
+            intentsJson: parsed json object from the onos:intents api
+            Returns:
+            state = An intent's state- INSTALL,WITHDRAWN etc.
+            stateDict = Dictionary of intent's state. intent ID as the keys and
+            state as the values.
+        """
+        try:
+            state = "State is Undefined"
+            if not intentsJson:
+                intentsJsonTemp = json.loads( self.intents() )
+            else:
+                intentsJsonTemp = json.loads( intentsJson )
+            if isinstance( intentsId, types.StringType ):
+                for intent in intentsJsonTemp:
+                    if intentsId == intent['id']:
+                        state = intent['state']
+                        return state
+                main.log.info( "Cannot find intent ID" + str( intentsId ) +
+                               " on the list" )
+                return state
+            elif isinstance( intentsId, types.ListType ):
+                dictList = []
+                for ID in intentsId:
+                    stateDict = {}
+                    for intents in intentsJsonTemp:
+                        if ID == intents['id']:
+                            stateDict['state'] = intents['state']
+                            stateDict['id'] = ID
+                            dictList.append( stateDict )
+                            break
+                if len( intentsId ) != len( dictList ):
+                    main.log.info( "Cannot find some of the intent ID state" )
+                return dictList
+            else:
+                main.log.info("Invalid intents ID entry")
+                return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1286,20 +1476,21 @@
                 main.log.error( self.name + ".flows() response: " +
                                 str( handle ) )
             return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
     def pushTestIntents( self, dpidSrc, dpidDst, numIntents,
-                          numMult="", appId="", report=True ):
+                         numMult="", appId="", report=True ):
         """
         Description:
             Push a number of intents in a batch format to
@@ -1344,15 +1535,16 @@
                 return latResult
             else:
                 return main.TRUE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1373,15 +1565,16 @@
                 cmdStr = "intents-events-metrics"
                 handle = self.sendline( cmdStr )
             return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1402,15 +1595,16 @@
                 cmdStr = "topology-events-metrics"
                 handle = self.sendline( cmdStr )
             return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1428,40 +1622,48 @@
         """
         try:
             # Obtain output of intents function
-            intentsStr = self.intents()
-            allIntentList = []
+            intentsStr = self.intents(jsonFormat=False)
             intentIdList = []
 
             # Parse the intents output for ID's
             intentsList = [ s.strip() for s in intentsStr.splitlines() ]
             for intents in intentsList:
-                if "onos>" in intents:
-                    continue
-                elif "intents" in intents:
-                    continue
-                else:
-                    lineList = intents.split( " " )
-                    allIntentList.append( lineList[ 0 ] )
-
-            allIntentList = allIntentList[ 1:-2 ]
-
-            for intents in allIntentList:
-                if not intents:
-                    continue
-                else:
-                    intentIdList.append( intents )
-
+                match = re.search('id=0x([\da-f]+),', intents)
+                if match:
+                    tmpId = match.group()[3:-1]
+                    intentIdList.append( tmpId )
             return intentIdList
 
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def FlowAddedCount( self, deviceId ):
+        """
+        Determine the number of flow rules for the given device id that are
+        in the added state
+        """
+        try:
+            cmdStr = "flows any " + str( deviceId ) + " | " +\
+                     "grep 'state=ADDED' | wc -l"
+            handle = self.sendline( cmdStr )
+            return handle
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1498,15 +1700,16 @@
                 idList.append( arg.split( "id=" )[ 1 ] )
             return idList
 
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1537,15 +1740,16 @@
 
             return idList
 
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1554,7 +1758,6 @@
         Return the first device from the devices api whose 'id' contains 'dpid'
         Return None if there is no match
         """
-        import json
         try:
             if dpid is None:
                 return None
@@ -1568,35 +1771,36 @@
                     if dpid in device[ 'id' ]:
                         return device
             return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
     def checkStatus( self, ip, numoswitch, numolink, logLevel="info" ):
         """
-        Checks the number of swithes & links that ONOS sees against the
+        Checks the number of switches & links that ONOS sees against the
         supplied values. By default this will report to main.log, but the
-        log level can be specifid.
+        log level can be specified.
 
         Params: ip = ip used for the onos cli
                 numoswitch = expected number of switches
-                numlink = expected number of links
+                numolink = expected number of links
                 logLevel = level to log to. Currently accepts
                 'info', 'warn' and 'report'
 
 
         logLevel can
 
-        Returns: main.TRUE if the number of switchs and links are correct,
-                 main.FALSE if the numer of switches and links is incorrect,
+        Returns: main.TRUE if the number of switches and links are correct,
+                 main.FALSE if the number of switches and links is incorrect,
                  and main.ERROR otherwise
         """
         try:
@@ -1607,20 +1811,19 @@
             # Is the number of switches is what we expected
             devices = topology.get( 'devices', False )
             links = topology.get( 'links', False )
-            if devices == False or links == False:
+            if devices is False or links is False:
                 return main.ERROR
             switchCheck = ( int( devices ) == int( numoswitch ) )
             # Is the number of links is what we expected
             linkCheck = ( int( links ) == int( numolink ) )
             if ( switchCheck and linkCheck ):
                 # We expected the correct numbers
-                output = output + "The number of links and switches match "\
-                    + "what was expected"
+                output += "The number of links and switches match " +\
+                          "what was expected"
                 result = main.TRUE
             else:
-                output = output + \
-                    "The number of links and switches does not matc\
-                    h what was expected"
+                output += "The number of links and switches does not match " +\
+                          "what was expected"
                 result = main.FALSE
             output = output + "\n ONOS sees %i devices (%i expected) \
                     and %i links (%i expected)" % (
@@ -1633,15 +1836,16 @@
             else:
                 main.log.info( output )
             return result
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1675,15 +1879,16 @@
                 main.log.error( "Invalid 'role' given to device_role(). " +
                                 "Value was '" + str(role) + "'." )
                 return main.FALSE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1717,15 +1922,16 @@
                 cmdStr = "clusters"
                 handle = self.sendline( cmdStr )
                 return handle
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1768,15 +1974,16 @@
                                 "unexpected response" )
                 main.log.error( repr( response ) )
                 return main.FALSE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return main.FALSE
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1808,15 +2015,16 @@
                                 "unexpected response" )
                 main.log.error( repr( response ) )
                 return main.FALSE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return main.FALSE
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1848,15 +2056,16 @@
                                 "unexpected response" )
                 main.log.error( repr( response ) )
                 return main.FALSE
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return main.FALSE
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1873,15 +2082,16 @@
                 return ( output, "Error" )
             else:
                 return output
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return ( output, "Error" )
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1898,15 +2108,16 @@
                 return ( output, "Error " )
             else:
                 return output
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return ( output, "Error " )
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1922,14 +2133,107 @@
                 return ( output, "Error" )
             else:
                 return output
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return ( output, "Error" )
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def intentSummary( self ):
+        """
+        Returns a dictionary containing the current intent states and the count
+        """
+        try:
+            intents = self.intents( )
+            intentStates = []
+            for intent in json.loads( intents ):  # Iter through intents of a node
+                intentStates.append( intent.get( 'state', None ) )
+            out = [ (i, intentStates.count( i ) ) for i in set( intentStates ) ]
+            main.log.info( dict( out ) )
+            return dict( out )
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def leaders( self ):
+        """
+        Returns the output of the leaders command.
+        """
+        # FIXME: add json output
+        try:
+            output = self.sendline( "onos:leaders" )
+            main.log.warn( output )
+            return output
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
         except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
+
+    def pendingMap( self ):
+        """
+        Returns the output of the intent Pending map.
+        """
+        # FIXME: add json output
+        try:
+            output = self.sendline( "onos:intents -p" )
+            main.log.warn( output )
+            return output
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def partitions( self ):
+        """
+        Returns the output of the raft partitions command for ONOS.
+        """
+        # FIXME: add json output
+        try:
+            output = self.sendline( "partitions" )
+            main.log.warn( output )
+            return output
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
diff --git a/TestON/drivers/common/cli/onosdriver.py b/TestON/drivers/common/cli/onosdriver.py
index 42c15ad..b030231 100644
--- a/TestON/drivers/common/cli/onosdriver.py
+++ b/TestON/drivers/common/cli/onosdriver.py
@@ -19,7 +19,6 @@
 import sys
 import time
 import pexpect
-import traceback
 import os.path
 sys.path.append( "../" )
 from drivers.common.clidriver import CLI
@@ -31,6 +30,9 @@
         """
         Initialize client
         """
+        self.name = None
+        self.home = None
+        self.handle = None
         super( CLI, self ).__init__()
 
     def connect( self, **connectargs ):
@@ -45,11 +47,13 @@
                 if key == "home":
                     self.home = self.options[ 'home' ]
                     break
+            if self.home is None or self.home == "":
+                self.home = "~/ONOS"
 
             self.name = self.options[ 'name' ]
             self.handle = super( OnosDriver, self ).connect(
-                userName=self.userName,
-                ipAddress=self.ipAddress,
+                user_name=self.user_name,
+                ip_address=self.ip_address,
                 port=self.port,
                 pwd=self.pwd,
                 home=self.home )
@@ -66,10 +70,8 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + ":" * 30 )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":" * 30 )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -77,7 +79,7 @@
         """
         Called when Test is complete to disconnect the ONOS handle.
         """
-        response = ''
+        response = main.TRUE
         try:
             self.handle.sendline( "" )
             self.handle.expect( "\$" )
@@ -86,8 +88,8 @@
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":     " + self.handle.before )
-        except:
-            main.log.error( self.name + ": Connection failed to the host" )
+        except Exception:
+            main.log.exception( self.name + ": Connection failed to the host" )
             response = main.FALSE
         return response
 
@@ -111,8 +113,8 @@
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
-        except:
-            main.log.error( "Failed to package ONOS" )
+        except Exception:
+            main.log.exception( "Failed to package ONOS" )
             main.cleanup()
             main.exit()
 
@@ -141,8 +143,8 @@
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
-        except:
-            main.log.error( "Failed to build ONOS" )
+        except Exception:
+            main.log.exception( "Failed to build ONOS" )
             main.cleanup()
             main.exit()
 
@@ -167,8 +169,8 @@
             self.handle.expect( "mvn clean install" )
             while True:
                 i = self.handle.expect( [
-                    'There\sis\sinsufficient\smemory\sfor\sthe\sJava\s\
-                            Runtime\sEnvironment\sto\scontinue',
+                    'There\sis\sinsufficient\smemory\sfor\sthe\sJava\s' +
+                    'Runtime\sEnvironment\sto\scontinue',
                     'BUILD\sFAILURE',
                     'BUILD\sSUCCESS',
                     'ONOS\$',
@@ -203,8 +205,8 @@
                     main.cleanup()
                     main.exit()
                 else:
-                    main.log.error( self.name + ": unexpected response from \
-                            mvn clean install" )
+                    main.log.error( self.name + ": unexpected response from " +
+                                    "mvn clean install" )
                     # return main.FALSE
                     main.cleanup()
                     main.exit()
@@ -213,10 +215,8 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + ":" * 60 )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":" * 60 )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -238,7 +238,7 @@
             # main.log.info( self.name + ": Stopping ONOS" )
             # self.stop()
             self.handle.sendline( "cd " + self.home )
-            self.handle.expect( "ONOS\$" )
+            self.handle.expect( self.home + "\$" )
             if comp1 == "":
                 self.handle.sendline( "git pull" )
             else:
@@ -252,10 +252,8 @@
                     'Already up-to-date',
                     'Aborting',
                     'You\sare\snot\scurrently\son\sa\sbranch',
-                    'You\sasked\sme\sto\spull\swithout\stelling\sme\swhich\
-                            \sbranch\syou',
-                    'Pull\sis\snot\spossible\sbecause\syou\shave\sunmerged\
-                            \sfiles',
+                    'You asked me to pull without telling me which branch you',
+                    'Pull is not possible because you have unmerged files',
                     pexpect.TIMEOUT ],
                 timeout=300 )
             # debug
@@ -274,7 +272,7 @@
                 main.log.info(
                     self.name +
                     ": Git Pull - pulling repository now" )
-                self.handle.expect( "ONOS\$", 120 )
+                self.handle.expect( self.home + "\$", 120 )
             # So that only when git pull is done, we do mvn clean compile
                 return main.TRUE
             elif i == 3:
@@ -283,27 +281,26 @@
             elif i == 4:
                 main.log.info(
                     self.name +
-                    ": Git Pull - Aborting...\
-                            Are there conflicting git files?" )
+                    ": Git Pull - Aborting..." +
+                    "Are there conflicting git files?" )
                 return main.ERROR
             elif i == 5:
                 main.log.info(
                     self.name +
-                    ": Git Pull - You are not currently\
-                            on a branch so git pull failed!" )
+                    ": Git Pull - You are not currently " +
+                    "on a branch so git pull failed!" )
                 return main.ERROR
             elif i == 6:
                 main.log.info(
                     self.name +
-                    ": Git Pull - You have not configured\
-                             an upstream branch to pull from\
-                             . Git pull failed!" )
+                    ": Git Pull - You have not configured an upstream " +
+                    "branch to pull from. Git pull failed!" )
                 return main.ERROR
             elif i == 7:
                 main.log.info(
                     self.name +
-                    ": Git Pull - Pull is not possible\
-                            because you have unmerged files." )
+                    ": Git Pull - Pull is not possible because " +
+                    "you have unmerged files." )
                 return main.ERROR
             elif i == 8:
                 main.log.error( self.name + ": Git Pull - TIMEOUT" )
@@ -321,10 +318,8 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + ":" * 60 )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":" * 80 )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -345,28 +340,24 @@
         """
         try:
             self.handle.sendline( "cd " + self.home )
-            self.handle.expect( "ONOS\$" )
-            main.log.info(
-                self.name +
-                ": Checking out git branch: " +
-                branch +
-                "..." )
+            self.handle.expect( self.home + "\$" )
+            main.log.info( self.name +
+                           ": Checking out git branch/ref: " + branch + "..." )
             cmd = "git checkout " + branch
             self.handle.sendline( cmd )
             self.handle.expect( cmd )
             i = self.handle.expect(
-                [
-                    'fatal',
-                    'Username\sfor\s(.*):\s',
-                    'Already\son\s\'',
-                    'Switched\sto\sbranch\s\'' +
-                    str( branch ),
-                    pexpect.TIMEOUT,
-                    'error: Your local changes to the following files\
-                            would be overwritten by checkout:',
-                    'error: you need to resolve your current index first' ],
+                [ 'fatal',
+                  'Username\sfor\s(.*):\s',
+                  'Already\son\s\'',
+                  'Switched\sto\sbranch\s\'' + str( branch ),
+                  pexpect.TIMEOUT,
+                  'error: Your local changes to the following files' +
+                  'would be overwritten by checkout:',
+                  'error: you need to resolve your current index first',
+                  "You are in 'detached HEAD' state.",
+                  "HEAD is now at " ],
                 timeout=60 )
-
             if i == 0:
                 main.log.error(
                     self.name +
@@ -379,55 +370,66 @@
                     ": Git checkout asking for username." +
                     " Please configure your local git repository to be able " +
                     "to access your remote repository passwordlessly" )
+                # TODO add support for authenticating
                 return main.ERROR
             elif i == 2:
                 main.log.info(
                     self.name +
-                    ": Git Checkout %s : Already on this branch" %
-                    branch )
-                self.handle.expect( "ONOS\$" )
+                    ": Git Checkout %s : Already on this branch" % branch )
+                self.handle.expect( self.home + "\$" )
                 # main.log.info( "DEBUG: after checkout cmd = "+
                 # self.handle.before )
                 return main.TRUE
             elif i == 3:
                 main.log.info(
                     self.name +
-                    ": Git checkout %s - Switched to this branch" %
-                    branch )
-                self.handle.expect( "ONOS\$" )
+                    ": Git checkout %s - Switched to this branch" % branch )
+                self.handle.expect( self.home + "\$" )
                 # main.log.info( "DEBUG: after checkout cmd = "+
                 # self.handle.before )
                 return main.TRUE
             elif i == 4:
                 main.log.error( self.name + ": Git Checkout- TIMEOUT" )
                 main.log.error(
-                    self.name + " Response was: " + str(
-                        self.handle.before ) )
+                    self.name + " Response was: " + str( self.handle.before ) )
                 return main.ERROR
             elif i == 5:
                 self.handle.expect( "Aborting" )
                 main.log.error(
                     self.name +
                     ": Git checkout error: \n" +
-                    "Your local changes to the following\
-                            files would be overwritten by checkout:" +
-                    str(
-                        self.handle.before ) )
-                self.handle.expect( "ONOS\$" )
+                    "Your local changes to the following files would" +
+                    " be overwritten by checkout:" +
+                    str( self.handle.before ) )
+                self.handle.expect( self.home + "\$" )
                 return main.ERROR
             elif i == 6:
-                main.log.error( self.name +
-                                ": Git checkout error: \n" +
-                                "You need to resolve your\
-                                        current index first:" +
-                                str( self.handle.before ) )
-                self.handle.expect( "ONOS\$" )
+                main.log.error(
+                    self.name +
+                    ": Git checkout error: \n" +
+                    "You need to resolve your current index first:" +
+                    str( self.handle.before ) )
+                self.handle.expect( self.home + "\$" )
                 return main.ERROR
+            elif i == 7:
+                main.log.info(
+                    self.name +
+                    ": Git checkout " + str( branch ) +
+                    " - You are in 'detached HEAD' state. HEAD is now at " +
+                    str( branch ) )
+                self.handle.expect( self.home + "\$" )
+                return main.TRUE
+            elif i == 8:  # Already in detached HEAD on the specified commit
+                main.log.info(
+                    self.name +
+                    ": Git Checkout %s : Already on commit" % branch )
+                self.handle.expect( self.home + "\$" )
+                return main.TRUE
             else:
                 main.log.error(
                     self.name +
-                    ": Git Checkout - Unexpected response,\
-                            check for pull errors" )
+                    ": Git Checkout - Unexpected response, " +
+                    "check for pull errors" )
                 main.log.error( self.name + ":     " + self.handle.before )
                 return main.ERROR
 
@@ -436,29 +438,24 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + ":" * 60 )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":" * 80 )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
     def getVersion( self, report=False ):
         """
-        Writes the COMMIT number to the report to be parsed\
-                by Jenkins data collecter.
+        Writes the COMMIT number to the report to be parsed
+                by Jenkins data collector.
         """
         try:
-            self.handle.sendline( "export TERM=xterm-256color" )
-            self.handle.expect( "xterm-256color" )
-            self.handle.expect( "\$" )
             self.handle.sendline( "" )
             self.handle.expect( "\$" )
             self.handle.sendline(
                 "cd " +
                 self.home +
-                "; git log -1 --pretty=fuller --decorate=short | grep -A 6\
-                        \"commit\" --color=never" )
+                "; git log -1 --pretty=fuller --decorate=short | grep -A 6 " +
+                " \"commit\" --color=never" )
             # NOTE: for some reason there are backspaces inserted in this
             # phrase when run from Jenkins on some tests
             self.handle.expect( "never" )
@@ -489,14 +486,13 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + ":" * 60 )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":" * 80 )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
-    def createCellFile( self, benchIp, fileName, mnIpAddrs,extraFeatureString, *onosIpAddrs ):
+    def createCellFile( self, benchIp, fileName, mnIpAddrs,
+                        extraFeatureString, *onosIpAddrs ):
         """
         Creates a cell file based on arguments
         Required:
@@ -572,10 +568,8 @@
             main.log.error( self.name + ":     " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + ":::::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( ":::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -611,10 +605,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -641,15 +633,15 @@
                            handleAfter + handleMore )
 
             return main.TRUE
-        except pexpect.EOF:
-            main.log.error( self.name + ": EOF exception found" )
+        except pexpect.ExceptionPexpect as e:
+            main.log.error( self.name + ": Pexpect exception found of type " +
+                            str( type( e ) ) )
+            main.log.error ( e.get_trace() )
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -707,10 +699,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -762,10 +752,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -800,10 +788,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -838,10 +824,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -867,10 +851,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -900,10 +882,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -938,7 +918,7 @@
                     " not configured" )
                 return main.FALSE
             else:
-                main.log.info( "ONOS instasnce was not killed" )
+                main.log.info( "ONOS instance was not killed" )
                 return main.FALSE
 
         except pexpect.EOF:
@@ -946,10 +926,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -983,10 +961,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1022,10 +998,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1056,10 +1030,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1120,10 +1092,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1168,10 +1138,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1182,21 +1150,21 @@
             numolink,
             logLevel="info" ):
         """
-        Checks the number of swithes & links that ONOS sees against the
+        Checks the number of switches & links that ONOS sees against the
         supplied values. By default this will report to main.log, but the
-        log level can be specifid.
+        log level can be specific.
 
         Params: ip = ip used for the onos cli
                 numoswitch = expected number of switches
-                numlink = expected number of links
+                numolink = expected number of links
                 logLevel = level to log to.
                 Currently accepts 'info', 'warn' and 'report'
 
 
         logLevel can
 
-        Returns: main.TRUE if the number of switchs and links are correct,
-                 main.FALSE if the numer of switches and links is incorrect,
+        Returns: main.TRUE if the number of switches and links are correct,
+                 main.FALSE if the number of switches and links is incorrect,
                  and main.ERROR otherwise
         """
         try:
@@ -1212,20 +1180,20 @@
             switchCheck = ( int( devices ) == int( numoswitch ) )
             # Is the number of links is what we expected
             linkCheck = ( int( links ) == int( numolink ) )
-            if ( switchCheck and linkCheck ):
+            if switchCheck and linkCheck:
                 # We expected the correct numbers
                 output = output + "The number of links and switches match "\
                     + "what was expected"
                 result = main.TRUE
             else:
                 output = output + \
-                    "The number of links and switches does not match\
-                    what was expected"
+                    "The number of links and switches does not match " + \
+                    "what was expected"
                 result = main.FALSE
-            output = output + "\n ONOS sees %i devices (%i expected)\
-                     and %i links (%i expected)" %\
-                     ( int( devices ), int( numoswitch ),
-                       int( links ), int( numolink ) )
+            output = output + "\n ONOS sees %i devices" % int( devices )
+            output = output + " (%i expected) " % int( numoswitch )
+            output = output + "and %i links " % int( links )
+            output = output + "(%i expected)" % int( numolink )
             if logLevel == "report":
                 main.log.report( output )
             elif logLevel == "warn":
@@ -1238,10 +1206,8 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
@@ -1254,19 +1220,29 @@
             * interface: interface to capture
             * dir: directory/filename to store pcap
         """
-        self.handle.sendline( "" )
-        self.handle.expect( "\$" )
+        try:
+            self.handle.sendline( "" )
+            self.handle.expect( "\$" )
 
-        self.handle.sendline( "tshark -i " + str( interface ) +
-                              " -t e -w " + str( dirFile ) + " &" )
-        self.handle.sendline( "\r" )
-        self.handle.expect( "Capturing on" )
-        self.handle.sendline( "\r" )
-        self.handle.expect( "\$" )
+            self.handle.sendline( "tshark -i " + str( interface ) +
+                                  " -t e -w " + str( dirFile ) + " &" )
+            self.handle.sendline( "\r" )
+            self.handle.expect( "Capturing on" )
+            self.handle.sendline( "\r" )
+            self.handle.expect( "\$" )
 
-        main.log.info( "Tshark started capturing files on " +
-                       str( interface ) + " and saving to directory: " +
-                       str( dirFile ) )
+            main.log.info( "Tshark started capturing files on " +
+                           str( interface ) + " and saving to directory: " +
+                           str( dirFile ) )
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
 
     def runOnosTopoCfg( self, instanceName, jsonFile ):
         """
@@ -1287,8 +1263,15 @@
             self.handle.sendline( "cd ~" )
             self.handle.expect( "\$" )
             return main.TRUE
-        except:
-            return main.FALSE
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
 
     def tsharkGrep( self, grep, directory, interface='eth0' ):
         """
@@ -1302,33 +1285,53 @@
             and stores the results to specified directory.
             The timestamp is hardcoded to be in epoch
         """
-        self.handle.sendline( "" )
-        self.handle.expect( "\$" )
-        self.handle.sendline( "" )
-        self.handle.sendline(
-            "tshark -i " +
-            str( interface ) +
-            " -t e | grep --line-buffered \"" +
-            str(grep) +
-            "\" >" +
-            directory +
-            " &" )
-        self.handle.sendline( "\r" )
-        self.handle.expect( "Capturing on" )
-        self.handle.sendline( "\r" )
-        self.handle.expect( "\$" )
+        try:
+            self.handle.sendline( "" )
+            self.handle.expect( "\$" )
+            self.handle.sendline( "" )
+            self.handle.sendline(
+                "tshark -i " +
+                str( interface ) +
+                " -t e | grep --line-buffered \"" +
+                str(grep) +
+                "\" >" +
+                directory +
+                " &" )
+            self.handle.sendline( "\r" )
+            self.handle.expect( "Capturing on" )
+            self.handle.sendline( "\r" )
+            self.handle.expect( "\$" )
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
 
     def tsharkStop( self ):
         """
         Removes wireshark files from /tmp and kills all tshark processes
         """
         # Remove all pcap from previous captures
-        self.execute( cmd="sudo rm /tmp/wireshark*" )
-        self.handle.sendline( "" )
-        self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\" |" +
-                              " grep -v grep | awk '{print $2}'`" )
-        self.handle.sendline( "" )
-        main.log.info( "Tshark stopped" )
+        try:
+            self.execute( cmd="sudo rm /tmp/wireshark*" )
+            self.handle.sendline( "" )
+            self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\"" +
+                                  " | grep -v grep | awk '{print $2}'`" )
+            self.handle.sendline( "" )
+            main.log.info( "Tshark stopped" )
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
 
     def ptpd( self, args ):
         """
@@ -1363,15 +1366,13 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
     def cpLogsToDir( self, logToCopy,
-                       destDir, copyFileName="" ):
+                     destDir, copyFileName="" ):
         """
         Copies logs to a desired directory.
         Current implementation of ONOS deletes its karaf
@@ -1403,13 +1404,9 @@
                 destDir += "/"
 
             if copyFileName:
-                self.handle.sendline(
-                    "cp " +
-                    str( logToCopy ) +
-                    " " +
-                    str( destDir ) +
-                    str( copyFileName ) +
-                    localtime )
+                self.handle.sendline( "cp " + str( logToCopy ) + " " +
+                                      str( destDir ) + str( copyFileName ) +
+                                      localtime )
                 self.handle.expect( "cp" )
                 self.handle.expect( "\$" )
             else:
@@ -1424,11 +1421,8 @@
             main.log.error( "Copying files failed" )
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
-        except:
-            main.log.error( "Copying files failed" )
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( "Copying files failed" )
 
     def checkLogs( self, onosIp ):
         """
@@ -1446,11 +1440,10 @@
             main.log.error( "Lost ssh connection" )
             main.log.error( self.name + ": EOF exception found" )
             main.log.error( self.name + ":    " + self.handle.before )
-        except:
-            main.log.error( "Some error in check_logs:" )
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
 
     def onosStatus( self, node="" ):
         """
@@ -1479,10 +1472,160 @@
             main.log.error( self.name + ":    " + self.handle.before )
             main.cleanup()
             main.exit()
-        except:
-            main.log.info( self.name + " ::::::" )
-            main.log.error( traceback.print_exc() )
-            main.log.info( self.name + " ::::::" )
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def setIpTables( self, ip, port='', action='add', packet_type='',
+                     direction='INPUT', rule='DROP', states=True ):
+        """
+        Description:
+            add or remove iptables rule to DROP (default) packets from
+            specific IP and PORT
+        Usage:
+        * specify action ('add' or 'remove')
+          when removing, pass in the same argument as you would add. It will
+          delete that specific rule.
+        * specify the ip to block
+        * specify the destination port to block (defaults to all ports)
+        * optional packet type to block (default tcp)
+        * optional iptables rule (default DROP)
+        * optional direction to block (default 'INPUT')
+        * States boolean toggles adding all supported tcp states to the
+          firewall rule
+        Returns:
+            main.TRUE on success or
+            main.FALSE if given invalid input or
+            main.ERROR if there is an error in response from iptables
+        WARNING:
+        * This function uses root privilege iptables command which may result
+          in unwanted network errors. USE WITH CAUTION
+        """
+        import time
+
+        # NOTE*********
+        #   The strict checking methods of this driver function is intentional
+        #   to discourage any misuse or error of iptables, which can cause
+        #   severe network errors
+        # *************
+
+        # NOTE: Sleep needed to give some time for rule to be added and
+        #       registered to the instance. If you are calling this function
+        #       multiple times this sleep will prevent any errors.
+        #       DO NOT REMOVE
+        # time.sleep( 5 )
+        try:
+            # input validation
+            action_type = action.lower()
+            rule = rule.upper()
+            direction = direction.upper()
+            if action_type != 'add' and action_type != 'remove':
+                main.log.error( "Invalid action type. Use 'add' or "
+                                "'remove' table rule" )
+                if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
+                    # NOTE Currently only supports rules DROP, ACCEPT, and LOG
+                    main.log.error( "Invalid rule. Valid rules are 'DROP' or "
+                                    "'ACCEPT' or 'LOG' only." )
+                    if direction != 'INPUT' and direction != 'OUTPUT':
+                        # NOTE currently only supports rules INPUT and OUPTUT
+                        main.log.error( "Invalid rule. Valid directions are"
+                                        " 'OUTPUT' or 'INPUT'" )
+                        return main.FALSE
+                    return main.FALSE
+                return main.FALSE
+            if action_type == 'add':
+                # -A is the 'append' action of iptables
+                actionFlag = '-A'
+            elif action_type == 'remove':
+                # -D is the 'delete' rule of iptables
+                actionFlag = '-D'
+            self.handle.sendline( "" )
+            self.handle.expect( "\$" )
+            cmd = "sudo iptables " + actionFlag + " " +\
+                  direction +\
+                  " -s " + str( ip )
+                  # " -p " + str( packet_type ) +\
+            if packet_type:
+                cmd += " -p " + str( packet_type )
+            if port:
+                cmd += " --dport " + str( port )
+            if states:
+                cmd += " -m state --state="
+                #FIXME- Allow user to configure which states to block
+                cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
+            cmd += " -j " + str( rule )
+
+            self.handle.sendline( cmd )
+            self.handle.expect( "\$" )
+            main.log.warn( self.handle.before )
+
+            info_string = "On " + str( self.name )
+            info_string += " " + str( action_type )
+            info_string += " iptable rule [ "
+            info_string += " IP: " + str( ip )
+            info_string += " Port: " + str( port )
+            info_string += " Rule: " + str( rule )
+            info_string += " Direction: " + str( direction ) + " ]"
+            main.log.info( info_string )
+            return main.TRUE
+        except pexpect.TIMEOUT:
+            main.log.exception( self.name + ": Timeout exception in "
+                                "setIpTables function" )
+            return main.ERROR
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanup()
+            main.exit()
+
+    def detailed_status(self, log_filename):
+        """
+        This method is used by STS to check the status of the controller
+        Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
+        """
+        import re
+        try:
+            self.handle.sendline( "" )
+            self.handle.expect( "\$" )
+            self.handle.sendline( "cd " + self.home )
+            self.handle.expect( "\$" )
+            self.handle.sendline( "service onos status" )
+            self.handle.expect( "\$" )
+            response = self.handle.before
+            if re.search( "onos start/running", response ):
+                # onos start/running, process 10457
+                return 'RUNNING'
+            # FIXME: Implement this case
+            # elif re.search( pattern, response ):
+            #      return 'STARTING'
+            elif re.search( "onos stop/", response ):
+                # onos stop/waiting
+                # FIXME handle this differently?:  onos stop/pre-stop
+                return 'STOPPED'
+            # FIXME: Implement this case
+            # elif re.search( pattern, response ):
+            #      return 'FROZEN'
+            else:
+                main.log.warn( self.name +
+                               " WARNING: status received unknown response" )
+                main.log.warn( response )
+                return 'ERROR', "Unknown response: %s" % response
+        except pexpect.TIMEOUT:
+            main.log.exception( self.name + ": Timeout exception in "
+                                "setIpTables function" )
+            return 'ERROR', "Pexpect Timeout"
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanup()
+            main.exit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanup()
             main.exit()
 
diff --git a/TestON/drivers/common/cli/quaggaclidriver.py b/TestON/drivers/common/cli/quaggaclidriver.py
index f0cfecc..5631c9b 100644
--- a/TestON/drivers/common/cli/quaggaclidriver.py
+++ b/TestON/drivers/common/cli/quaggaclidriver.py
@@ -2,13 +2,7 @@
 
 import time
 import pexpect
-import struct
-import fcntl
-import os
 import sys
-import signal
-import sys
-import re
 import json
 sys.path.append( "../" )
 from drivers.common.clidriver import CLI
@@ -26,21 +20,16 @@
 
         self.name = self.options[ 'name' ]
         # self.handle = super( QuaggaCliDriver,self ).connect(
-        # userName=self.userName, ipAddress=self.ipAddress,port=self.port,
+        # user_name=self.user_name, ip_address=self.ip_address,port=self.port,
         # pwd=self.pwd )
-        self.handle = super(
-            QuaggaCliDriver,
-            self ).connect(
-                userName=self.userName,
-            ipAddress="1.1.1.1",
-            port=self.port,
-            pwd=self.pwd )
-        main.log.info(
-            "connect parameters:" + str(
-                self.userName ) + ";" + str(
-                    self.ipAddress ) + ";" + str(
-                self.port ) + ";" + str(
-                self.pwd ) )
+        self.handle = super( QuaggaCliDriver, self ).connect(
+                user_name=self.user_name,
+                ip_address="1.1.1.1",
+                port=self.port,
+                pwd=self.pwd )
+        main.log.info( "connect parameters:" + str( self.user_name ) + ";"
+                       + str( self.ip_address ) + ";" + str( self.port )
+                       + ";" + str(self.pwd ) )
 
         if self.handle:
             # self.handle.expect( "",timeout=10 )
@@ -59,19 +48,14 @@
             main.log.info( "NO HANDLE" )
             return main.FALSE
 
-    def loginQuagga( self, ipAddress ):
+    def loginQuagga( self, ip_address ):
         self.name = self.options[ 'name' ]
         self.handle = super( QuaggaCliDriver, self ).connect(
-            userName=self.userName, ipAddress=ipAddress,
+            user_name=self.user_name, ip_address=ip_address,
             port=self.port, pwd=self.pwd )
-        main.log.info( "connect parameters:" +
-                       str( self.userName ) +
-                       ";" +
-                       str( self.ipAddress ) +
-                       ";" +
-                       str( self.port ) +
-                       ";" +
-                       str( self.pwd ) )
+        main.log.info( "connect parameters:" + str( self.user_name ) + ";"
+                       + str( self.ip_address ) + ";" + str( self.port )
+                       + ";" + str( self.pwd ) )
 
         if self.handle:
             # self.handle.expect( "" )
@@ -85,7 +69,7 @@
             self.handle.sendline( "enable" )
             # self.handle.expect( "bgpd#", timeout=5 )
             self.handle.expect( "bgpd#" )
-            main.log.info( "I in quagga on host " + str( ipAddress ) )
+            main.log.info( "I am in quagga on host " + str( ip_address ) )
 
             return self.handle
         else:
@@ -97,7 +81,7 @@
         try:
             self.handle.sendline( "" )
             self.handle.expect( "bgpd#" )
-        except:
+        except Exception:
             main.log.warn( "Probably not currently in enable mode!" )
             self.disconnect()
             return main.FALSE
@@ -108,14 +92,13 @@
             self.handle.sendline( routerAS )
             self.handle.expect( "config-router", timeout=5 )
             return main.TRUE
-        except:
+        except Exception:
             return main.FALSE
 
     def generatePrefixes( self, net, numRoutes ):
         main.log.info( "I am in generate_prefixes method!" )
 
-        # each IP prefix will be composed by
-        #"net" + "." + m + "." + n + "." + x
+        # each IP prefix is composed by "net" + "." + m + "." + n + "." + x
         # the length of each IP prefix is 24
         routes = []
         routesGen = 0
@@ -124,10 +107,8 @@
 
         for i in range( 0, m ):
             for j in range( 0, 256 ):
-                network = str(
-                    net ) + "." + str(
-                        i ) + "." + str(
-                            j ) + ".0/24"
+                network = str( net ) + "." + str( i ) + "." + str( j ) \
+                    + ".0/24"
                 routes.append( network )
                 routesGen = routesGen + 1
 
@@ -144,39 +125,36 @@
 
     # This method generates a multiple to single point intent(
     # MultiPointToSinglePointIntent ) for a given route
-    def generateExpectedSingleRouteIntent(
-            self,
-            prefix,
-            nextHop,
-            nextHopMac,
-            sdnipData ):
+    def generateExpectedSingleRouteIntent( self, prefix, nextHop, nextHopMac,
+                                           sdnipData ):
 
-        ingress = []
+        ingresses = []
         egress = ""
         for peer in sdnipData[ 'bgpPeers' ]:
             if peer[ 'ipAddress' ] == nextHop:
-                egress = "of:" + \
-                    str( peer[ 'attachmentDpid' ] ).replace( ":", "" ) + ":" +\
-                    str( peer[ 'attachmentPort' ] )
-            else:
-                ingress.append( "of:" +
-                                str( peer[ 'attachmentDpid' ] ).replace( ":",
-                                     "" ) + ":" +
-                                str( peer[ 'attachmentPort' ] ) )
+                egress = "of:" + str(
+                    peer[ 'attachmentDpid' ] ).replace( ":", "" ) + ":" \
+                    + str( peer[ 'attachmentPort' ] )
+        for peer in sdnipData[ 'bgpPeers' ]:
+            if not peer[ 'ipAddress' ] == nextHop:
+                ingress = "of:" + str(
+                    peer[ 'attachmentDpid' ] ).replace( ":", "" ) + ":" \
+                    + str( peer[ 'attachmentPort' ] )
+                if not ingress == egress and ingress not in ingresses:
+                    ingresses.append( ingress )
+                    # ingresses.append( "of:" + str( peer[ 'attachmentDpid' ]
+                    # ).replace( ":", "" ) + ":" + str( peer[ 'attachmentPort'
+                    # ] ) )
 
         selector = "ETH_TYPE{ethType=800},IPV4_DST{ip=" + prefix + "}"
         treatment = "[ETH_DST{mac=" + str( nextHopMac ) + "}]"
 
-        intent = egress + "/" + \
-            str( sorted( ingress ) ) + "/" + selector + "/" + treatment
+        intent = egress + "/" + str( sorted( ingresses ) ) + "/" + \
+            selector + "/" + treatment
         return intent
 
-    def generateExpectedOnePeerRouteIntents(
-            self,
-            prefixes,
-            nextHop,
-            nextHopMac,
-            sdnipJsonFilePath ):
+    def generateExpectedOnePeerRouteIntents( self, prefixes, nextHop,
+                                             nextHopMac, sdnipJsonFilePath ):
         intents = []
         sdnipJsonFile = open( sdnipJsonFilePath ).read()
 
@@ -185,10 +163,7 @@
         for prefix in prefixes:
             intents.append(
                 self.generateExpectedSingleRouteIntent(
-                    prefix,
-                    nextHop,
-                    nextHopMac,
-                    sdnipData ) )
+                    prefix, nextHop, nextHopMac, sdnipData ) )
         return sorted( intents )
 
     # TODO
@@ -220,14 +195,15 @@
         for intent in intentsJsonObj:
             if intent[ 'appId' ] != "org.onosproject.sdnip":
                 continue
-            if intent[ 'type' ] == "MultiPointToSinglePointIntent" and intent[
-                    'state' ] == 'INSTALLED':
-                egress = str( intent[ 'egress' ][ 'device' ] ) + ":" + str(
-                    intent[ 'egress' ][ 'port' ] )
+            if intent[ 'type' ] == "MultiPointToSinglePointIntent" \
+            and intent[ 'state' ] == 'INSTALLED':
+                egress = str( intent[ 'egress' ][ 'device' ] ) + ":" \
+                    + str( intent[ 'egress' ][ 'port' ] )
                 ingress = []
                 for attachmentPoint in intent[ 'ingress' ]:
-                    ingress.append( str( attachmentPoint[ 'device' ] ) +
-                            ":" + str( attachmentPoint[ 'port' ] ) )
+                    ingress.append(
+                        str( attachmentPoint[ 'device' ] ) + ":"
+                        + str( attachmentPoint[ 'port' ] ) )
 
                 selector = intent[ 'selector' ].replace(
                     "[", "" ).replace( "]", "" ).replace( " ", "" )
@@ -235,8 +211,7 @@
                     str1, str2 = str( selector ).split( "," )
                     selector = str2 + "," + str1
 
-                intent = egress + "/" + \
-                    str( sorted( ingress ) ) + "/" + \
+                intent = egress + "/" + str( sorted( ingress ) ) + "/" + \
                     selector + "/" + intent[ 'treatment' ]
                 intents.append( intent )
         return sorted( intents )
@@ -251,22 +226,16 @@
         for intent in intentsJsonObj:
             if intent[ 'appId' ] != "org.onosproject.sdnip":
                 continue
-            if intent[ 'type' ] == "PointToPointIntent" and "protocol=6"\
-                    in str(  intent[ 'selector' ] ):
-                ingress = str( intent[ 'ingress' ][ 'device' ] ) + ":" + str(
-                    intent[ 'ingress' ][ 'port' ] )
-                egress = str( intent[ 'egress' ][ 'device' ] ) + ":" + str(
-                    intent[ 'egress' ][ 'port' ] )
-                selector = str(
-                    intent[ 'selector' ] ).replace(
-                    " ",
-                    "" ).replace(
-                    "[",
-                    "" ).replace(
-                    "]",
-                    "" ).split( "," )
-                intent = ingress + "/" + egress + \
-                    "/" + str( sorted( selector ) )
+            if intent[ 'type' ] == "PointToPointIntent" \
+            and "protocol=6" in str( intent[ 'selector' ] ):
+                ingress = str( intent[ 'ingress' ][ 'device' ] ) + ":" \
+                    + str( intent[ 'ingress' ][ 'port' ] )
+                egress = str( intent[ 'egress' ][ 'device' ] ) + ":" + \
+                    str( intent[ 'egress' ][ 'port' ] )
+                selector = str( intent[ 'selector' ] ).replace( " ", "" )\
+                    .replace( "[", "" ).replace( "]", "" ).split( "," )
+                intent = ingress + "/" + egress + "/" + \
+                    str( sorted( selector ) )
                 intents.append( intent )
 
         return sorted( intents )
@@ -282,25 +251,24 @@
         intents = []
         bgpPeerAttachmentPoint = ""
         bgpSpeakerAttachmentPoint = "of:" + str(
-            sdnipData[ 'bgpSpeakers' ][ 0 ][ 'attachmentDpid' ] ).replace( ":",
-             "" ) + ":" +\
-                     str( sdnipData[ 'bgpSpeakers' ][ 0 ][ 'attachmentPort' ] )
+            sdnipData[ 'bgpSpeakers' ][ 0 ][ 'attachmentDpid' ] )\
+            .replace( ":", "" ) + ":" \
+            + str( sdnipData[ 'bgpSpeakers' ][ 0 ][ 'attachmentPort' ] )
         for peer in sdnipData[ 'bgpPeers' ]:
-            bgpPeerAttachmentPoint = "of:" + \
-                str( peer[ 'attachmentDpid' ] ).replace( ":", "" ) +\
-                ":" + str( peer[ 'attachmentPort' ] )
+            bgpPeerAttachmentPoint = "of:" \
+                + str( peer[ 'attachmentDpid' ] ).replace( ":", "" ) \
+                + ":" + str( peer[ 'attachmentPort' ] )
             # find out the BGP speaker IP address for this BGP peer
             bgpSpeakerIpAddress = ""
-            for interfaceAddress in sdnipData[
-                    'bgpSpeakers' ][ 0 ][ 'interfaceAddresses' ]:
+            for interfaceAddress in \
+            sdnipData[ 'bgpSpeakers' ][ 0 ][ 'interfaceAddresses' ]:
                 # if eq( interfaceAddress[ 'interfaceDpid' ],sdnipData[
                 # 'bgpSpeakers' ][ 0 ][ 'attachmentDpid' ] ) and eq(
-                # interfaceAddress[ 'interfacePort' ], sdnipData[
-                # 'bgpSpeakers' ][ 0 ][ 'attachmentPort' ] ):
-                if eq(
-                        interfaceAddress[ 'interfaceDpid' ],
-                        peer[ 'attachmentDpid' ] ) and eq(
-                        interfaceAddress[ 'interfacePort' ],
+                # interfaceAddress[ 'interfacePort' ], sdnipData[ 'bgpSpeakers'
+                # ][ 0 ][ 'attachmentPort' ] ):
+                if eq( interfaceAddress[ 'interfaceDpid' ],
+                       peer[ 'attachmentDpid' ] ) \
+                and eq( interfaceAddress[ 'interfacePort' ],
                         peer[ 'attachmentPort' ] ):
                     bgpSpeakerIpAddress = interfaceAddress[ 'ipAddress' ]
                     break
@@ -309,46 +277,46 @@
 
             # from bgpSpeakerAttachmentPoint to bgpPeerAttachmentPoint
             # direction
-            selectorStr = "IPV4_SRC{ip=" + bgpSpeakerIpAddress +\
-                    "/32}," + "IPV4_DST{ip=" + peer[ 'ipAddress' ] + "/32}," +\
-                        "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800},\
-                        TCP_DST{tcpPort=179}"
-            selector = selectorStr.replace( " ", "" ).replace(
-                "[", "" ).replace( "]", "" ).split( "," )
+            selectorStr = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," \
+                + "IPV4_DST{ip=" + peer[ 'ipAddress' ] + "/32}," \
+                + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, \
+                TCP_DST{tcpPort=179}"
+            selector = selectorStr.replace( " ", "" ).replace("[", "" )\
+                .replace( "]", "" ).split( "," )
             intent = bgpSpeakerAttachmentPoint + "/" + \
                 bgpPeerAttachmentPoint + "/" + str( sorted( selector ) )
             intents.append( intent )
 
-            selectorStr = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," +\
-                    "IPV4_DST{ip=" + peer[ 'ipAddress' ] + "/32}," +\
-                    "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800},\
-                    TCP_SRC{tcpPort=179}"
-            selector = selectorStr.replace( " ", "" ).replace(
-                "[", "" ).replace( "]", "" ).split( "," )
-            intent = bgpSpeakerAttachmentPoint + "/" + \
-                bgpPeerAttachmentPoint + "/" + str( sorted( selector ) )
+            selectorStr = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," \
+                + "IPV4_DST{ip=" + peer[ 'ipAddress' ] + "/32}," \
+                + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, \
+                TCP_SRC{tcpPort=179}"
+            selector = selectorStr.replace( " ", "" ).replace("[", "" )\
+                .replace( "]", "" ).split( "," )
+            intent = bgpSpeakerAttachmentPoint + "/" \
+                + bgpPeerAttachmentPoint + "/" + str( sorted( selector ) )
             intents.append( intent )
 
             # from bgpPeerAttachmentPoint to bgpSpeakerAttachmentPoint
             # direction
-            selectorStr = "IPV4_SRC{ip=" + peer[ 'ipAddress' ] + "/32}," +\
-                    "IPV4_DST{ip=" + bgpSpeakerIpAddress + "/32}," + \
-                    "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800},\
-                    TCP_DST{tcpPort=179}"
-            selector = selectorStr.replace( " ", "" ).replace(
-                "[", "" ).replace( "]", "" ).split( "," )
-            intent = bgpPeerAttachmentPoint + "/" + \
-                bgpSpeakerAttachmentPoint + "/" + str( sorted( selector ) )
+            selectorStr = "IPV4_SRC{ip=" + peer[ 'ipAddress' ] + "/32}," \
+                + "IPV4_DST{ip=" + bgpSpeakerIpAddress + "/32}," \
+                + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, \
+                TCP_DST{tcpPort=179}"
+            selector = selectorStr.replace( " ", "" ).replace("[", "" )\
+                .replace( "]", "" ).split( "," )
+            intent = bgpPeerAttachmentPoint + "/" \
+                + bgpSpeakerAttachmentPoint + "/" + str( sorted( selector ) )
             intents.append( intent )
 
-            selectorStr = "IPV4_SRC{ip=" + peer[ 'ipAddress' ] + "/32}," +\
-                    "IPV4_DST{ip=" + bgpSpeakerIpAddress + "/32}," +\
-                    "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800},\
-                     TCP_SRC{tcpPort=179}"
-            selector = selectorStr.replace( " ", "" ).replace(
-                "[", "" ).replace( "]", "" ).split( "," )
-            intent = bgpPeerAttachmentPoint + "/" + \
-                bgpSpeakerAttachmentPoint + "/" + str( sorted( selector ) )
+            selectorStr = "IPV4_SRC{ip=" + peer[ 'ipAddress' ] + "/32}," \
+                + "IPV4_DST{ip=" + bgpSpeakerIpAddress + "/32}," \
+                + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, \
+                TCP_SRC{tcpPort=179}"
+            selector = selectorStr.replace( " ", "" ).replace( "[", "" )\
+                .replace( "]", "" ).split( "," )
+            intent = bgpPeerAttachmentPoint + "/" \
+                + bgpSpeakerAttachmentPoint + "/" + str( sorted( selector ) )
             intents.append( intent )
 
         return sorted( intents )
@@ -361,7 +329,7 @@
             self.handle.sendline( "" )
             # self.handle.expect( "config-router" )
             self.handle.expect( "config-router", timeout=5 )
-        except:
+        except Exception:
             main.log.warn( "Probably not in config-router mode!" )
             self.disconnect()
         main.log.info( "Start to add routes" )
@@ -371,11 +339,11 @@
             try:
                 self.handle.sendline( routeCmd )
                 self.handle.expect( "bgpd", timeout=5 )
-            except:
+            except Exception:
                 main.log.warn( "Failed to add route" )
                 self.disconnect()
-            waitTimer = 1.00 / routeRate
-            time.sleep( waitTimer )
+            # waitTimer = 1.00 / routeRate
+            # time.sleep( waitTimer )
         if routesAdded == len( routes ):
             main.log.info( "Finished adding routes" )
             return main.TRUE
@@ -389,7 +357,7 @@
             self.handle.sendline( "" )
             # self.handle.expect( "config-router" )
             self.handle.expect( "config-router", timeout=5 )
-        except:
+        except Exception:
             main.log.warn( "Probably not in config-router mode!" )
             self.disconnect()
         main.log.info( "Start to delete routes" )
@@ -399,41 +367,32 @@
             try:
                 self.handle.sendline( routeCmd )
                 self.handle.expect( "bgpd", timeout=5 )
-            except:
-                main.log.warn( "Failed to add route" )
+            except Exception:
+                main.log.warn( "Failed to delete route" )
                 self.disconnect()
-            waitTimer = 1.00 / routeRate
-            time.sleep( waitTimer )
+            # waitTimer = 1.00 / routeRate
+            # time.sleep( waitTimer )
         if routesAdded == len( routes ):
             main.log.info( "Finished deleting routes" )
             return main.TRUE
         return main.FALSE
 
-    def pingTest( self, ipAddress, pingTestFile, pingTestResultFile ):
-        main.log.info( "Start the ping test on host:" + str( ipAddress ) )
+    def pingTest( self, ip_address, pingTestFile, pingTestResultFile ):
+        main.log.info( "Start the ping test on host:" + str( ip_address ) )
 
         self.name = self.options[ 'name' ]
         self.handle = super( QuaggaCliDriver, self ).connect(
-            userName=self.userName, ipAddress=ipAddress,
+            user_name=self.user_name, ip_address=ip_address,
             port=self.port, pwd=self.pwd )
-        main.log.info( "connect parameters:" +
-                       str( self.userName ) +
-                       ";" +
-                       str( self.ipAddress ) +
-                       ";" +
-                       str( self.port ) +
-                       ";" +
-                       str( self.pwd ) )
+        main.log.info( "connect parameters:" + str( self.user_name ) + ";"
+                       + str( self.ip_address ) + ";" + str( self.port )
+                       + ";" + str( self.pwd ) )
 
         if self.handle:
             # self.handle.expect( "" )
             # self.handle.expect( "\$" )
-            main.log.info( "I in host " + str( ipAddress ) )
-            main.log.info(
-                pingTestFile +
-                " > " +
-                pingTestResultFile +
-                " &" )
+            main.log.info( "I in host " + str( ip_address ) )
+            main.log.info( pingTestFile + " > " + pingTestResultFile + " &" )
             self.handle.sendline(
                 pingTestFile +
                 " > " +
@@ -447,12 +406,12 @@
             main.log.info( "NO HANDLE" )
             return main.FALSE
 
-    # Please use the generateRoutes plus addRoutes instead of this one
+    # Please use the generateRoutes plus addRoutes instead of this one!
     def addRoute( self, net, numRoutes, routeRate ):
         try:
             self.handle.sendline( "" )
             self.handle.expect( "config-router" )
-        except:
+        except Exception:
             main.log.warn( "Probably not in config-router mode!" )
             self.disconnect()
         main.log.info( "Adding Routes" )
@@ -467,13 +426,13 @@
             numRoutes = 255
         for m in range( 1, j + 1 ):
             for n in range( 1, numRoutes + 1 ):
-                network = str( net ) + "." + str( m ) + \
-                              "." + str( n ) + ".0/24"
+                network = str( net ) + "." + str( m ) + "." + str( n ) \
+                    + ".0/24"
                 routeCmd = "network " + network
                 try:
                     self.handle.sendline( routeCmd )
                     self.handle.expect( "bgpd" )
-                except:
+                except Exception:
                     main.log.warn( "failed to add route" )
                     self.disconnect()
                 waitTimer = 1.00 / routeRate
@@ -481,29 +440,28 @@
                 routesAdded = routesAdded + 1
         for d in range( j + 1, j + 2 ):
             for e in range( 1, k + 1 ):
-                network = str(
-                    net ) + "." + str(
-                        d ) + "." + str(
-                            e ) + ".0/24"
+                network = str( net ) + "." + str( d ) + "." + str( e ) \
+                    + ".0/24"
                 routeCmd = "network " + network
                 try:
                     self.handle.sendline( routeCmd )
                     self.handle.expect( "bgpd" )
-                except:
+                except Exception:
                     main.log.warn( "failed to add route" )
-                    self.disconnect
+                    self.disconnect()
                 waitTimer = 1.00 / routeRate
                 time.sleep( waitTimer )
                 routesAdded = routesAdded + 1
         if routesAdded == numRoutes:
             return main.TRUE
         return main.FALSE
-
+    
+    # Please use deleteRoutes method instead of this one!
     def delRoute( self, net, numRoutes, routeRate ):
         try:
             self.handle.sendline( "" )
             self.handle.expect( "config-router" )
-        except:
+        except Exception:
             main.log.warn( "Probably not in config-router mode!" )
             self.disconnect()
         main.log.info( "Deleting Routes" )
@@ -518,13 +476,13 @@
             numRoutes = 255
         for m in range( 1, j + 1 ):
             for n in range( 1, numRoutes + 1 ):
-                network = str( net ) + "." + str( m ) + \
-                              "." + str( n ) + ".0/24"
+                network = str( net ) + "." + str( m ) + "." + str( n ) \
+                    + ".0/24"
                 routeCmd = "no network " + network
                 try:
                     self.handle.sendline( routeCmd )
                     self.handle.expect( "bgpd" )
-                except:
+                except Exception:
                     main.log.warn( "Failed to delete route" )
                     self.disconnect()
                 waitTimer = 1.00 / routeRate
@@ -532,13 +490,13 @@
                 routesDeleted = routesDeleted + 1
         for d in range( j + 1, j + 2 ):
             for e in range( 1, k + 1 ):
-                network = str( net ) + "." + str( d ) + \
-                              "." + str( e ) + ".0/24"
+                network = str( net ) + "." + str( d ) + "." + str( e ) \
+                    + ".0/24"
                 routeCmd = "no network " + network
                 try:
                     self.handle.sendline( routeCmd )
                     self.handle.expect( "bgpd" )
-                except:
+                except Exception:
                     main.log.warn( "Failed to delete route" )
                     self.disconnect()
                 waitTimer = 1.00 / routeRate
@@ -554,7 +512,7 @@
             child = pexpect.spawn( "telnet " + ip )
             i = child.expect( [ "login:", "CLI#", pexpect.TIMEOUT ] )
             if i == 0:
-                print "Username and password required. Passing login info."
+                print "user_name and password required. Passing login info."
                 child.sendline( user )
                 child.expect( "Password:" )
                 child.sendline( passwd )
@@ -570,10 +528,8 @@
             child.expect( "Flow table show" )
             count = 0
             while True:
-                i = child.expect(
-                    [ '17\d\.\d{1,3}\.\d{1,3}\.\d{1,3}',
-                      'CLI#',
-                      pexpect.TIMEOUT ] )
+                i = child.expect( [ '17\d\.\d{1,3}\.\d{1,3}\.\d{1,3}', 
+                                   'CLI#', pexpect.TIMEOUT ] )
                 if i == 0:
                     count = count + 1
                 elif i == 1:
@@ -616,7 +572,8 @@
         response = ''
         try:
             self.handle.close()
-        except:
+        except Exception:
             main.log.error( "Connection failed to the host" )
             response = main.FALSE
         return response
+
diff --git a/TestON/drivers/common/clidriver.py b/TestON/drivers/common/clidriver.py
index 55ff522..44552ae 100644
--- a/TestON/drivers/common/clidriver.py
+++ b/TestON/drivers/common/clidriver.py
@@ -64,8 +64,7 @@
                 self.user_name +
                 '@' +
                 self.ip_address,
-                env={
-                    "TERM": "vt100" },
+                env={ "TERM": "xterm-mono" },
                 maxread=50000 )
         else:
             self.handle = pexpect.spawn(
@@ -73,6 +72,7 @@
                 self.user_name +
                 '@' +
                 self.ip_address,
+                env={ "TERM": "xterm-mono" },
                 maxread=1000000,
                 timeout=60 )
 
@@ -94,10 +94,17 @@
                 i = self.handle.expect(
                     [ ssh_newkey, 'password:', pexpect.EOF ] )
             if i == 1:
-                main.log.info(
-                    "ssh connection asked for password, gave password" )
-                self.handle.sendline( self.pwd )
-                self.handle.expect( '>|#|\$' )
+                if self.pwd:
+                    main.log.info(
+                        "ssh connection asked for password, gave password" )
+                    self.handle.sendline( self.pwd )
+                    self.handle.expect( '>|#|\$' )
+                else:
+                    # FIXME: TestON does not support a username having no
+                    #        password
+                    main.log.error( "Server asked for password, but none was "
+                                    "given in the .topo file" )
+                    main.exit()
             elif i == 2:
                 main.log.error( "Connection timeout" )
                 return main.FALSE
diff --git a/TestON/drivers/component.py b/TestON/drivers/component.py
index 1e87d03..f05be55 100644
--- a/TestON/drivers/component.py
+++ b/TestON/drivers/component.py
@@ -23,9 +23,6 @@
 
 
 """
-import re
-from logging import Logger
-
 
 class Component( object ):
 
@@ -35,30 +32,39 @@
     def __init__( self ):
         self.default = ''
         self.wrapped = sys.modules[ __name__ ]
+        self.count = 0
 
     def __getattr__( self, name ):
         """
          This will invoke, if the attribute wasn't found the usual ways.
-          Here it will look for assert_attribute and will execute when AttributeError occurs.
-          It will return the result of the assert_attribute.
+         Here it will look for assert_attribute and will execute when
+         AttributeError occurs.
+         It will return the result of the assert_attribute.
         """
         try:
             return getattr( self.wrapped, name )
-        except AttributeError:
+        except AttributeError as error:
+            # NOTE: The first time we load a driver module we get this error
+            if "'module' object has no attribute '__path__'" in error\
+                    and self.count == 0:
+                self.count += 1
+            else:
+                main.log.error( str(error.__class__) + " " + str(error) )
             try:
-                def experimentHandling( **kwargs ):
+                def experimentHandling( *args, **kwargs ):
                     if main.EXPERIMENTAL_MODE == main.TRUE:
-                        result = self.experimentRun( **kwargs )
-                        main.log.info( "EXPERIMENTAL MODE. API " + str(
-                            name ) + " not yet implemented. Returning dummy values" )
+                        result = self.experimentRun( *args, **kwargs )
+                        main.log.info( "EXPERIMENTAL MODE. API " +
+                                       str( name ) +
+                                       " not yet implemented. " +
+                                       "Returning dummy values" )
                         return result
                     else:
                         return main.FALSE
                 return experimentHandling
             except TypeError as e:
-                main.log.error(
-                    "Arguments for experimental mode does not have key 'retruns'" +
-                    e )
+                main.log.error( "Arguments for experimental mode does not" +
+                                " have key 'retruns'" + e )
 
     def connect( self ):
 
@@ -110,7 +116,8 @@
     def get_version( self ):
         return "Version unknown"
 
-    def experimentRun( self, **kwargs ):
+    def experimentRun( self, *args, **kwargs ):
+        # FIXME handle *args
         args = utilities.parse_args( [ "RETURNS" ], **kwargs )
         return args[ "RETURNS" ]
 
diff --git a/TestON/lib/Mininet/INSTALL b/TestON/lib/Mininet/INSTALL
deleted file mode 100644
index d3e4695..0000000
--- a/TestON/lib/Mininet/INSTALL
+++ /dev/null
@@ -1,123 +0,0 @@
-
-Mininet Installation/Configuration Notes
-----------------------------------------
-
-Mininet 2.0.0
----
-
-The supported installation methods for Mininet are 1) using a
-pre-built VM image, and 2) native installation on Ubuntu. You can also
-easily create your own Mininet VM image (4).
-
-(Other distributions may be supported in the future - if you would
-like to contribute an installation script, we would welcome it!)
-
-1. Easiest "installation" - use our pre-built VM image!
-
-   The easiest way to get Mininet running is to start with one of our
-   pre-built virtual machine images from <http://openflow.org/mininet>
-
-   Boot up the VM image, log in, and follow the instructions on the
-   Mininet web site.
-
-   One advantage of using the VM image is that it doesn't mess with
-   your native OS installation or damage it in any way.
-
-   Although a single Mininet instance can simulate multiple networks
-   with multiple controllers, only one Mininet instance may currently
-   be run at a time, and Mininet requires root access in the machine
-   it's running on.  Therefore, if you have a multiuser system, you
-   may wish to consider running Mininet in a VM.
-
-2. Next-easiest option: use our Ubuntu package!
-
-   To install Mininet itself (i.e. `mn` and the Python API) on Ubuntu
-   12.10+:
-
-        sudo apt-get install mininet
-
-   Note: if you are upgrading from an older version of Mininet, make
-   sure you remove the old OVS from `/usr/local`:
-
-        sudo rm /usr/local/bin/ovs*
-        sudo rm /usr/local/sbin/ovs*
-
-3. Native installation from source on Ubuntu 11.10+
-
-   If you're reading this, you've probably already done so, but the
-   command to download the Mininet source code is:
-
-        git clone git://github.com/mininet/mininet.git
-
-   If you are running Ubuntu, you may be able to use our handy
-   `install.sh` script, which is in `mininet/util`.
-
-   *WARNING: USE AT YOUR OWN RISK!*
-
-   `install.sh` is a bit intrusive and may possibly damage your OS
-   and/or home directory, by creating/modifying several directories
-   such as `mininet`, `openflow`, `oftest`, `pox`, or `noxcosre`.
-   Although we hope it won't do anything completely terrible, you may
-   want to look at the script before you run it, and you should make
-   sure your system and home directory are backed up just in case!
-
-   To install Mininet itself, the OpenFlow reference implementation, and
-   Open vSwitch, you may use:
-
-        mininet/util/install.sh -fnv
-
-   This should be reasonably quick, and the following command should
-   work after the installation:
-
-        sudo mn --test pingall
-
-   To install ALL of the software which we use for OpenFlow tutorials,
-   including POX, the OpenFlow WireShark dissector, the `oftest`
-   framework, and other potentially useful software (and to add some
-   stuff to `/etc/sysctl.conf` which may or may not be useful) you may
-   use:
-
-        mininet/util/install.sh -a
-
-   This takes about 4 minutes on our test system.
-
-4. Creating your own Mininet/OpenFlow tutorial VM
-
-   Creating your own Ubuntu Mininet VM for use with the OpenFlow tutorial
-   is easy! First, create a new Ubuntu VM. Next, run two commands in it:
-
-        wget https://raw.github.com/mininet/mininet/master/util/vm/install-mininet-vm.sh
-        time install-mininet-vm.sh
-
-   Finally, verify that Mininet is installed and working in the VM:
-
-        sudo mn --test pingall
-
-5. Installation on other Linux distributions
-
-   Although we don't support other Linux distributions directly, it
-   should be possible to install and run Mininet with some degree of
-   manual effort.
-
-   In general, you must have:
-
-   * A Linux kernel compiled with network namespace support enabled
-
-   * An OpenFlow implementation (either the reference user or kernel
-     space implementations, or Open vSwitch.) Appropriate kernel
-     modules (e.g. tun and ofdatapath for the reference kernel
-     implementation) must be loaded.
-
-   * Python, `bash`, `ping`, `iperf`, etc.`
-
-   * Root privileges (required for network device access)
-
-   We encourage contribution of patches to the `install.sh` script to
-   support other Linux distributions.
-
-
-Good luck!
-
-Mininet Team
-
----
diff --git a/TestON/tests/FuncNext13/FuncNext13.params b/TestON/tests/FuncNext13/FuncNext13.params
new file mode 100755
index 0000000..13a4691
--- /dev/null
+++ b/TestON/tests/FuncNext13/FuncNext13.params
@@ -0,0 +1,37 @@
+<PARAMS>
+    
+    <testcases>1,4,5,3</testcases>
+
+    #Environment variables
+    <ENV>
+        <cellName>driver_test</cellName>
+    </ENV>
+
+    <CTRL>
+        <ip1>10.128.20.11</ip1>
+        <port1>6633</port1>
+    </CTRL>
+
+    <PING>
+        <source1>h8</source1>
+        <source2>h9</source2>
+        <source3>h10</source3>
+        <source4>h11</source4>
+        <source5>h12</source5>
+        <source6>h13</source6>
+        <source7>h14</source7>
+        <source8>h15</source8>
+        <source9>h16</source9>
+        <source10>h17</source10>
+        <target1>10.0.0.18</target1>
+        <target2>10.0.0.19</target2>
+        <target3>10.0.0.20</target3>
+        <target4>10.0.0.21</target4>
+        <target5>10.0.0.22</target5>
+        <target6>10.0.0.23</target6>
+        <target7>10.0.0.24</target7>
+        <target8>10.0.0.25</target8>
+        <target9>10.0.0.26</target9>
+        <target10>10.0.0.27</target10>
+    </PING>
+</PARAMS>
diff --git a/TestON/tests/FuncNext13/FuncNext13.py b/TestON/tests/FuncNext13/FuncNext13.py
new file mode 100755
index 0000000..6b24695
--- /dev/null
+++ b/TestON/tests/FuncNext13/FuncNext13.py
@@ -0,0 +1,608 @@
+
+#Testing the basic functionality of ONOS Next
+#For sanity and driver functionality excercises only.
+
+import time
+import sys
+import os
+import re
+import time
+import json
+
+time.sleep(1)
+class FuncNext13:
+    def __init__(self):
+        self.default = ''
+
+    def CASE1(self, main):
+        '''
+        Startup sequence:
+        git pull
+        mvn clean install
+        onos-package
+        cell <name>
+        onos-verify-cell
+        onos-install -f
+        onos-wait-for-start
+        '''
+        
+        cell_name = main.params['ENV']['cellName']
+        ONOS1_ip = main.params['CTRL']['ip1']
+        ONOS1_port = main.params['CTRL']['port1']
+        
+        main.case("Setting up test environment")
+        
+        main.step("Git checkout and pull master and get version")
+        main.ONOSbench.git_checkout("master")
+        git_pull_result = main.ONOSbench.git_pull()
+        print "git_pull_result = ", git_pull_result
+        version_result = main.ONOSbench.get_version()
+
+        if git_pull_result == 1:
+            main.step("Using mvn clean & install")
+            clean_install_result = main.ONOSbench.clean_install()
+            #clean_install_result = main.TRUE
+
+        main.step("Applying cell variable to environment")
+        cell_result1 = main.ONOSbench.set_cell(cell_name)
+        verify_result = main.ONOSbench.verify_cell()
+        cell_result2 = main.ONOS2.set_cell(cell_name)
+        #verify_result = main.ONOS2.verify_cell()
+        main.ONOS2.start_onos_cli(ONOS_ip=main.params['CTRL']['ip1'])
+        
+        cell_result = cell_result1 and cell_result2
+
+        main.step("Creating ONOS package")
+        package_result = main.ONOSbench.onos_package()
+
+        #main.step("Creating a cell")
+        #cell_create_result = main.ONOSbench.create_cell_file(**************)
+
+        main.step("Installing ONOS package")
+        onos_install_result = main.ONOSbench.onos_install()
+        onos1_isup = main.ONOSbench.isup()
+   
+        main.step("Starting ONOS service")
+        start_result = main.ONOSbench.onos_start(ONOS1_ip)
+
+        case1_result = (package_result and\
+                cell_result and verify_result and onos_install_result and\
+                onos1_isup and start_result )
+        utilities.assert_equals(expect=main.TRUE, actual=case1_result,
+                onpass="Test startup successful",
+                onfail="Test startup NOT successful")
+
+    def CASE11(self, main):
+        '''
+        Cleanup sequence:
+        onos-service <node_ip> stop
+        onos-uninstall
+
+        TODO: Define rest of cleanup
+        
+        '''
+
+        ONOS1_ip = main.params['CTRL']['ip1']
+
+        main.case("Cleaning up test environment")
+
+        main.step("Testing ONOS kill function")
+        kill_result = main.ONOSbench.onos_kill(ONOS1_ip)
+
+        main.step("Stopping ONOS service")
+        stop_result = main.ONOSbench.onos_stop(ONOS1_ip)
+
+        main.step("Uninstalling ONOS service") 
+        uninstall_result = main.ONOSbench.onos_uninstall()
+
+    def CASE3(self, main):
+        '''
+        Test 'onos' command and its functionality in driver
+        '''
+        
+        ONOS1_ip = main.params['CTRL']['ip1']
+
+        main.case("Testing 'onos' command")
+
+        main.step("Sending command 'onos -w <onos-ip> system:name'")
+        cmdstr1 = "system:name"
+        cmd_result1 = main.ONOSbench.onos_cli(ONOS1_ip, cmdstr1) 
+        main.log.info("onos command returned: "+cmd_result1)
+
+        main.step("Sending command 'onos -w <onos-ip> onos:topology'")
+        cmdstr2 = "onos:topology"
+        cmd_result2 = main.ONOSbench.onos_cli(ONOS1_ip, cmdstr2)
+        main.log.info("onos command returned: "+cmd_result2)
+
+
+
+    def CASE4(self, main):
+        import re
+        import time
+        main.case("Pingall Test")
+        main.step("Assigning switches to controllers")
+        for i in range(1,29):
+            if i ==1:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+            elif i>=2 and i<5:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+            elif i>=5 and i<8:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+            elif i>=8 and i<18:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+            elif i>=18 and i<28:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+            else:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+        Switch_Mastership = main.TRUE
+        for i in range (1,29):
+            if i==1:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is " + str(response))
+                if re.search("tcp:"+ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+            elif i>=2 and i<5:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is " + str(response))
+                if re.search("tcp:"+ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+            elif i>=5 and i<8:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is " + str(response))
+                if re.search("tcp:"+ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+            elif i>=8 and i<18:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is " + str(response))
+                if re.search("tcp:"+ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+            elif i>=18 and i<28:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is " + str(response))
+                if re.search("tcp:"+ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+            else:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is" + str(response))
+                if re.search("tcp:" +ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+
+        if Switch_Mastership == main.TRUE:
+            main.log.report("MasterControllers assigned correctly")
+        utilities.assert_equals(expect = main.TRUE,actual=Switch_Mastership,
+                onpass="MasterControllers assigned correctly")
+        '''
+        for i in range (1,29):
+            main.Mininet1.assign_sw_controller(sw=str(i),count=5,
+                    ip1=ONOS1_ip,port1=ONOS1_port,
+                    ip2=ONOS2_ip,port2=ONOS2_port,
+                    ip3=ONOS3_ip,port3=ONOS3_port,
+                    ip4=ONOS4_ip,port4=ONOS4_port,
+                    ip5=ONOS5_ip,port5=ONOS5_port)
+        '''
+        #REACTIVE FWD test
+
+        main.step("Get list of hosts from Mininet")
+        host_list = main.Mininet1.get_hosts()
+        main.log.info(host_list)
+
+        main.step("Get host list in ONOS format")
+        host_onos_list = main.ONOS2.get_hosts_id(host_list)
+        main.log.info(host_onos_list)
+        #time.sleep(5)
+
+        #We must use ping from hosts we want to add intents from 
+        #to make the hosts talk
+        #main.Mininet2.handle.sendline("\r")
+        #main.Mininet2.handle.sendline("h4 ping 10.1.1.1 -c 1 -W 1")
+        #time.sleep(3)
+        #main.Mininet2.handle.sendline("h5 ping 10.1.1.1 -c 1 -W 1")
+        #time.sleep(5)
+        
+        main.step("Pingall")
+        ping_result = main.FALSE
+        while ping_result == main.FALSE:
+            time1 = time.time()
+            ping_result = main.Mininet1.pingall()
+            time2 = time.time()
+            print "Time for pingall: %2f seconds" % (time2 - time1)
+      
+        #Start onos cli again because u might have dropped out of onos prompt to the shell prompt
+        #if there was no activity
+        main.ONOS2.start_onos_cli(ONOS_ip=main.params['CTRL']['ip1'])
+
+        main.step("Get hosts")
+        main.ONOS2.handle.sendline("hosts")
+        main.ONOS2.handle.expect("onos>")
+        hosts = main.ONOS2.handle.before
+        main.log.info(hosts)
+
+        main.step("Get all devices id")
+        devices_id_list = main.ONOS2.get_all_devices_id()
+        main.log.info(devices_id_list)
+        
+        #ONOS displays the hosts in hex format unlike mininet which does in decimal format
+        #So take care while adding intents
+        
+        main.step("Add host-to-host intents for mininet hosts h8 and h18 or ONOS hosts h8 and h12")
+        hth_intent_result = main.ONOS2.add_host_intent("00:00:00:00:00:08/-1", "00:00:00:00:00:12/-1")
+        hth_intent_result = main.ONOS2.add_host_intent("00:00:00:00:00:09/-1", "00:00:00:00:00:13/-1")
+        hth_intent_result = main.ONOS2.add_host_intent("00:00:00:00:00:0A/-1", "00:00:00:00:00:14/-1")
+        hth_intent_result = main.ONOS2.add_host_intent("00:00:00:00:00:0B/-1", "00:00:00:00:00:15/-1")
+        hth_intent_result = main.ONOS2.add_host_intent("00:00:00:00:00:0C/-1", "00:00:00:00:00:16/-1")
+        hth_intent_result = main.ONOS2.add_host_intent("00:00:00:00:00:0D/-1", "00:00:00:00:00:17/-1")
+        hth_intent_result = main.ONOS2.add_host_intent("00:00:00:00:00:0E/-1", "00:00:00:00:00:18/-1")
+        hth_intent_result = main.ONOS2.add_host_intent("00:00:00:00:00:0F/-1", "00:00:00:00:00:19/-1")
+        hth_intent_result = main.ONOS2.add_host_intent("00:00:00:00:00:10/-1", "00:00:00:00:00:1A/-1") 
+        hth_intent_result = main.ONOS2.add_host_intent("00:00:00:00:00:11/-1", "00:00:00:00:00:1B/-1")
+
+ 
+        
+        print "_____________________________________________________________________________________"
+        ''' 
+        main.step("Add point-to-point intents for mininet hosts h8 and h18 or ONOS hosts h8 and h12")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000003008", 1, "of:0000000000006018", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000006018", 1, "of:0000000000003008", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        main.step("Add point-to-point intents for mininet hosts h9 and h19 or ONOS hosts h9 and h13")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000003009", 1, "of:0000000000006019", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000006019", 1, "of:0000000000003009", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+        
+        main.step("Add point-to-point intents for mininet hosts h10 and h20 or ONOS hosts hA and h14")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000003010", 1, "of:0000000000006020", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000006020", 1, "of:0000000000003010", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+            
+        main.step("Add point-to-point intents for mininet hosts h11 and h21 or ONOS hosts hB and h15")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000003011", 1, "of:0000000000006021", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000006021", 1, "of:0000000000003011", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+            
+        main.step("Add point-to-point intents for mininet hosts h12 and h22 or ONOS hosts hC and h16")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000003012", 1, "of:0000000000006022", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000006022", 1, "of:0000000000003012", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+            
+        main.step("Add point-to-point intents for mininet hosts h13 and h23 or ONOS hosts hD and h17")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000003013", 1, "of:0000000000006023", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000006023", 1, "of:0000000000003013", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+            
+        main.step("Add point-to-point intents for mininet hosts h14 and h24 or ONOS hosts hE and h18")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000003014", 1, "of:0000000000006024", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000006024", 1, "of:0000000000003014", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+            
+        main.step("Add point-to-point intents for mininet hosts h15 and h25 or ONOS hosts hF and h19")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000003015", 1, "of:0000000000006025", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000006025", 1, "of:0000000000003015", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+            
+        main.step("Add point-to-point intents for mininet hosts h16 and h26 or ONOS hosts h10 and h1A")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000003016", 1, "of:0000000000006026", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000006026", 1, "of:0000000000003016", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+        
+        main.step("Add point-to-point intents for mininet hosts h17 and h27 or ONOS hosts h11 and h1B")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000003017", 1, "of:0000000000006027", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+       
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000000000006027", 1, "of:0000000000003017", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+
+        print("_______________________________________________________________________________________")
+        '''
+
+        #Unistall onos-app-fwd app to disable reactive forwarding
+        appUninstall_result = main.ONOS2.feature_uninstall("onos-app-fwd")
+        main.log.info("onos-app-fwd uninstalled")
+
+        #After reactive forwarding is disabled, the reactive flows on switches timeout in 10-15s
+        #So sleep for 15s
+        time.sleep(15)
+        
+        flowHandle = main.ONOS2.flows()
+        print "flowHandle = ", flowHandle
+
+        count = 1
+        i = 8
+        Ping_Result = main.TRUE
+        #while i<10:
+        while i <18 :
+            main.log.info("\n\nh"+str(i)+" is Pinging h" + str(i+10))
+            ping = main.Mininet1.pingHost(src="h"+str(i),target="h"+str(i+10))
+            if ping == main.FALSE and count <5:
+                count+=1
+                i = 8
+                Ping_Result = main.FALSE
+                main.log.report("Ping between h" + str(i) + " and h" + str(i+10) + " failed. Making attempt number "+str(count) + " in 2 seconds")
+                time.sleep(2)
+            elif ping==main.FALSE:
+                main.log.report("All ping attempts have failed")
+                i=19
+                Ping_Result = main.FALSE
+            elif ping==main.TRUE:
+                main.log.info("Ping test passed!")
+                i+=1
+                Ping_Result = main.TRUE
+            else:
+                main.log.info("Unknown error")
+                Ping_Result = main.ERROR
+        if Ping_Result==main.FALSE:
+            main.log.report("Intents have not ben installed correctly. Cleaning up")
+            #main.cleanup()
+            #main.exit()
+        if Ping_Result==main.TRUE:
+            main.log.report("Intents have been installed correctly")
+            
+        case4_result = Switch_Mastership and Ping_Result
+        utilities.assert_equals(expect=main.TRUE, actual=case4_result,
+                onpass="Pingall Test successful",
+                onfail="Pingall Test NOT successful")
+
+    def CASE5(self,main) :
+        import json
+        from subprocess import Popen, PIPE
+        from sts.topology.teston_topology import TestONTopology # assumes that sts is already in you PYTHONPATH
+        #main.ONOS2.start_onos_cli(ONOS_ip=main.params['CTRL']['ip1'])
+        deviceResult = main.ONOS2.devices()
+        linksResult = main.ONOS2.links()
+        portsResult = main.ONOS2.ports()
+        print "**************"
+        main.step("Start continuous pings")
+        main.Mininet2.pingLong(src=main.params['PING']['source1'],
+                            target=main.params['PING']['target1'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source2'],
+                            target=main.params['PING']['target2'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source3'],
+                            target=main.params['PING']['target3'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source4'],
+                            target=main.params['PING']['target4'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source5'],
+                            target=main.params['PING']['target5'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source6'],
+                            target=main.params['PING']['target6'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source7'],
+                            target=main.params['PING']['target7'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source8'],
+                            target=main.params['PING']['target8'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source9'],
+                            target=main.params['PING']['target9'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source10'],
+                            target=main.params['PING']['target10'],pingTime=500)
+
+        main.step("Create TestONTopology object")
+        global ctrls
+        ctrls = []
+        count = 1
+        while True:
+            temp = ()
+            if ('ip' + str(count)) in main.params['CTRL']:
+                temp = temp + (getattr(main,('ONOS' + str(count))),)
+                temp = temp + ("ONOS"+str(count),)
+                temp = temp + (main.params['CTRL']['ip'+str(count)],)
+                temp = temp + (eval(main.params['CTRL']['port'+str(count)]),)
+                ctrls.append(temp)
+                count = count + 1
+            else:
+                break
+        global MNTopo
+        Topo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        MNTopo = Topo
+
+        Topology_Check = main.TRUE
+        main.step("Compare ONOS Topology to MN Topology")
+        devices_json = main.ONOS2.devices()
+        links_json = main.ONOS2.links()
+        ports_json = main.ONOS2.ports()
+        print "devices_json= ", devices_json
+        
+        result1 = main.Mininet1.compare_switches(MNTopo, json.loads(devices_json))
+        print "***********************"
+        result2 = main.Mininet1.compare_links(MNTopo, json.loads(links_json))
+        print "***********************"
+        result3 = main.Mininet1.compare_ports(MNTopo, json.loads(ports_json))
+            
+        result = result1 and result2 and result3
+        print "***********************"
+        if result == main.TRUE:
+            main.log.report("ONOS"+ " Topology matches MN Topology")
+        utilities.assert_equals(expect=main.TRUE,actual=result,
+            onpass="ONOS" + " Topology matches MN Topology",
+            onfail="ONOS" + " Topology does not match MN Topology")
+        Topology_Check = Topology_Check and result
+        utilities.assert_equals(expect=main.TRUE,actual=Topology_Check,
+            onpass="Topology checks passed", onfail="Topology checks failed")
+    
+
+    def CASE7 (self,main):
+       
+        ONOS1_ip = main.params['CTRL']['ip1']
+
+        link_sleep = int(main.params['timers']['LinkDiscovery'])
+
+        main.log.report("Killing a link to ensure that link discovery is consistent")
+        main.case("Killing a link to Ensure that Link Discovery is Working Properly")
+        main.step("Start continuous pings")
+       
+        main.Mininet2.pingLong(src=main.params['PING']['source1'],
+                            target=main.params['PING']['target1'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source2'],
+                            target=main.params['PING']['target2'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source3'],
+                            target=main.params['PING']['target3'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source4'],
+                            target=main.params['PING']['target4'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source5'],
+                            target=main.params['PING']['target5'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source6'],
+                            target=main.params['PING']['target6'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source7'],
+                            target=main.params['PING']['target7'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source8'],
+                            target=main.params['PING']['target8'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source9'],
+                            target=main.params['PING']['target9'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source10'],
+                            target=main.params['PING']['target10'],pingTime=500)
+
+
+        main.step("Determine the current number of switches and links")
+        topology_output = main.ONOS2.topology()
+        topology_result = main.ONOS1.get_topology(topology_output)
+        activeSwitches = topology_result['devices']
+        links = topology_result['links']
+        print "activeSwitches = ", type(activeSwitches)
+        print "links = ", type(links)
+        main.log.info("Currently there are %s switches and %s links"  %(str(activeSwitches), str(links)))
+
+        main.step("Kill Link between s3 and s28")
+        main.Mininet1.link(END1="s3",END2="s28",OPTION="down")
+        time.sleep(link_sleep)
+        topology_output = main.ONOS2.topology()
+        Link_Down = main.ONOS1.check_status(topology_output,activeSwitches,str(int(links)-2))
+        if Link_Down == main.TRUE:
+            main.log.report("Link Down discovered properly")
+        utilities.assert_equals(expect=main.TRUE,actual=Link_Down,
+                onpass="Link Down discovered properly",
+                onfail="Link down was not discovered in "+ str(link_sleep) + " seconds")
+        
+        main.step("Bring link between s3 and s28 back up")
+        Link_Up = main.Mininet1.link(END1="s3",END2="s28",OPTION="up")
+        time.sleep(link_sleep)
+        topology_output = main.ONOS2.topology()
+        Link_Up = main.ONOS1.check_status(topology_output,activeSwitches,str(links))
+        if Link_Up == main.TRUE:
+            main.log.report("Link up discovered properly")
+        utilities.assert_equals(expect=main.TRUE,actual=Link_Up,
+                onpass="Link up discovered properly",
+                onfail="Link up was not discovered in "+ str(link_sleep) + " seconds")
+
+
+
+
+        main.step("Compare ONOS Topology to MN Topology")
+        Topo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        MNTopo = Topo
+        Topology_Check = main.TRUE
+        devices_json = main.ONOS2.devices()
+        links_json = main.ONOS2.links()
+        ports_json = main.ONOS2.ports()
+        print "devices_json= ", devices_json
+        
+        result1 = main.Mininet1.compare_switches(MNTopo, json.loads(devices_json))
+        print "***********************"
+        result2 = main.Mininet1.compare_links(MNTopo, json.loads(links_json))
+        print "***********************"
+        result3 = main.Mininet1.compare_ports(MNTopo, json.loads(ports_json))
+            
+        result = result1 and result2 and result3
+        print "***********************"
+        if result == main.TRUE:
+            main.log.report("ONOS"+ " Topology matches MN Topology")
+        utilities.assert_equals(expect=main.TRUE,actual=result,
+            onpass="ONOS" + " Topology matches MN Topology",
+            onfail="ONOS" + " Topology does not match MN Topology")
+        Topology_Check = Topology_Check and result
+        utilities.assert_equals(expect=main.TRUE,actual=Topology_Check,
+            onpass="Topology checks passed", onfail="Topology checks failed")
+    
+        result = Link_Down and Link_Up and Topology_Check
+        utilities.assert_equals(expect=main.TRUE,actual=result,
+                onpass="Link failure is discovered correctly",
+                onfail="Link Discovery failed")
+
+
+
diff --git a/TestON/tests/FuncNext13/FuncNext13.topo b/TestON/tests/FuncNext13/FuncNext13.topo
new file mode 100755
index 0000000..85b6cab
--- /dev/null
+++ b/TestON/tests/FuncNext13/FuncNext13.topo
@@ -0,0 +1,61 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOSbench>
+
+        <ONOS1>
+            <host>10.128.10.11</host>
+            <user>sdn</user>
+            <password>sdn</password>
+            <type>OnosDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOS2>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS2>
+
+        <Mininet1>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>MininetCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS>
+                #Specify the Option for mininet
+                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
+                <arg2> --topo mytopo </arg2>
+                <arg3> --switch ovs,protocols=OpenFlow13</arg3>
+                <controller> remote </controller>
+            </COMPONENTS>
+        </Mininet1>
+
+        <Mininet2>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>RemoteMininetDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                #Specify the Option for mininet
+                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
+                <arg2> --topo mytopo </arg2>
+                <arg3> --switch ovs,protocols=OpenFlow13 </arg3>
+                <controller> remote </controller>
+            </COMPONENTS>
+        </Mininet2>
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FuncNext13/__init__.py b/TestON/tests/FuncNext13/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FuncNext13/__init__.py
diff --git a/TestON/tests/HATestClusterRestart/HATestClusterRestart.params b/TestON/tests/HATestClusterRestart/HATestClusterRestart.params
index 38a9b02..123fd0f 100644
--- a/TestON/tests/HATestClusterRestart/HATestClusterRestart.params
+++ b/TestON/tests/HATestClusterRestart/HATestClusterRestart.params
@@ -1,9 +1,10 @@
 <PARAMS>
     <testcases>1,2,8,3,4,5,14,[6],8,3,7,4,15,9,8,4,10,8,4,11,8,4,12,8,4,13</testcases>
     <ENV>
-    <cellName>HA</cellName>
+        <cellName>HA</cellName>
     </ENV>
     <Git>False</Git>
+    <branch> master </branch>
     <num_controllers> 7 </num_controllers>
 
     <CTRL>
@@ -56,6 +57,11 @@
         <LinkDiscovery>.2</LinkDiscovery>
         <SwitchDiscovery>.2</SwitchDiscovery>
     </timers>
+    <kill>
+        <switch> s5 </switch>
+        <dpid> 0000000000005000 </dpid>
+        <links> h5 s2 s1 s6 </links>
+    </kill>
     <MNtcpdump>
         <intf>eth0</intf>
         <port> </port>
diff --git a/TestON/tests/HATestClusterRestart/HATestClusterRestart.py b/TestON/tests/HATestClusterRestart/HATestClusterRestart.py
index b9a07b9..6655f33 100644
--- a/TestON/tests/HATestClusterRestart/HATestClusterRestart.py
+++ b/TestON/tests/HATestClusterRestart/HATestClusterRestart.py
@@ -1,4 +1,4 @@
-'''
+"""
 Description: This test is to determine if ONOS can handle
     all of it's nodes restarting
 
@@ -18,794 +18,1092 @@
 CASE13: Clean up
 CASE14: start election app on all onos nodes
 CASE15: Check that Leadership Election is still functional
-'''
+"""
+
+
 class HATestClusterRestart:
 
-    def __init__(self) :
+    def __init__( self ):
         self.default = ''
 
-    def CASE1(self,main) :
-        '''
+    def CASE1( self, main ):
+        """
         CASE1 is to compile ONOS and push it to the test machines
 
         Startup sequence:
-        git pull
-        mvn clean install
-        onos-package
         cell <name>
         onos-verify-cell
         NOTE: temporary - onos-remove-raft-logs
+        onos-uninstall
+        start mininet
+        git pull
+        mvn clean install
+        onos-package
         onos-install -f
         onos-wait-for-start
-        '''
-        import time
-        main.log.report("ONOS HA test: Restart all ONOS nodes - initialization")
-        main.case("Setting up test environment")
+        start cli sessions
+        start tcpdump
+        """
+        main.log.report( "ONOS HA test: Restart all ONOS nodes - " +
+                         "initialization" )
+        main.case( "Setting up test environment" )
+        # TODO: save all the timers and output them for plotting
 
         # load some vairables from the params file
-        PULL_CODE = False
-        if main.params['Git'] == 'True':
-            PULL_CODE = True
-        cell_name = main.params['ENV']['cellName']
+        PULLCODE = False
+        if main.params[ 'Git' ] == 'True':
+            PULLCODE = True
+        gitBranch = main.params[ 'branch' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
 
-        #set global variables
-        global ONOS1_ip
-        global ONOS1_port
-        global ONOS2_ip
-        global ONOS2_port
-        global ONOS3_ip
-        global ONOS3_port
-        global ONOS4_ip
-        global ONOS4_port
-        global ONOS5_ip
-        global ONOS5_port
-        global ONOS6_ip
-        global ONOS6_port
-        global ONOS7_ip
-        global ONOS7_port
-        global num_controllers
+        # set global variables
+        global ONOS1Ip
+        global ONOS1Port
+        global ONOS2Ip
+        global ONOS2Port
+        global ONOS3Ip
+        global ONOS3Port
+        global ONOS4Ip
+        global ONOS4Port
+        global ONOS5Ip
+        global ONOS5Port
+        global ONOS6Ip
+        global ONOS6Port
+        global ONOS7Ip
+        global ONOS7Port
+        global numControllers
 
-        ONOS1_ip = main.params['CTRL']['ip1']
-        ONOS1_port = main.params['CTRL']['port1']
-        ONOS2_ip = main.params['CTRL']['ip2']
-        ONOS2_port = main.params['CTRL']['port2']
-        ONOS3_ip = main.params['CTRL']['ip3']
-        ONOS3_port = main.params['CTRL']['port3']
-        ONOS4_ip = main.params['CTRL']['ip4']
-        ONOS4_port = main.params['CTRL']['port4']
-        ONOS5_ip = main.params['CTRL']['ip5']
-        ONOS5_port = main.params['CTRL']['port5']
-        ONOS6_ip = main.params['CTRL']['ip6']
-        ONOS6_port = main.params['CTRL']['port6']
-        ONOS7_ip = main.params['CTRL']['ip7']
-        ONOS7_port = main.params['CTRL']['port7']
-        num_controllers = int(main.params['num_controllers'])
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
+        ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
+        ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
+        ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
+        ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
+        ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
+        numControllers = int( main.params[ 'num_controllers' ] )
 
+        main.step( "Applying cell variable to environment" )
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
-        main.step("Applying cell variable to environment")
-        cell_result = main.ONOSbench.set_cell(cell_name)
-        verify_result = main.ONOSbench.verify_cell()
+        # FIXME:this is short term fix
+        main.log.report( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftLogs()
+        main.log.report( "Uninstalling ONOS" )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+        main.ONOSbench.onosUninstall( ONOS2Ip )
+        main.ONOSbench.onosUninstall( ONOS3Ip )
+        main.ONOSbench.onosUninstall( ONOS4Ip )
+        main.ONOSbench.onosUninstall( ONOS5Ip )
+        main.ONOSbench.onosUninstall( ONOS6Ip )
+        main.ONOSbench.onosUninstall( ONOS7Ip )
 
-        #FIXME:this is short term fix
-        main.log.report("Removing raft logs")
-        main.ONOSbench.onos_remove_raft_logs()
-        main.log.report("Uninstalling ONOS")
-        main.ONOSbench.onos_uninstall(ONOS1_ip)
-        main.ONOSbench.onos_uninstall(ONOS2_ip)
-        main.ONOSbench.onos_uninstall(ONOS3_ip)
-        main.ONOSbench.onos_uninstall(ONOS4_ip)
-        main.ONOSbench.onos_uninstall(ONOS5_ip)
-        main.ONOSbench.onos_uninstall(ONOS6_ip)
-        main.ONOSbench.onos_uninstall(ONOS7_ip)
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
 
-        clean_install_result = main.TRUE
-        git_pull_result = main.TRUE
+        main.step( "Starting Mininet" )
+        main.Mininet1.startNet( )
 
-        main.step("Compiling the latest version of ONOS")
-        if PULL_CODE:
-            main.step("Git checkout and pull master")
-            main.ONOSbench.git_checkout("master")
-            git_pull_result = main.ONOSbench.git_pull()
+        main.step( "Compiling the latest version of ONOS" )
+        if PULLCODE:
+            main.step( "Git checkout and pull " + gitBranch )
+            main.ONOSbench.gitCheckout( gitBranch )
+            gitPullResult = main.ONOSbench.gitPull()
 
-            main.step("Using mvn clean & install")
-            clean_install_result = main.TRUE
-            if git_pull_result == main.TRUE:
-                clean_install_result = main.ONOSbench.clean_install()
-            else:
-                main.log.warn("Did not pull new code so skipping mvn "+ \
-                        "clean install")
-        main.ONOSbench.get_version(report=True)
+            main.step( "Using mvn clean & install" )
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
 
-        main.step("Creating ONOS package")
-        package_result = main.ONOSbench.onos_package()
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
 
-        main.step("Installing ONOS package")
-        onos1_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS1_ip)
-        onos2_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS2_ip)
-        onos3_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS3_ip)
-        onos4_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS4_ip)
-        onos5_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS5_ip)
-        onos6_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS6_ip)
-        onos7_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS7_ip)
-        onos_install_result = onos1_install_result and onos2_install_result\
-                and onos3_install_result and onos4_install_result\
-                and onos5_install_result and onos6_install_result\
-                and onos7_install_result
-        '''
-        #FIXME: work around until onos is less fragile
-        main.ONOSbench.handle.sendline("onos-cluster-install")
-        print main.ONOSbench.handle.expect("\$")
-        onos_install_result = main.TRUE
-        '''
+        main.step( "Installing ONOS package" )
+        onos1InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS1Ip )
+        onos2InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS2Ip )
+        onos3InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS3Ip )
+        onos4InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS4Ip )
+        onos5InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS5Ip )
+        onos6InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS6Ip )
+        onos7InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS7Ip )
+        onosInstallResult = onos1InstallResult and onos2InstallResult\
+            and onos3InstallResult and onos4InstallResult\
+            and onos5InstallResult and onos6InstallResult\
+            and onos7InstallResult
 
-
-        main.step("Checking if ONOS is up yet")
-        #TODO check bundle:list?
-        for i in range(2):
-            onos1_isup = main.ONOSbench.isup(ONOS1_ip)
-            if not onos1_isup:
-                main.log.report("ONOS1 didn't start!")
-            onos2_isup = main.ONOSbench.isup(ONOS2_ip)
-            if not onos2_isup:
-                main.log.report("ONOS2 didn't start!")
-            onos3_isup = main.ONOSbench.isup(ONOS3_ip)
-            if not onos3_isup:
-                main.log.report("ONOS3 didn't start!")
-            onos4_isup = main.ONOSbench.isup(ONOS4_ip)
-            if not onos4_isup:
-                main.log.report("ONOS4 didn't start!")
-            onos5_isup = main.ONOSbench.isup(ONOS5_ip)
-            if not onos5_isup:
-                main.log.report("ONOS5 didn't start!")
-            onos6_isup = main.ONOSbench.isup(ONOS6_ip)
-            if not onos6_isup:
-                main.log.report("ONOS6 didn't start!")
-            onos7_isup = main.ONOSbench.isup(ONOS7_ip)
-            if not onos7_isup:
-                main.log.report("ONOS7 didn't start!")
-            onos_isup_result = onos1_isup and onos2_isup and onos3_isup\
-                    and onos4_isup and onos5_isup and onos6_isup and onos7_isup
-            if onos_isup_result == main.TRUE:
+        main.step( "Checking if ONOS is up yet" )
+        for i in range( 2 ):
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            if not onos1Isup:
+                main.log.report( "ONOS1 didn't start!" )
+                main.ONOSbench.onosStop( ONOS1Ip )
+                main.ONOSbench.onosStart( ONOS1Ip )
+            onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+            if not onos2Isup:
+                main.log.report( "ONOS2 didn't start!" )
+                main.ONOSbench.onosStop( ONOS2Ip )
+                main.ONOSbench.onosStart( ONOS2Ip )
+            onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+            if not onos3Isup:
+                main.log.report( "ONOS3 didn't start!" )
+                main.ONOSbench.onosStop( ONOS3Ip )
+                main.ONOSbench.onosStart( ONOS3Ip )
+            onos4Isup = main.ONOSbench.isup( ONOS4Ip )
+            if not onos4Isup:
+                main.log.report( "ONOS4 didn't start!" )
+                main.ONOSbench.onosStop( ONOS4Ip )
+                main.ONOSbench.onosStart( ONOS4Ip )
+            onos5Isup = main.ONOSbench.isup( ONOS5Ip )
+            if not onos5Isup:
+                main.log.report( "ONOS5 didn't start!" )
+                main.ONOSbench.onosStop( ONOS5Ip )
+                main.ONOSbench.onosStart( ONOS5Ip )
+            onos6Isup = main.ONOSbench.isup( ONOS6Ip )
+            if not onos6Isup:
+                main.log.report( "ONOS6 didn't start!" )
+                main.ONOSbench.onosStop( ONOS6Ip )
+                main.ONOSbench.onosStart( ONOS6Ip )
+            onos7Isup = main.ONOSbench.isup( ONOS7Ip )
+            if not onos7Isup:
+                main.log.report( "ONOS7 didn't start!" )
+                main.ONOSbench.onosStop( ONOS7Ip )
+                main.ONOSbench.onosStart( ONOS7Ip )
+            onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
+                and onos4Isup and onos5Isup and onos6Isup and onos7Isup
+            if onosIsupResult == main.TRUE:
                 break
-        # TODO: if it becomes an issue, we can retry this step  a few times
 
+        cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
+        cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
+        cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
+        cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
+        cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
+        cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
+        cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
+        cliResults = cliResult1 and cliResult2 and cliResult3 and\
+            cliResult4 and cliResult5 and cliResult6 and cliResult7
 
-        cli_result1 = main.ONOScli1.start_onos_cli(ONOS1_ip)
-        cli_result2 = main.ONOScli2.start_onos_cli(ONOS2_ip)
-        cli_result3 = main.ONOScli3.start_onos_cli(ONOS3_ip)
-        cli_result4 = main.ONOScli4.start_onos_cli(ONOS4_ip)
-        cli_result5 = main.ONOScli5.start_onos_cli(ONOS5_ip)
-        cli_result6 = main.ONOScli6.start_onos_cli(ONOS6_ip)
-        cli_result7 = main.ONOScli7.start_onos_cli(ONOS7_ip)
-        cli_results = cli_result1 and cli_result2 and cli_result3 and\
-                cli_result4 and cli_result5 and cli_result6 and cli_result7
+        main.step( "Start Packet Capture MN" )
+        main.Mininet2.startTcpdump(
+            str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
+            + "-MN.pcap",
+            intf=main.params[ 'MNtcpdump' ][ 'intf' ],
+            port=main.params[ 'MNtcpdump' ][ 'port' ] )
 
-        main.step("Start Packet Capture MN")
-        main.Mininet2.start_tcpdump(
-                str(main.params['MNtcpdump']['folder'])+str(main.TEST)+"-MN.pcap",
-                intf = main.params['MNtcpdump']['intf'],
-                port = main.params['MNtcpdump']['port'])
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and onosInstallResult
+                        and onosIsupResult and cliResults )
 
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+                                 onpass="Test startup successful",
+                                 onfail="Test startup NOT successful" )
 
-        case1_result = (clean_install_result and package_result and
-                cell_result and verify_result and onos_install_result and
-                onos_isup_result and cli_results)
-
-        utilities.assert_equals(expect=main.TRUE, actual=case1_result,
-                onpass="Test startup successful",
-                onfail="Test startup NOT successful")
-
-
-        if case1_result==main.FALSE:
+        if case1Result == main.FALSE:
             main.cleanup()
             main.exit()
 
-    def CASE2(self,main) :
-        '''
+    def CASE2( self, main ):
+        """
         Assign mastership to controllers
-        '''
-        import time
-        import json
+        """
         import re
 
-        main.log.report("Assigning switches to controllers")
-        main.case("Assigning Controllers")
-        main.step("Assign switches to controllers")
+        main.log.report( "Assigning switches to controllers" )
+        main.case( "Assigning Controllers" )
+        main.step( "Assign switches to controllers" )
 
-        for i in range (1,29):
-           main.Mininet1.assign_sw_controller(sw=str(i),count=num_controllers,
-                    ip1=ONOS1_ip,port1=ONOS1_port,
-                    ip2=ONOS2_ip,port2=ONOS2_port,
-                    ip3=ONOS3_ip,port3=ONOS3_port,
-                    ip4=ONOS4_ip,port4=ONOS4_port,
-                    ip5=ONOS5_ip,port5=ONOS5_port,
-                    ip6=ONOS6_ip,port6=ONOS6_port,
-                    ip7=ONOS7_ip,port7=ONOS7_port)
+        for i in range( 1, 29 ):
+            main.Mininet1.assignSwController(
+                sw=str( i ),
+                count=numControllers,
+                ip1=ONOS1Ip, port1=ONOS1Port,
+                ip2=ONOS2Ip, port2=ONOS2Port,
+                ip3=ONOS3Ip, port3=ONOS3Port,
+                ip4=ONOS4Ip, port4=ONOS4Port,
+                ip5=ONOS5Ip, port5=ONOS5Port,
+                ip6=ONOS6Ip, port6=ONOS6Port,
+                ip7=ONOS7Ip, port7=ONOS7Port )
 
-        mastership_check = main.TRUE
-        for i in range (1,29):
-            response = main.Mininet1.get_sw_controller("s"+str(i))
+        mastershipCheck = main.TRUE
+        for i in range( 1, 29 ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
             try:
-                main.log.info(str(response))
-            except:
-                main.log.info(repr(response))
-            if re.search("tcp:"+ONOS1_ip,response)\
-                    and re.search("tcp:"+ONOS2_ip,response)\
-                    and re.search("tcp:"+ONOS3_ip,response)\
-                    and re.search("tcp:"+ONOS4_ip,response)\
-                    and re.search("tcp:"+ONOS5_ip,response)\
-                    and re.search("tcp:"+ONOS6_ip,response)\
-                    and re.search("tcp:"+ONOS7_ip,response):
-                mastership_check = mastership_check and main.TRUE
+                main.log.info( str( response ) )
+            except Exception:
+                main.log.info( repr( response ) )
+            if re.search( "tcp:" + ONOS1Ip, response )\
+                    and re.search( "tcp:" + ONOS2Ip, response )\
+                    and re.search( "tcp:" + ONOS3Ip, response )\
+                    and re.search( "tcp:" + ONOS4Ip, response )\
+                    and re.search( "tcp:" + ONOS5Ip, response )\
+                    and re.search( "tcp:" + ONOS6Ip, response )\
+                    and re.search( "tcp:" + ONOS7Ip, response ):
+                mastershipCheck = mastershipCheck and main.TRUE
             else:
-                mastership_check = main.FALSE
-        if mastership_check == main.TRUE:
-            main.log.report("Switch mastership assigned correctly")
-        utilities.assert_equals(expect = main.TRUE,actual=mastership_check,
-                onpass="Switch mastership assigned correctly",
-                onfail="Switches not assigned correctly to controllers")
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
+            main.log.report( "Switch mastership assigned correctly" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=mastershipCheck,
+            onpass="Switch mastership assigned correctly",
+            onfail="Switches not assigned correctly to controllers" )
 
-        #Manually assign mastership to the controller we want
-        role_call = main.TRUE
-        role_check = main.TRUE
+        # Manually assign mastership to the controller we want
+        roleCall = main.TRUE
+        roleCheck = main.TRUE
+        try:
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+            assert deviceId, "No device id for s1 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS1Ip )
+            # Check assignment
+            if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("1000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS1_ip)
-        if ONOS1_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+            assert deviceId, "No device id for s28 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS1Ip )
+            # Check assignment
+            if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("2800")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS1_ip)
-        if ONOS1_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+            assert deviceId, "No device id for s2 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS2Ip )
+            # Check assignment
+            if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("2000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS2_ip)
-        if ONOS2_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+            assert deviceId, "No device id for s3 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS2Ip )
+            # Check assignment
+            if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("3000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS2_ip)
-        if ONOS2_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+            assert deviceId, "No device id for s5 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS3Ip )
+            # Check assignment
+            if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("5000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS3_ip)
-        if ONOS3_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+            assert deviceId, "No device id for s6 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS3Ip )
+            # Check assignment
+            if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("6000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS3_ip)
-        if ONOS3_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+            assert deviceId, "No device id for s4 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS4Ip )
+            # Check assignment
+            if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id =  main.ONOScli1.get_device("3004")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS4_ip)
-        if ONOS4_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            for i in range( 8, 18 ):
+                dpid = '3' + str( i ).zfill( 3 )
+                deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+                assert deviceId, "No device id for s%i in ONOS" % i
+                roleCall = roleCall and main.ONOScli1.deviceRole(
+                    deviceId,
+                    ONOS5Ip )
+                # Check assignment
+                if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                    roleCheck = roleCheck and main.TRUE
+                else:
+                    roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("3008")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+            assert deviceId, "No device id for s7 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS6Ip )
+            # Check assignment
+            if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("3009")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            for i in range( 18, 28 ):
+                dpid = '6' + str( i ).zfill( 3 )
+                deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+                assert deviceId, "No device id for s%i in ONOS" % i
+                roleCall = roleCall and main.ONOScli1.deviceRole(
+                    deviceId,
+                    ONOS7Ip )
+                # Check assignment
+                if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                    roleCheck = roleCheck and main.TRUE
+                else:
+                    roleCheck = roleCheck and main.FALSE
+        except ( AttributeError, AssertionError ):
+            main.log.exception( "Something is wrong with ONOS device view" )
+            main.log.info( main.ONOScli1.devices() )
 
-        device_id = main.ONOScli1.get_device("3010")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=roleCall,
+            onpass="Re-assigned switch mastership to designated controller",
+            onfail="Something wrong with deviceRole calls" )
 
-        device_id = main.ONOScli1.get_device("3011")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=roleCheck,
+            onpass="Switches were successfully reassigned to designated " +
+                   "controller",
+            onfail="Switches were not successfully reassigned" )
+        mastershipCheck = mastershipCheck and roleCall and roleCheck
+        utilities.assert_equals( expect=main.TRUE, actual=mastershipCheck,
+                                 onpass="Switch mastership correctly assigned",
+                                 onfail="Error in (re)assigning switch" +
+                                 " mastership" )
 
-        device_id = main.ONOScli1.get_device("3012")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3013")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3014")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3015")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3016")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3017")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6007")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS6_ip)
-        if ONOS6_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6018")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6019")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6020")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6021")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6022")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6023")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6024")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6025")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6026")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6027")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        utilities.assert_equals(expect = main.TRUE,actual=role_call,
-                onpass="Re-assigned switch mastership to designated controller",
-                onfail="Something wrong with device_role calls")
-
-        utilities.assert_equals(expect = main.TRUE,actual=role_check,
-                onpass="Switches were successfully reassigned to designated controller",
-                onfail="Switches were not successfully reassigned")
-        mastership_check = mastership_check and role_call and role_check
-        utilities.assert_equals(expect = main.TRUE,actual=mastership_check,
-                onpass="Switch mastership correctly assigned",
-                onfail="Error in (re)assigning switch mastership")
-
-
-    def CASE3(self,main) :
+    def CASE3( self, main ):
         """
         Assign intents
-
         """
-        #FIXME: we must reinstall intents until we have a persistant datastore!
+        # FIXME: we must reinstall intents until we have a persistant
+        # datastore!
         import time
         import json
-        import re
-        main.log.report("Adding host intents")
-        main.case("Adding host Intents")
+        main.log.report( "Adding host intents" )
+        main.case( "Adding host Intents" )
 
-        main.step("Discovering  Hosts( Via pingall for now)")
-        #FIXME: Once we have a host discovery mechanism, use that instead
+        main.step( "Discovering  Hosts( Via pingall for now )" )
+        # FIXME: Once we have a host discovery mechanism, use that instead
 
-        #install onos-app-fwd
-        main.log.info("Install reactive forwarding app")
-        main.ONOScli1.feature_install("onos-app-fwd")
-        main.ONOScli2.feature_install("onos-app-fwd")
-        main.ONOScli3.feature_install("onos-app-fwd")
-        main.ONOScli4.feature_install("onos-app-fwd")
-        main.ONOScli5.feature_install("onos-app-fwd")
-        main.ONOScli6.feature_install("onos-app-fwd")
-        main.ONOScli7.feature_install("onos-app-fwd")
+        # install onos-app-fwd
+        main.log.info( "Install reactive forwarding app" )
+        main.ONOScli1.featureInstall( "onos-app-fwd" )
+        main.ONOScli2.featureInstall( "onos-app-fwd" )
+        main.ONOScli3.featureInstall( "onos-app-fwd" )
+        main.ONOScli4.featureInstall( "onos-app-fwd" )
+        main.ONOScli5.featureInstall( "onos-app-fwd" )
+        main.ONOScli6.featureInstall( "onos-app-fwd" )
+        main.ONOScli7.featureInstall( "onos-app-fwd" )
 
-        #REACTIVE FWD test
-        ping_result = main.FALSE
+        # REACTIVE FWD test
+        pingResult = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=pingResult,
+            onpass="Reactive Pingall test passed",
+            onfail="Reactive Pingall failed, one or more ping pairs failed" )
         time2 = time.time()
-        main.log.info("Time for pingall: %2f seconds" % (time2 - time1))
+        main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
 
-        #uninstall onos-app-fwd
-        main.log.info("Uninstall reactive forwarding app")
-        main.ONOScli1.feature_uninstall("onos-app-fwd")
-        main.ONOScli2.feature_uninstall("onos-app-fwd")
-        main.ONOScli3.feature_uninstall("onos-app-fwd")
-        main.ONOScli4.feature_uninstall("onos-app-fwd")
-        main.ONOScli5.feature_uninstall("onos-app-fwd")
-        main.ONOScli6.feature_uninstall("onos-app-fwd")
-        main.ONOScli7.feature_uninstall("onos-app-fwd")
-        #timeout for fwd flows
-        time.sleep(10)
+        # uninstall onos-app-fwd
+        main.log.info( "Uninstall reactive forwarding app" )
+        main.ONOScli1.featureUninstall( "onos-app-fwd" )
+        main.ONOScli2.featureUninstall( "onos-app-fwd" )
+        main.ONOScli3.featureUninstall( "onos-app-fwd" )
+        main.ONOScli4.featureUninstall( "onos-app-fwd" )
+        main.ONOScli5.featureUninstall( "onos-app-fwd" )
+        main.ONOScli6.featureUninstall( "onos-app-fwd" )
+        main.ONOScli7.featureUninstall( "onos-app-fwd" )
+        # timeout for fwd flows
+        time.sleep( 10 )
 
-        main.step("Add  host intents")
-        #TODO:  move the host numbers to params
-        import json
-        intents_json= json.loads(main.ONOScli1.hosts())
-        intent_add_result = True
-        for i in range(8,18):
-            main.log.info("Adding host intent between h"+str(i)+" and h"+str(i+10))
-            host1 =  "00:00:00:00:00:" + str(hex(i)[2:]).zfill(2).upper()
-            host2 =  "00:00:00:00:00:" + str(hex(i+10)[2:]).zfill(2).upper()
-            host1_id = main.ONOScli1.get_host(host1)['id']
-            host2_id = main.ONOScli1.get_host(host2)['id']
-            #NOTE: get host can return None
-            if host1_id and host2_id:
-                tmp_result = main.ONOScli1.add_host_intent(host1_id, host2_id )
+        main.step( "Add  host intents" )
+        intentIds = []
+        # TODO:  move the host numbers to params
+        #        Maybe look at all the paths we ping?
+        intentAddResult = True
+        hostResult = main.TRUE
+        for i in range( 8, 18 ):
+            main.log.info( "Adding host intent between h" + str( i ) +
+                           " and h" + str( i + 10 ) )
+            host1 = "00:00:00:00:00:" + \
+                str( hex( i )[ 2: ] ).zfill( 2 ).upper()
+            host2 = "00:00:00:00:00:" + \
+                str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
+            # NOTE: getHost can return None
+            host1Dict = main.ONOScli1.getHost( host1 )
+            host2Dict = main.ONOScli1.getHost( host2 )
+            host1Id = None
+            host2Id = None
+            if host1Dict and host2Dict:
+                host1Id = host1Dict.get( 'id', None )
+                host2Id = host2Dict.get( 'id', None )
+            if host1Id and host2Id:
+
+                tmpId = main.ONOScli1.addHostIntent(
+                    host1Id,
+                    host2Id )
+                if tmpId:
+                    main.log.info( "Added intent with id: " + tmpId )
+                    intentIds.append( tmpId )
+                else:
+                    main.log.error( "addHostIntent reutrned None" )
             else:
-                main.log.error("Error, get_host() failed")
-                tmp_result = main.FALSE
-            intent_add_result = bool(intent_add_result and tmp_result)
-        utilities.assert_equals(expect=True, actual=intent_add_result,
-                onpass="Switch mastership correctly assigned",
-                onfail="Error in (re)assigning switch mastership")
-        #TODO Check if intents all exist in datastore
-        #NOTE: Do we need to print this once the test is working?
-        #main.log.info(json.dumps(json.loads(main.ONOScli1.intents(json_format=True)),
-        #    sort_keys=True, indent=4, separators=(',', ': ') ) )
+                main.log.error( "Error, getHost() failed" )
+                main.log.warn( json.dumps( json.loads( main.ONOScli1.hosts() ),
+                                           sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                hostResult = main.FALSE
+        onosIds = main.ONOScli1.getAllIntentsId()
+        main.log.info( "Submitted intents: " + str( intentIds ) )
+        main.log.info( "Intents in ONOS: " + str( onosIds ) )
+        for intent in intentIds:
+            if intent in onosIds:
+                pass  # intent submitted is still in onos
+            else:
+                intentAddResult = False
+        # Print the intent states
+        intents = main.ONOScli1.intents()
+        intentStates = []
+        installedCheck = True
+        main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+        count = 0
+        for intent in json.loads( intents ):  # Iter through intents of a node
+            state = intent.get( 'state', None )
+            if "INSTALLED" not in state:
+                installedCheck = False
+            intentId = intent.get( 'id', None )
+            intentStates.append( ( intentId, state ) )
+        # add submitted intents not in the store
+        tmplist = [ i for i, s in intentStates ]
+        missingIntents = False
+        for i in intentIds:
+            if i not in tmplist:
+                intentStates.append( ( i, " - " ) )
+                missingIntents = True
+        intentStates.sort()
+        for i, s in intentStates:
+            count += 1
+            main.log.info( "%-6s%-15s%-15s" %
+                           ( str( count ), str( i ), str( s ) ) )
+        main.ONOScli1.leaders()
+        main.ONOScli1.partitions()
+        # for node in nodes:
+        #     node.pendingMap()
+        pendingMap = main.ONOScli1.pendingMap()
+        main.ONOScli2.pendingMap()
+        main.ONOScli3.pendingMap()
+        main.ONOScli4.pendingMap()
+        main.ONOScli5.pendingMap()
+        main.ONOScli6.pendingMap()
+        main.ONOScli7.pendingMap()
+        intentAddResult = bool( pingResult and hostResult and intentAddResult
+                                and not missingIntents and installedCheck )
+        utilities.assert_equals(
+            expect=True,
+            actual=intentAddResult,
+            onpass="Pushed host intents to ONOS",
+            onfail="Error in pushing host intents to ONOS" )
 
-    def CASE4(self,main) :
+        if not intentAddResult or "key" in pendingMap:
+            import time
+            installedCheck = True
+            main.log.info( "Sleeping 60 seconds to see if intents are found" )
+            time.sleep( 60 )
+            onosIds = main.ONOScli1.getAllIntentsId()
+            main.log.info( "Submitted intents: " + str( intentIds ) )
+            main.log.info( "Intents in ONOS: " + str( onosIds ) )
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            for intent in json.loads( intents ):
+                # Iter through intents of a node
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            # add submitted intents not in the store
+            tmplist = [ i for i, s in intentStates ]
+            for i in intentIds:
+                if i not in tmplist:
+                    intentStates.append( ( i, " - " ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.pendingMap()
+            main.ONOScli2.pendingMap()
+            main.ONOScli3.pendingMap()
+            main.ONOScli4.pendingMap()
+            main.ONOScli5.pendingMap()
+            main.ONOScli6.pendingMap()
+            main.ONOScli7.pendingMap()
+
+    def CASE4( self, main ):
         """
         Ping across added host intents
         """
-        description = " Ping across added host intents"
-        main.log.report(description)
-        main.case(description)
-        Ping_Result = main.TRUE
-        for i in range(8,18):
-            ping = main.Mininet1.pingHost(src="h"+str(i),target="h"+str(i+10))
-            Ping_Result = Ping_Result and ping
-            if ping==main.FALSE:
-                main.log.warn("Ping failed between h"+str(i)+" and h" + str(i+10))
-            elif ping==main.TRUE:
-                main.log.info("Ping test passed!")
-                Ping_Result = main.TRUE
-        if Ping_Result==main.FALSE:
-            main.log.report("Intents have not been installed correctly, pings failed.")
-        if Ping_Result==main.TRUE:
-            main.log.report("Intents have been installed correctly and verified by pings")
-        utilities.assert_equals(expect = main.TRUE,actual=Ping_Result,
-                onpass="Intents have been installed correctly and pings work",
-                onfail ="Intents have not been installed correctly, pings failed." )
-
-    def CASE5(self,main) :
-        '''
-        Reading state of ONOS
-        '''
-        import time
         import json
-        from subprocess import Popen, PIPE
-        from sts.topology.teston_topology import TestONTopology # assumes that sts is already in you PYTHONPATH
+        description = " Ping across added host intents"
+        main.log.report( description )
+        main.case( description )
+        PingResult = main.TRUE
+        for i in range( 8, 18 ):
+            ping = main.Mininet1.pingHost( src="h" + str( i ),
+                                           target="h" + str( i + 10 ) )
+            PingResult = PingResult and ping
+            if ping == main.FALSE:
+                main.log.warn( "Ping failed between h" + str( i ) +
+                               " and h" + str( i + 10 ) )
+            elif ping == main.TRUE:
+                main.log.info( "Ping test passed!" )
+                # Don't set PingResult or you'd override failures
+        if PingResult == main.FALSE:
+            main.log.report(
+                "Intents have not been installed correctly, pings failed." )
+            # TODO: pretty print
+            main.log.warn( "ONSO1 intents: " )
+            main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
+                                       sort_keys=True,
+                                       indent=4,
+                                       separators=( ',', ': ' ) ) )
+        if PingResult == main.TRUE:
+            main.log.report(
+                "Intents have been installed correctly and verified by pings" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=PingResult,
+            onpass="Intents have been installed correctly and pings work",
+            onfail="Intents have not been installed correctly, pings failed." )
 
-        main.log.report("Setting up and gathering data for current state")
-        main.case("Setting up and gathering data for current state")
-        #The general idea for this test case is to pull the state of (intents,flows, topology,...) from each ONOS node
-        #We can then compare them with eachother and also with past states
+        installedCheck = True
+        if PingResult is not main.TRUE:
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            # Iter through intents of a node
+            for intent in json.loads( intents ):
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.partitions()
+            main.ONOScli1.pendingMap()
+            main.ONOScli2.pendingMap()
+            main.ONOScli3.pendingMap()
+            main.ONOScli4.pendingMap()
+            main.ONOScli5.pendingMap()
+            main.ONOScli6.pendingMap()
+            main.ONOScli7.pendingMap()
+        if not installedCheck:
+            main.log.info( "Waiting 60 seconds to see if intent states change" )
+            time.sleep( 60 )
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            # Iter through intents of a node
+            for intent in json.loads( intents ):
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.partitions()
+            main.ONOScli1.pendingMap()
+            main.ONOScli2.pendingMap()
+            main.ONOScli3.pendingMap()
+            main.ONOScli4.pendingMap()
+            main.ONOScli5.pendingMap()
+            main.ONOScli6.pendingMap()
+            main.ONOScli7.pendingMap()
 
-        main.step("Get the Mastership of each switch from each controller")
-        global mastership_state
-        mastership_state = []
+    def CASE5( self, main ):
+        """
+        Reading state of ONOS
+        """
+        import json
+        # assumes that sts is already in you PYTHONPATH
+        from sts.topology.teston_topology import TestONTopology
 
-        #Assert that each device has a master
-        ONOS1_master_not_null = main.ONOScli1.roles_not_null()
-        ONOS2_master_not_null = main.ONOScli2.roles_not_null()
-        ONOS3_master_not_null = main.ONOScli3.roles_not_null()
-        ONOS4_master_not_null = main.ONOScli4.roles_not_null()
-        ONOS5_master_not_null = main.ONOScli5.roles_not_null()
-        ONOS6_master_not_null = main.ONOScli6.roles_not_null()
-        ONOS7_master_not_null = main.ONOScli7.roles_not_null()
-        roles_not_null = ONOS1_master_not_null and ONOS2_master_not_null and\
-                ONOS3_master_not_null and ONOS4_master_not_null and\
-                ONOS5_master_not_null and ONOS6_master_not_null and\
-                ONOS7_master_not_null
-        utilities.assert_equals(expect = main.TRUE,actual=roles_not_null,
-                onpass="Each device has a master",
-                onfail="Some devices don't have a master assigned")
+        main.log.report( "Setting up and gathering data for current state" )
+        main.case( "Setting up and gathering data for current state" )
+        # The general idea for this test case is to pull the state of
+        # ( intents,flows, topology,... ) from each ONOS node
+        # We can then compare them with eachother and also with past states
 
+        main.step( "Get the Mastership of each switch from each controller" )
+        global mastershipState
+        mastershipState = []
 
-        ONOS1_mastership = main.ONOScli1.roles()
-        ONOS2_mastership = main.ONOScli2.roles()
-        ONOS3_mastership = main.ONOScli3.roles()
-        ONOS4_mastership = main.ONOScli4.roles()
-        ONOS5_mastership = main.ONOScli5.roles()
-        ONOS6_mastership = main.ONOScli6.roles()
-        ONOS7_mastership = main.ONOScli7.roles()
-        #print json.dumps(json.loads(ONOS1_mastership), sort_keys=True, indent=4, separators=(',', ': '))
-        if "Error" in ONOS1_mastership or not ONOS1_mastership\
-                or "Error" in ONOS2_mastership or not ONOS2_mastership\
-                or "Error" in ONOS3_mastership or not ONOS3_mastership\
-                or "Error" in ONOS4_mastership or not ONOS4_mastership\
-                or "Error" in ONOS5_mastership or not ONOS5_mastership\
-                or "Error" in ONOS6_mastership or not ONOS6_mastership\
-                or "Error" in ONOS7_mastership or not ONOS7_mastership:
-                    main.log.report("Error in getting ONOS roles")
-                    main.log.warn("ONOS1 mastership response: " + repr(ONOS1_mastership))
-                    main.log.warn("ONOS2 mastership response: " + repr(ONOS2_mastership))
-                    main.log.warn("ONOS3 mastership response: " + repr(ONOS3_mastership))
-                    main.log.warn("ONOS4 mastership response: " + repr(ONOS4_mastership))
-                    main.log.warn("ONOS5 mastership response: " + repr(ONOS5_mastership))
-                    main.log.warn("ONOS6 mastership response: " + repr(ONOS6_mastership))
-                    main.log.warn("ONOS7 mastership response: " + repr(ONOS7_mastership))
-                    consistent_mastership = main.FALSE
-        elif ONOS1_mastership == ONOS2_mastership\
-                and ONOS1_mastership == ONOS3_mastership\
-                and ONOS1_mastership == ONOS4_mastership\
-                and ONOS1_mastership == ONOS5_mastership\
-                and ONOS1_mastership == ONOS6_mastership\
-                and ONOS1_mastership == ONOS7_mastership:
-                    mastership_state = ONOS1_mastership
-                    consistent_mastership = main.TRUE
-                    main.log.report("Switch roles are consistent across all ONOS nodes")
+        # Assert that each device has a master
+        ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
+        ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
+        ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
+        ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
+        ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
+        ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
+        ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
+        rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
+            ONOS3MasterNotNull and ONOS4MasterNotNull and\
+            ONOS5MasterNotNull and ONOS6MasterNotNull and\
+            ONOS7MasterNotNull
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=rolesNotNull,
+            onpass="Each device has a master",
+            onfail="Some devices don't have a master assigned" )
+
+        ONOS1Mastership = main.ONOScli1.roles()
+        ONOS2Mastership = main.ONOScli2.roles()
+        ONOS3Mastership = main.ONOScli3.roles()
+        ONOS4Mastership = main.ONOScli4.roles()
+        ONOS5Mastership = main.ONOScli5.roles()
+        ONOS6Mastership = main.ONOScli6.roles()
+        ONOS7Mastership = main.ONOScli7.roles()
+        if "Error" in ONOS1Mastership or not ONOS1Mastership\
+                or "Error" in ONOS2Mastership or not ONOS2Mastership\
+                or "Error" in ONOS3Mastership or not ONOS3Mastership\
+                or "Error" in ONOS4Mastership or not ONOS4Mastership\
+                or "Error" in ONOS5Mastership or not ONOS5Mastership\
+                or "Error" in ONOS6Mastership or not ONOS6Mastership\
+                or "Error" in ONOS7Mastership or not ONOS7Mastership:
+            main.log.report( "Error in getting ONOS roles" )
+            main.log.warn(
+                "ONOS1 mastership response: " +
+                repr( ONOS1Mastership ) )
+            main.log.warn(
+                "ONOS2 mastership response: " +
+                repr( ONOS2Mastership ) )
+            main.log.warn(
+                "ONOS3 mastership response: " +
+                repr( ONOS3Mastership ) )
+            main.log.warn(
+                "ONOS4 mastership response: " +
+                repr( ONOS4Mastership ) )
+            main.log.warn(
+                "ONOS5 mastership response: " +
+                repr( ONOS5Mastership ) )
+            main.log.warn(
+                "ONOS6 mastership response: " +
+                repr( ONOS6Mastership ) )
+            main.log.warn(
+                "ONOS7 mastership response: " +
+                repr( ONOS7Mastership ) )
+            consistentMastership = main.FALSE
+        elif ONOS1Mastership == ONOS2Mastership\
+                and ONOS1Mastership == ONOS3Mastership\
+                and ONOS1Mastership == ONOS4Mastership\
+                and ONOS1Mastership == ONOS5Mastership\
+                and ONOS1Mastership == ONOS6Mastership\
+                and ONOS1Mastership == ONOS7Mastership:
+            mastershipState = ONOS1Mastership
+            consistentMastership = main.TRUE
+            main.log.report(
+                "Switch roles are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 roles: ", json.dumps(json.loads(ONOS1_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 roles: ", json.dumps(json.loads(ONOS2_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 roles: ", json.dumps(json.loads(ONOS3_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 roles: ", json.dumps(json.loads(ONOS4_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 roles: ", json.dumps(json.loads(ONOS5_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 roles: ", json.dumps(json.loads(ONOS6_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 roles: ", json.dumps(json.loads(ONOS7_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            consistent_mastership = main.FALSE
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_mastership,
-                onpass="Switch roles are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of switch roles")
+            main.log.warn(
+                "ONOS1 roles: ",
+                json.dumps(
+                    json.loads( ONOS1Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS2 roles: ",
+                json.dumps(
+                    json.loads( ONOS2Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS3 roles: ",
+                json.dumps(
+                    json.loads( ONOS3Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS4 roles: ",
+                json.dumps(
+                    json.loads( ONOS4Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS5 roles: ",
+                json.dumps(
+                    json.loads( ONOS5Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS6 roles: ",
+                json.dumps(
+                    json.loads( ONOS6Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS7 roles: ",
+                json.dumps(
+                    json.loads( ONOS7Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            consistentMastership = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentMastership,
+            onpass="Switch roles are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of switch roles" )
 
-
-        main.step("Get the intents from each controller")
-        global intent_state
-        intent_state = []
-        ONOS1_intents = main.ONOScli1.intents( json_format=True )
-        ONOS2_intents = main.ONOScli2.intents( json_format=True )
-        ONOS3_intents = main.ONOScli3.intents( json_format=True )
-        ONOS4_intents = main.ONOScli4.intents( json_format=True )
-        ONOS5_intents = main.ONOScli5.intents( json_format=True )
-        ONOS6_intents = main.ONOScli6.intents( json_format=True )
-        ONOS7_intents = main.ONOScli7.intents( json_format=True )
-        intent_check = main.FALSE
-        if "Error" in ONOS1_intents or not ONOS1_intents\
-                or "Error" in ONOS2_intents or not ONOS2_intents\
-                or "Error" in ONOS3_intents or not ONOS3_intents\
-                or "Error" in ONOS4_intents or not ONOS4_intents\
-                or "Error" in ONOS5_intents or not ONOS5_intents\
-                or "Error" in ONOS6_intents or not ONOS6_intents\
-                or "Error" in ONOS7_intents or not ONOS7_intents:
-                    main.log.report("Error in getting ONOS intents")
-                    main.log.warn("ONOS1 intents response: " + repr(ONOS1_intents))
-                    main.log.warn("ONOS2 intents response: " + repr(ONOS2_intents))
-                    main.log.warn("ONOS3 intents response: " + repr(ONOS3_intents))
-                    main.log.warn("ONOS4 intents response: " + repr(ONOS4_intents))
-                    main.log.warn("ONOS5 intents response: " + repr(ONOS5_intents))
-                    main.log.warn("ONOS6 intents response: " + repr(ONOS6_intents))
-                    main.log.warn("ONOS7 intents response: " + repr(ONOS7_intents))
-        elif ONOS1_intents == ONOS2_intents\
-                and ONOS1_intents == ONOS3_intents\
-                and ONOS1_intents == ONOS4_intents\
-                and ONOS1_intents == ONOS5_intents\
-                and ONOS1_intents == ONOS6_intents\
-                and ONOS1_intents == ONOS7_intents:
-                    intent_state = ONOS1_intents
-                    intent_check = main.TRUE
-                    main.log.report("Intents are consistent across all ONOS nodes")
+        main.step( "Get the intents from each controller" )
+        global intentState
+        intentState = []
+        ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
+        ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
+        ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
+        ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
+        ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
+        ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
+        ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+        intentCheck = main.FALSE
+        if "Error" in ONOS1Intents or not ONOS1Intents\
+                or "Error" in ONOS2Intents or not ONOS2Intents\
+                or "Error" in ONOS3Intents or not ONOS3Intents\
+                or "Error" in ONOS4Intents or not ONOS4Intents\
+                or "Error" in ONOS5Intents or not ONOS5Intents\
+                or "Error" in ONOS6Intents or not ONOS6Intents\
+                or "Error" in ONOS7Intents or not ONOS7Intents:
+            main.log.report( "Error in getting ONOS intents" )
+            main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
+            main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
+            main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
+            main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
+            main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
+            main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
+            main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
+        elif ONOS1Intents == ONOS2Intents\
+                and ONOS1Intents == ONOS3Intents\
+                and ONOS1Intents == ONOS4Intents\
+                and ONOS1Intents == ONOS5Intents\
+                and ONOS1Intents == ONOS6Intents\
+                and ONOS1Intents == ONOS7Intents:
+            intentState = ONOS1Intents
+            intentCheck = main.TRUE
+            main.log.report( "Intents are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 intents: ", json.dumps(json.loads(ONOS1_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 intents: ", json.dumps(json.loads(ONOS2_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 intents: ", json.dumps(json.loads(ONOS3_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 intents: ", json.dumps(json.loads(ONOS4_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 intents: ", json.dumps(json.loads(ONOS5_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 intents: ", json.dumps(json.loads(ONOS6_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 intents: ", json.dumps(json.loads(ONOS7_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-        utilities.assert_equals(expect = main.TRUE,actual=intent_check,
-                onpass="Intents are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of intents")
+            main.log.warn(
+                "ONOS1 intents: ",
+                json.dumps(
+                    json.loads( ONOS1Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS2 intents: ",
+                json.dumps(
+                    json.loads( ONOS2Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS3 intents: ",
+                json.dumps(
+                    json.loads( ONOS3Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS4 intents: ",
+                json.dumps(
+                    json.loads( ONOS4Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS5 intents: ",
+                json.dumps(
+                    json.loads( ONOS5Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS6 intents: ",
+                json.dumps(
+                    json.loads( ONOS6Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS7 intents: ",
+                json.dumps(
+                    json.loads( ONOS7Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=intentCheck,
+            onpass="Intents are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of intents" )
 
+        main.step( "Get the flows from each controller" )
+        global flowState
+        flowState = []
+        flowCheck = main.FALSE
+        try:
+            ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
+            ONOS2Flows = main.ONOScli2.flows( jsonFormat=True )
+            ONOS3Flows = main.ONOScli3.flows( jsonFormat=True )
+            ONOS4Flows = main.ONOScli4.flows( jsonFormat=True )
+            ONOS5Flows = main.ONOScli5.flows( jsonFormat=True )
+            ONOS6Flows = main.ONOScli6.flows( jsonFormat=True )
+            ONOS7Flows = main.ONOScli7.flows( jsonFormat=True )
+            assert ONOS1Flows, "ONOS1 Flows should not be empty"
+            assert ONOS2Flows, "ONOS2 Flows should not be empty"
+            assert ONOS3Flows, "ONOS3 Flows should not be empty"
+            assert ONOS4Flows, "ONOS4 Flows should not be empty"
+            assert ONOS5Flows, "ONOS5 Flows should not be empty"
+            assert ONOS6Flows, "ONOS6 Flows should not be empty"
+            assert ONOS7Flows, "ONOS7 Flows should not be empty"
+            assert "Error" not in ONOS1Flows, "ONOS1 Flows contains 'Error'"
+            assert "Error" not in ONOS2Flows, "ONOS2 Flows contains 'Error'"
+            assert "Error" not in ONOS3Flows, "ONOS3 Flows contains 'Error'"
+            assert "Error" not in ONOS4Flows, "ONOS4 Flows contains 'Error'"
+            assert "Error" not in ONOS5Flows, "ONOS5 Flows contains 'Error'"
+            assert "Error" not in ONOS6Flows, "ONOS6 Flows contains 'Error'"
+            assert "Error" not in ONOS7Flows, "ONOS7 Flows contains 'Error'"
+            ONOS1FlowsJson = json.loads( ONOS1Flows )
+            ONOS2FlowsJson = json.loads( ONOS2Flows )
+            ONOS3FlowsJson = json.loads( ONOS3Flows )
+            ONOS4FlowsJson = json.loads( ONOS4Flows )
+            ONOS5FlowsJson = json.loads( ONOS5Flows )
+            ONOS6FlowsJson = json.loads( ONOS6Flows )
+            ONOS7FlowsJson = json.loads( ONOS7Flows )
+        except ( ValueError, AssertionError ):  # From json.loads, or asserts
+            main.log.exception( "One or more 'flows' responses from " +
+                                "ONOS couldn't be decoded." )
+            main.log.warn( "ONOS1 flows repsponse: " + ONOS1Flows )
+            main.log.warn( "ONOS2 flows repsponse: " + ONOS2Flows )
+            main.log.warn( "ONOS3 flows repsponse: " + ONOS3Flows )
+            main.log.warn( "ONOS4 flows repsponse: " + ONOS4Flows )
+            main.log.warn( "ONOS5 flows repsponse: " + ONOS5Flows )
+            main.log.warn( "ONOS6 flows repsponse: " + ONOS6Flows )
+            main.log.warn( "ONOS7 flows repsponse: " + ONOS7Flows )
+        else:  # No exceptions
+            if len( ONOS1FlowsJson ) == len( ONOS2FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS3FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS4FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS5FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS6FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS7FlowsJson ):
+                # TODO: Do a better check, maybe compare flows on switches?
+                # NOTE Possible issue with this not always being set?
+                flowState = ONOS1Flows
+                flowCheck = main.TRUE
+                main.log.report( "Flow count is consistent across all" +
+                                 " ONOS nodes" )
+            else:
+                main.log.warn( "ONOS1 flows: " +
+                               json.dumps( ONOS1FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS2 flows: " +
+                               json.dumps( ONOS2FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS3 flows: " +
+                               json.dumps( ONOS3FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS4 flows: " +
+                               json.dumps( ONOS4FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS5 flows: " +
+                               json.dumps( ONOS5FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS6 flows: " +
+                               json.dumps( ONOS6FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS7 flows: " +
+                               json.dumps( ONOS7FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=flowCheck,
+            onpass="The flow count is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different flow counts" )
 
-        main.step("Get the flows from each controller")
-        global flow_state
-        flow_state = []
-        ONOS1_flows = main.ONOScli1.flows( json_format=True )
-        ONOS2_flows = main.ONOScli2.flows( json_format=True )
-        ONOS3_flows = main.ONOScli3.flows( json_format=True )
-        ONOS4_flows = main.ONOScli4.flows( json_format=True )
-        ONOS5_flows = main.ONOScli5.flows( json_format=True )
-        ONOS6_flows = main.ONOScli6.flows( json_format=True )
-        ONOS7_flows = main.ONOScli7.flows( json_format=True )
-        flow_check = main.FALSE
-        if "Error" in ONOS1_flows or not ONOS1_flows\
-                or "Error" in ONOS2_flows or not ONOS2_flows\
-                or "Error" in ONOS3_flows or not ONOS3_flows\
-                or "Error" in ONOS4_flows or not ONOS4_flows\
-                or "Error" in ONOS5_flows or not ONOS5_flows\
-                or "Error" in ONOS6_flows or not ONOS6_flows\
-                or "Error" in ONOS7_flows or not ONOS7_flows:
-                    main.log.report("Error in getting ONOS intents")
-                    main.log.warn("ONOS1 flows repsponse: "+ ONOS1_flows)
-                    main.log.warn("ONOS2 flows repsponse: "+ ONOS2_flows)
-                    main.log.warn("ONOS3 flows repsponse: "+ ONOS3_flows)
-                    main.log.warn("ONOS4 flows repsponse: "+ ONOS4_flows)
-                    main.log.warn("ONOS5 flows repsponse: "+ ONOS5_flows)
-                    main.log.warn("ONOS6 flows repsponse: "+ ONOS6_flows)
-                    main.log.warn("ONOS7 flows repsponse: "+ ONOS7_flows)
-        elif len(json.loads(ONOS1_flows)) == len(json.loads(ONOS2_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS3_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS4_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS5_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS6_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS7_flows)):
-                #TODO: Do a better check, maybe compare flows on switches?
-                    flow_state = ONOS1_flows
-                    flow_check = main.TRUE
-                    main.log.report("Flow count is consistent across all ONOS nodes")
-        else:
-            main.log.warn("ONOS1 flows: "+ json.dumps(json.loads(ONOS1_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 flows: "+ json.dumps(json.loads(ONOS2_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 flows: "+ json.dumps(json.loads(ONOS3_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 flows: "+ json.dumps(json.loads(ONOS4_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 flows: "+ json.dumps(json.loads(ONOS5_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 flows: "+ json.dumps(json.loads(ONOS6_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 flows: "+ json.dumps(json.loads(ONOS7_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-        utilities.assert_equals(expect = main.TRUE,actual=flow_check,
-                onpass="The flow count is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different flow counts")
-
-
-        main.step("Get the OF Table entries")
+        main.step( "Get the OF Table entries" )
         global flows
-        flows=[]
-        for i in range(1,29):
-            flows.append(main.Mininet2.get_flowTable(1.3, "s"+str(i)))
+        flows = []
+        for i in range( 1, 29 ):
+            flows.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
+        if flowCheck == main.FALSE:
+            for table in flows:
+                main.log.warn( table )
+        # TODO: Compare switch flow tables with ONOS flow tables
 
-        #TODO: Compare switch flow tables with ONOS flow tables
+        main.step( "Start continuous pings" )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source1' ],
+            target=main.params[ 'PING' ][ 'target1' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source2' ],
+            target=main.params[ 'PING' ][ 'target2' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source3' ],
+            target=main.params[ 'PING' ][ 'target3' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source4' ],
+            target=main.params[ 'PING' ][ 'target4' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source5' ],
+            target=main.params[ 'PING' ][ 'target5' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source6' ],
+            target=main.params[ 'PING' ][ 'target6' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source7' ],
+            target=main.params[ 'PING' ][ 'target7' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source8' ],
+            target=main.params[ 'PING' ][ 'target8' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source9' ],
+            target=main.params[ 'PING' ][ 'target9' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source10' ],
+            target=main.params[ 'PING' ][ 'target10' ],
+            pingTime=500 )
 
-        main.step("Start continuous pings")
-        main.Mininet2.pingLong(src=main.params['PING']['source1'],
-                            target=main.params['PING']['target1'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source2'],
-                            target=main.params['PING']['target2'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source3'],
-                            target=main.params['PING']['target3'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source4'],
-                            target=main.params['PING']['target4'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source5'],
-                            target=main.params['PING']['target5'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source6'],
-                            target=main.params['PING']['target6'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source7'],
-                            target=main.params['PING']['target7'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source8'],
-                            target=main.params['PING']['target8'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source9'],
-                            target=main.params['PING']['target9'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source10'],
-                            target=main.params['PING']['target10'],pingTime=500)
-
-        main.step("Create TestONTopology object")
+        main.step( "Create TestONTopology object" )
         ctrls = []
         count = 1
         while True:
             temp = ()
-            if ('ip' + str(count)) in main.params['CTRL']:
-                temp = temp + (getattr(main,('ONOS' + str(count))),)
-                temp = temp + ("ONOS"+str(count),)
-                temp = temp + (main.params['CTRL']['ip'+str(count)],)
-                temp = temp + (eval(main.params['CTRL']['port'+str(count)]),)
-                ctrls.append(temp)
+            if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
+                temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
+                temp = temp + ( "ONOS" + str( count ), )
+                temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
+                temp = temp + \
+                    ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+                ctrls.append( temp )
                 count = count + 1
             else:
                 break
-        MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        MNTopo = TestONTopology(
+            main.Mininet1,
+            ctrls )  # can also add Intent API info for intent operations
 
-        main.step("Collecting topology information from ONOS")
+        main.step( "Collecting topology information from ONOS" )
         devices = []
         devices.append( main.ONOScli1.devices() )
         devices.append( main.ONOScli2.devices() )
@@ -815,13 +1113,13 @@
         devices.append( main.ONOScli6.devices() )
         devices.append( main.ONOScli7.devices() )
         hosts = []
-        hosts.append( main.ONOScli1.hosts() )
-        hosts.append( main.ONOScli2.hosts() )
-        hosts.append( main.ONOScli3.hosts() )
-        hosts.append( main.ONOScli4.hosts() )
-        hosts.append( main.ONOScli5.hosts() )
-        hosts.append( main.ONOScli6.hosts() )
-        hosts.append( main.ONOScli7.hosts() )
+        hosts.append( json.loads( main.ONOScli1.hosts() ) )
+        hosts.append( json.loads( main.ONOScli2.hosts() ) )
+        hosts.append( json.loads( main.ONOScli3.hosts() ) )
+        hosts.append( json.loads( main.ONOScli4.hosts() ) )
+        hosts.append( json.loads( main.ONOScli5.hosts() ) )
+        hosts.append( json.loads( main.ONOScli6.hosts() ) )
+        hosts.append( json.loads( main.ONOScli7.hosts() ) )
         ports = []
         ports.append( main.ONOScli1.ports() )
         ports.append( main.ONOScli2.ports() )
@@ -846,488 +1144,578 @@
         clusters.append( main.ONOScli5.clusters() )
         clusters.append( main.ONOScli6.clusters() )
         clusters.append( main.ONOScli7.clusters() )
-        paths = []
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli1.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli2.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli3.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli4.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli5.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli6.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli7.topology() )
-        paths.append( temp_topo.get('paths', False) )
+        # Compare json objects for hosts and dataplane clusters
 
-        #Compare json objects for hosts, dataplane clusters and paths
-
-        #hosts
-        consistent_hosts_result = main.TRUE
+        # hosts
+        consistentHostsResult = main.TRUE
         for controller in range( len( hosts ) ):
-            if not "Error" in hosts[controller]:
-                if hosts[controller] == hosts[0]:
+            controllerStr = str( controller + 1 )
+            if "Error" not in hosts[ controller ]:
+                if hosts[ controller ] == hosts[ 0 ]:
                     continue
-                else:#hosts not consistent
-                    main.log.report("hosts from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                    main.log.warn( repr( hosts[controller] ) )
-                    consistent_hosts_result = main.FALSE
+                else:  # hosts not consistent
+                    main.log.report( "hosts from ONOS" +
+                                     controllerStr +
+                                     " is inconsistent with ONOS1" )
+                    main.log.warn( repr( hosts[ controller ] ) )
+                    consistentHostsResult = main.FALSE
 
             else:
-                main.log.report("Error in getting ONOS hosts from ONOS" + str(controller + 1) )
-                consistent_hosts_result = main.FALSE
-                main.log.warn("ONOS" + str(controller + 1) + " hosts response: " + repr(hosts[controller]) )
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_hosts_result,
-                onpass="Hosts view is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of hosts")
+                main.log.report( "Error in getting ONOS hosts from ONOS" +
+                                 controllerStr )
+                consistentHostsResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
+                               " hosts response: " +
+                               repr( hosts[ controller ] ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentHostsResult,
+            onpass="Hosts view is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of hosts" )
 
-        #Strongly connected clusters of devices
-        consistent_clusters_result = main.TRUE
+        ipResult = main.TRUE
+        for controller in range( 0, len( hosts ) ):
+            controllerStr = str( controller + 1 )
+            for host in hosts[ controller ]:
+                if host.get( 'ips', [] ) == []:
+                    main.log.error(
+                        "DEBUG:Error with host ips on controller" +
+                        controllerStr + ": " + str( host ) )
+                    ipResult = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=ipResult,
+            onpass="The ips of the hosts aren't empty",
+            onfail="The ip of at least one host is missing" )
+
+        # Strongly connected clusters of devices
+        consistentClustersResult = main.TRUE
         for controller in range( len( clusters ) ):
-            if not "Error" in clusters[controller]:
-                if clusters[controller] == clusters[0]:
+            if "Error" not in clusters[ controller ]:
+                if clusters[ controller ] == clusters[ 0 ]:
                     continue
-                else:#clusters not consistent
-                    main.log.report("clusters from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                    consistent_clusters_result = main.FALSE
+                else:  # clusters not consistent
+                    main.log.report( "clusters from ONOS" +
+                                     controllerStr +
+                                     " is inconsistent with ONOS1" )
+                    consistentClustersResult = main.FALSE
 
             else:
-                main.log.report("Error in getting dataplane clusters from ONOS" + str(controller + 1) )
-                consistent_clusters_result = main.FALSE
-                main.log.warn("ONOS" + str(controller + 1) + " clusters response: " + repr(clusters[controller]) )
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_clusters_result,
-                onpass="Clusters view is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of clusters")
-        num_clusters =  len(json.loads(clusters[0])) #there should always only be one cluster
-        utilities.assert_equals(expect = 1, actual = num_clusters,
-                onpass="ONOS shows 1 SCC",
-                onfail="ONOS shows "+str(num_clusters) +" SCCs")
+                main.log.report( "Error in getting dataplane clusters " +
+                                 "from ONOS" + controllerStr )
+                consistentClustersResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
+                               " clusters response: " +
+                               repr( clusters[ controller ] ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentClustersResult,
+            onpass="Clusters view is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of clusters" )
+        # there should always only be one cluster
+        numClusters = len( json.loads( clusters[ 0 ] ) )
+        clusterResults = main.FALSE
+        if numClusters == 1:
+            clusterResults = main.TRUE
+        utilities.assert_equals(
+            expect=1,
+            actual=numClusters,
+            onpass="ONOS shows 1 SCC",
+            onfail="ONOS shows " + str( numClusters ) + " SCCs" )
 
-
-        #paths
-        consistent_paths_result = main.TRUE
-        for controller in range( len( paths ) ):
-            if not "Error" in paths[controller]:
-                if paths[controller] == paths[0]:
-                    continue
-                else:#paths not consistent
-                    main.log.report("paths from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                    consistent_paths_result = main.FALSE
-
+        main.step( "Comparing ONOS topology to MN" )
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = main.TRUE
+        for controller in range( numControllers ):
+            controllerStr = str( controller + 1 )
+            if devices[ controller ] or "Error" not in devices[ controller ]:
+                currentDevicesResult = main.Mininet1.compareSwitches(
+                    MNTopo,
+                    json.loads(
+                        devices[ controller ] ) )
             else:
-                main.log.report("Error in getting paths from ONOS" + str(controller + 1) )
-                consistent_paths_result = main.FALSE
-                main.log.warn("ONOS" + str(controller + 1) + " paths response: " + repr(paths[controller]) )
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_paths_result,
-                onpass="Paths count is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different counts of paths")
+                currentDevicesResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentDevicesResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " Switches view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " Switches view is incorrect" )
 
-
-        main.step("Comparing ONOS topology to MN")
-        devices_results = main.TRUE
-        ports_results = main.TRUE
-        links_results = main.TRUE
-        for controller in range(num_controllers):
-            if devices[controller] or not "Error" in devices[controller]:
-                current_devices_result =  main.Mininet1.compare_switches(MNTopo, json.loads(devices[controller]))
+            if ports[ controller ] or "Error" not in ports[ controller ]:
+                currentPortsResult = main.Mininet1.comparePorts(
+                    MNTopo,
+                    json.loads(
+                        ports[ controller ] ) )
             else:
-                current_devices_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_devices_result,
-                    onpass="ONOS"+str(int(controller+1))+" Switches view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" Switches view is incorrect")
+                currentPortsResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentPortsResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " ports view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " ports view is incorrect" )
 
-            if ports[controller] or not "Error" in ports[controller]:
-                current_ports_result =  main.Mininet1.compare_ports(MNTopo, json.loads(ports[controller]))
+            if links[ controller ] or "Error" not in links[ controller ]:
+                currentLinksResult = main.Mininet1.compareLinks(
+                    MNTopo,
+                    json.loads(
+                        links[ controller ] ) )
             else:
-                current_ports_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_ports_result,
-                    onpass="ONOS"+str(int(controller+1))+" ports view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" ports view is incorrect")
+                currentLinksResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentLinksResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " links view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " links view is incorrect" )
 
-            if links[controller] or not "Error" in links[controller]:
-                current_links_result =  main.Mininet1.compare_links(MNTopo, json.loads(links[controller]))
-            else:
-                current_links_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_links_result,
-                    onpass="ONOS"+str(int(controller+1))+" links view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" links view is incorrect")
+            devicesResults = devicesResults and currentDevicesResult
+            portsResults = portsResults and currentPortsResult
+            linksResults = linksResults and currentLinksResult
 
-            devices_results = devices_results and current_devices_result
-            ports_results = ports_results and current_ports_result
-            links_results = links_results and current_links_result
+        topoResult = devicesResults and portsResults and linksResults\
+                     and consistentHostsResult and consistentClustersResult\
+                     and clusterResults and ipResult
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                 onpass="Topology Check Test successful",
+                                 onfail="Topology Check Test NOT successful" )
 
-        topo_result = devices_results and ports_results and links_results\
-                and consistent_hosts_result and consistent_clusters_result\
-                and consistent_paths_result
-        utilities.assert_equals(expect=main.TRUE, actual=topo_result,
-                onpass="Topology Check Test successful",
-                onfail="Topology Check Test NOT successful")
+        finalAssert = main.TRUE
+        finalAssert = finalAssert and topoResult and flowCheck \
+                      and intentCheck and consistentMastership and rolesNotNull
+        utilities.assert_equals( expect=main.TRUE, actual=finalAssert,
+                                 onpass="State check successful",
+                                 onfail="State check NOT successful" )
 
-        final_assert = main.TRUE
-        final_assert = final_assert and topo_result and flow_check \
-                and intent_check and consistent_mastership and roles_not_null
-        utilities.assert_equals(expect=main.TRUE, actual=final_assert,
-                onpass="State check successful",
-                onfail="State check NOT successful")
-
-
-    def CASE6(self,main) :
-        '''
+    def CASE6( self, main ):
+        """
         The Failure case.
-        '''
-        main.log.report("Restart entire ONOS cluster")
-        main.log.case("Restart entire ONOS cluster")
-        main.ONOSbench.onos_kill(ONOS1_ip)
-        main.ONOSbench.onos_kill(ONOS2_ip)
-        main.ONOSbench.onos_kill(ONOS3_ip)
-        main.ONOSbench.onos_kill(ONOS4_ip)
-        main.ONOSbench.onos_kill(ONOS5_ip)
-        main.ONOSbench.onos_kill(ONOS6_ip)
-        main.ONOSbench.onos_kill(ONOS7_ip)
+        """
+        main.log.report( "Restart entire ONOS cluster" )
+        main.log.case( "Restart entire ONOS cluster" )
+        main.ONOSbench.onosKill( ONOS1Ip )
+        main.ONOSbench.onosKill( ONOS2Ip )
+        main.ONOSbench.onosKill( ONOS3Ip )
+        main.ONOSbench.onosKill( ONOS4Ip )
+        main.ONOSbench.onosKill( ONOS5Ip )
+        main.ONOSbench.onosKill( ONOS6Ip )
+        main.ONOSbench.onosKill( ONOS7Ip )
 
-        main.step("Checking if ONOS is up yet")
+        main.step( "Checking if ONOS is up yet" )
         count = 0
-        onos_isup_result = main.FALSE
-        while onos_isup_result == main.FALSE and count < 10:
-            onos1_isup = main.ONOSbench.isup(ONOS1_ip)
-            onos2_isup = main.ONOSbench.isup(ONOS2_ip)
-            onos3_isup = main.ONOSbench.isup(ONOS3_ip)
-            onos4_isup = main.ONOSbench.isup(ONOS4_ip)
-            onos5_isup = main.ONOSbench.isup(ONOS5_ip)
-            onos6_isup = main.ONOSbench.isup(ONOS6_ip)
-            onos7_isup = main.ONOSbench.isup(ONOS7_ip)
-            onos_isup_result = onos1_isup and onos2_isup and onos3_isup\
-                    and onos4_isup and onos5_isup and onos6_isup and onos7_isup
+        onosIsupResult = main.FALSE
+        while onosIsupResult == main.FALSE and count < 10:
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+            onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+            onos4Isup = main.ONOSbench.isup( ONOS4Ip )
+            onos5Isup = main.ONOSbench.isup( ONOS5Ip )
+            onos6Isup = main.ONOSbench.isup( ONOS6Ip )
+            onos7Isup = main.ONOSbench.isup( ONOS7Ip )
+            onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
+                and onos4Isup and onos5Isup and onos6Isup and onos7Isup
             count = count + 1
         # TODO: if it becomes an issue, we can retry this step  a few times
 
+        cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
+        cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
+        cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
+        cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
+        cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
+        cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
+        cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
+        cliResults = cliResult1 and cliResult2 and cliResult3\
+            and cliResult4 and cliResult5 and cliResult6\
+            and cliResult7
 
-        cli_result1 = main.ONOScli1.start_onos_cli(ONOS1_ip)
-        cli_result2 = main.ONOScli2.start_onos_cli(ONOS2_ip)
-        cli_result3 = main.ONOScli3.start_onos_cli(ONOS3_ip)
-        cli_result4 = main.ONOScli4.start_onos_cli(ONOS4_ip)
-        cli_result5 = main.ONOScli5.start_onos_cli(ONOS5_ip)
-        cli_result6 = main.ONOScli6.start_onos_cli(ONOS6_ip)
-        cli_result7 = main.ONOScli7.start_onos_cli(ONOS7_ip)
-        cli_results = cli_result1 and cli_result2 and cli_result3\
-                and cli_result4 and cli_result5 and cli_result6\
-                and cli_result7
+        caseResults = main.TRUE and onosIsupResult and cliResults
+        utilities.assert_equals( expect=main.TRUE, actual=caseResults,
+                                 onpass="ONOS restart successful",
+                                 onfail="ONOS restart NOT successful" )
 
-        case_results = main.TRUE and onos_isup_result and cli_results
-        utilities.assert_equals(expect=main.TRUE, actual=case_results,
-                onpass="ONOS restart successful",
-                onfail="ONOS restart NOT successful")
-
-
-    def CASE7(self,main) :
-        '''
+    def CASE7( self, main ):
+        """
         Check state after ONOS failure
-        '''
-        import os
+        """
         import json
-        main.case("Running ONOS Constant State Tests")
+        main.case( "Running ONOS Constant State Tests" )
 
-        #Assert that each device has a master
-        ONOS1_master_not_null = main.ONOScli1.roles_not_null()
-        ONOS2_master_not_null = main.ONOScli2.roles_not_null()
-        ONOS3_master_not_null = main.ONOScli3.roles_not_null()
-        ONOS4_master_not_null = main.ONOScli4.roles_not_null()
-        ONOS5_master_not_null = main.ONOScli5.roles_not_null()
-        ONOS6_master_not_null = main.ONOScli6.roles_not_null()
-        ONOS7_master_not_null = main.ONOScli7.roles_not_null()
-        roles_not_null = ONOS1_master_not_null and ONOS2_master_not_null and\
-                ONOS3_master_not_null and ONOS4_master_not_null and\
-                ONOS5_master_not_null and ONOS6_master_not_null and\
-                ONOS7_master_not_null
-        utilities.assert_equals(expect = main.TRUE,actual=roles_not_null,
-                onpass="Each device has a master",
-                onfail="Some devices don't have a master assigned")
+        # Assert that each device has a master
+        ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
+        ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
+        ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
+        ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
+        ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
+        ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
+        ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
+        rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
+            ONOS3MasterNotNull and ONOS4MasterNotNull and\
+            ONOS5MasterNotNull and ONOS6MasterNotNull and\
+            ONOS7MasterNotNull
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=rolesNotNull,
+            onpass="Each device has a master",
+            onfail="Some devices don't have a master assigned" )
 
-
-
-        main.step("Check if switch roles are consistent across all nodes")
-        ONOS1_mastership = main.ONOScli1.roles()
-        ONOS2_mastership = main.ONOScli2.roles()
-        ONOS3_mastership = main.ONOScli3.roles()
-        ONOS4_mastership = main.ONOScli4.roles()
-        ONOS5_mastership = main.ONOScli5.roles()
-        ONOS6_mastership = main.ONOScli6.roles()
-        ONOS7_mastership = main.ONOScli7.roles()
-        #print json.dumps(json.loads(ONOS1_mastership), sort_keys=True, indent=4, separators=(',', ': '))
-        if "Error" in ONOS1_mastership or not ONOS1_mastership\
-                or "Error" in ONOS2_mastership or not ONOS2_mastership\
-                or "Error" in ONOS3_mastership or not ONOS3_mastership\
-                or "Error" in ONOS4_mastership or not ONOS4_mastership\
-                or "Error" in ONOS5_mastership or not ONOS5_mastership\
-                or "Error" in ONOS6_mastership or not ONOS6_mastership\
-                or "Error" in ONOS7_mastership or not ONOS7_mastership:
-                    main.log.error("Error in getting ONOS mastership")
-                    main.log.warn("ONOS1 mastership response: " + repr(ONOS1_mastership))
-                    main.log.warn("ONOS2 mastership response: " + repr(ONOS2_mastership))
-                    main.log.warn("ONOS3 mastership response: " + repr(ONOS3_mastership))
-                    main.log.warn("ONOS4 mastership response: " + repr(ONOS4_mastership))
-                    main.log.warn("ONOS5 mastership response: " + repr(ONOS5_mastership))
-                    main.log.warn("ONOS6 mastership response: " + repr(ONOS6_mastership))
-                    main.log.warn("ONOS7 mastership response: " + repr(ONOS7_mastership))
-                    consistent_mastership = main.FALSE
-        elif ONOS1_mastership == ONOS2_mastership\
-                and ONOS1_mastership == ONOS3_mastership\
-                and ONOS1_mastership == ONOS4_mastership\
-                and ONOS1_mastership == ONOS5_mastership\
-                and ONOS1_mastership == ONOS6_mastership\
-                and ONOS1_mastership == ONOS7_mastership:
-                    consistent_mastership = main.TRUE
-                    main.log.report("Switch roles are consistent across all ONOS nodes")
+        main.step( "Check if switch roles are consistent across all nodes" )
+        ONOS1Mastership = main.ONOScli1.roles()
+        ONOS2Mastership = main.ONOScli2.roles()
+        ONOS3Mastership = main.ONOScli3.roles()
+        ONOS4Mastership = main.ONOScli4.roles()
+        ONOS5Mastership = main.ONOScli5.roles()
+        ONOS6Mastership = main.ONOScli6.roles()
+        ONOS7Mastership = main.ONOScli7.roles()
+        if "Error" in ONOS1Mastership or not ONOS1Mastership\
+                or "Error" in ONOS2Mastership or not ONOS2Mastership\
+                or "Error" in ONOS3Mastership or not ONOS3Mastership\
+                or "Error" in ONOS4Mastership or not ONOS4Mastership\
+                or "Error" in ONOS5Mastership or not ONOS5Mastership\
+                or "Error" in ONOS6Mastership or not ONOS6Mastership\
+                or "Error" in ONOS7Mastership or not ONOS7Mastership:
+            main.log.error( "Error in getting ONOS mastership" )
+            main.log.warn( "ONOS1 mastership response: " +
+                           repr( ONOS1Mastership ) )
+            main.log.warn( "ONOS2 mastership response: " +
+                           repr( ONOS2Mastership ) )
+            main.log.warn( "ONOS3 mastership response: " +
+                           repr( ONOS3Mastership ) )
+            main.log.warn( "ONOS4 mastership response: " +
+                           repr( ONOS4Mastership ) )
+            main.log.warn( "ONOS5 mastership response: " +
+                           repr( ONOS5Mastership ) )
+            main.log.warn( "ONOS6 mastership response: " +
+                           repr( ONOS6Mastership ) )
+            main.log.warn( "ONOS7 mastership response: " +
+                           repr( ONOS7Mastership ) )
+            consistentMastership = main.FALSE
+        elif ONOS1Mastership == ONOS2Mastership\
+                and ONOS1Mastership == ONOS3Mastership\
+                and ONOS1Mastership == ONOS4Mastership\
+                and ONOS1Mastership == ONOS5Mastership\
+                and ONOS1Mastership == ONOS6Mastership\
+                and ONOS1Mastership == ONOS7Mastership:
+            consistentMastership = main.TRUE
+            main.log.report(
+                "Switch roles are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 roles: ", json.dumps(json.loads(ONOS1_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 roles: ", json.dumps(json.loads(ONOS2_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 roles: ", json.dumps(json.loads(ONOS3_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 roles: ", json.dumps(json.loads(ONOS4_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 roles: ", json.dumps(json.loads(ONOS5_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 roles: ", json.dumps(json.loads(ONOS6_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 roles: ", json.dumps(json.loads(ONOS7_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            consistent_mastership = main.FALSE
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_mastership,
-                onpass="Switch roles are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of switch roles")
-
+            main.log.warn( "ONOS1 roles: ", json.dumps(
+                json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS2 roles: ", json.dumps(
+                json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS3 roles: ", json.dumps(
+                json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS4 roles: ", json.dumps(
+                json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS5 roles: ", json.dumps(
+                json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS6 roles: ", json.dumps(
+                json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS7 roles: ", json.dumps(
+                json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            consistentMastership = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentMastership,
+            onpass="Switch roles are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of switch roles" )
 
         description2 = "Compare switch roles from before failure"
-        main.step(description2)
+        main.step( description2 )
 
-        current_json = json.loads(ONOS1_mastership)
-        old_json = json.loads(mastership_state)
-        mastership_check = main.TRUE
-        for i in range(1,29):
-            switchDPID = str(main.Mininet1.getSwitchDPID(switch="s"+str(i)))
+        currentJson = json.loads( ONOS1Mastership )
+        oldJson = json.loads( mastershipState )
+        mastershipCheck = main.TRUE
+        for i in range( 1, 29 ):
+            switchDPID = str(
+                main.Mininet1.getSwitchDPID(
+                    switch="s" +
+                    str( i ) ) )
 
-            current = [switch['master'] for switch in current_json if switchDPID in switch['id']]
-            old = [switch['master'] for switch in old_json if switchDPID in switch['id']]
+            current = [ switch[ 'master' ] for switch in currentJson
+                        if switchDPID in switch[ 'id' ] ]
+            old = [ switch[ 'master' ] for switch in oldJson
+                    if switchDPID in switch[ 'id' ] ]
             if current == old:
-                mastership_check = mastership_check and main.TRUE
+                mastershipCheck = mastershipCheck and main.TRUE
             else:
-                main.log.warn("Mastership of switch %s changed" % switchDPID)
-                mastership_check = main.FALSE
-        if mastership_check == main.TRUE:
-            main.log.report("Mastership of Switches was not changed")
-        utilities.assert_equals(expect=main.TRUE,actual=mastership_check,
-                onpass="Mastership of Switches was not changed",
-                onfail="Mastership of some switches changed")
-        #NOTE: we expect mastership to change on controller failure
-        mastership_check = consistent_mastership
+                main.log.warn( "Mastership of switch %s changed" % switchDPID )
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
+            main.log.report( "Mastership of Switches was not changed" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=mastershipCheck,
+            onpass="Mastership of Switches was not changed",
+            onfail="Mastership of some switches changed" )
+        # NOTE: we expect mastership to change on controller failure
+        mastershipCheck = mastershipCheck and consistentMastership
 
-
-
-        main.step("Get the intents and compare across all nodes")
-        ONOS1_intents = main.ONOScli1.intents( json_format=True )
-        ONOS2_intents = main.ONOScli2.intents( json_format=True )
-        ONOS3_intents = main.ONOScli3.intents( json_format=True )
-        ONOS4_intents = main.ONOScli4.intents( json_format=True )
-        ONOS5_intents = main.ONOScli5.intents( json_format=True )
-        ONOS6_intents = main.ONOScli6.intents( json_format=True )
-        ONOS7_intents = main.ONOScli7.intents( json_format=True )
-        intent_check = main.FALSE
-        if "Error" in ONOS1_intents or not ONOS1_intents\
-                or "Error" in ONOS2_intents or not ONOS2_intents\
-                or "Error" in ONOS3_intents or not ONOS3_intents\
-                or "Error" in ONOS4_intents or not ONOS4_intents\
-                or "Error" in ONOS5_intents or not ONOS5_intents\
-                or "Error" in ONOS6_intents or not ONOS6_intents\
-                or "Error" in ONOS7_intents or not ONOS7_intents:
-                    main.log.report("Error in getting ONOS intents")
-                    main.log.warn("ONOS1 intents response: " + repr(ONOS1_intents))
-                    main.log.warn("ONOS2 intents response: " + repr(ONOS2_intents))
-                    main.log.warn("ONOS3 intents response: " + repr(ONOS3_intents))
-                    main.log.warn("ONOS4 intents response: " + repr(ONOS4_intents))
-                    main.log.warn("ONOS5 intents response: " + repr(ONOS5_intents))
-                    main.log.warn("ONOS6 intents response: " + repr(ONOS6_intents))
-                    main.log.warn("ONOS7 intents response: " + repr(ONOS7_intents))
-        elif ONOS1_intents == ONOS2_intents\
-                and ONOS1_intents == ONOS3_intents\
-                and ONOS1_intents == ONOS4_intents\
-                and ONOS1_intents == ONOS5_intents\
-                and ONOS1_intents == ONOS6_intents\
-                and ONOS1_intents == ONOS7_intents:
-                    intent_check = main.TRUE
-                    main.log.report("Intents are consistent across all ONOS nodes")
+        main.step( "Get the intents and compare across all nodes" )
+        ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
+        ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
+        ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
+        ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
+        ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
+        ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
+        ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+        intentCheck = main.FALSE
+        if "Error" in ONOS1Intents or not ONOS1Intents\
+                or "Error" in ONOS2Intents or not ONOS2Intents\
+                or "Error" in ONOS3Intents or not ONOS3Intents\
+                or "Error" in ONOS4Intents or not ONOS4Intents\
+                or "Error" in ONOS5Intents or not ONOS5Intents\
+                or "Error" in ONOS6Intents or not ONOS6Intents\
+                or "Error" in ONOS7Intents or not ONOS7Intents:
+            main.log.report( "Error in getting ONOS intents" )
+            main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
+            main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
+            main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
+            main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
+            main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
+            main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
+            main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
+        elif ONOS1Intents == ONOS2Intents\
+                and ONOS1Intents == ONOS3Intents\
+                and ONOS1Intents == ONOS4Intents\
+                and ONOS1Intents == ONOS5Intents\
+                and ONOS1Intents == ONOS6Intents\
+                and ONOS1Intents == ONOS7Intents:
+            intentCheck = main.TRUE
+            main.log.report( "Intents are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 intents: ")
-            print json.dumps(json.loads(ONOS1_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS2 intents: ")
-            print json.dumps(json.loads(ONOS2_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS3 intents: ")
-            print json.dumps(json.loads(ONOS3_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS4 intents: ")
-            print json.dumps(json.loads(ONOS4_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS5 intents: ")
-            print json.dumps(json.loads(ONOS5_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS6 intents: ")
-            print json.dumps(json.loads(ONOS6_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS7 intents: ")
-            print json.dumps(json.loads(ONOS7_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-        utilities.assert_equals(expect = main.TRUE,actual=intent_check,
-                onpass="Intents are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of intents")
+            main.log.warn( "ONOS1 intents: " )
+            print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS2 intents: " )
+            print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS3 intents: " )
+            print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS4 intents: " )
+            print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS5 intents: " )
+            print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS6 intents: " )
+            print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS7 intents: " )
+            print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=intentCheck,
+            onpass="Intents are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of intents" )
+        # Print the intent states
+        intents = []
+        intents.append( ONOS1Intents )
+        intents.append( ONOS2Intents )
+        intents.append( ONOS3Intents )
+        intents.append( ONOS4Intents )
+        intents.append( ONOS5Intents )
+        intents.append( ONOS6Intents )
+        intents.append( ONOS7Intents )
+        intentStates = []
+        for node in intents:  # Iter through ONOS nodes
+            nodeStates = []
+            # Iter through intents of a node
+            for intent in json.loads( node ):
+                nodeStates.append( intent[ 'state' ] )
+            intentStates.append( nodeStates )
+            out = [ (i, nodeStates.count( i ) ) for i in set( nodeStates ) ]
+            main.log.info( dict( out ) )
 
-        #NOTE: Hazelcast has no durability, so intents are lost across system restarts
-        '''
-        main.step("Compare current intents with intents before the failure")
-        #NOTE: this requires case 5 to pass for intent_state to be set.
+        # NOTE: Store has no durability, so intents are lost across system
+        #       restarts
+        """
+        main.step( "Compare current intents with intents before the failure" )
+        # NOTE: this requires case 5 to pass for intentState to be set.
         #      maybe we should stop the test if that fails?
-        if intent_state == ONOS1_intents:
-            same_intents = main.TRUE
-            main.log.report("Intents are consistent with before failure")
-        #TODO: possibly the states have changed? we may need to figure out what the aceptable states are
+        sameIntents = main.TRUE
+        if intentState and intentState == ONOS1Intents:
+            sameIntents = main.TRUE
+            main.log.report( "Intents are consistent with before failure" )
+        # TODO: possibly the states have changed? we may need to figure out
+        # what the aceptable states are
         else:
             try:
-                main.log.warn("ONOS1 intents: ")
-                print json.dumps(json.loads(ONOS1_intents),
-                    sort_keys=True, indent=4, separators=(',', ': '))
-            except:
+                main.log.warn( "ONOS1 intents: " )
+                print json.dumps( json.loads( ONOS1Intents ),
+                                  sort_keys=True, indent=4,
+                                  separators=( ',', ': ' ) )
+            except Exception:
                 pass
-            same_intents = main.FALSE
-        utilities.assert_equals(expect = main.TRUE,actual=same_intents,
-                onpass="Intents are consistent with before failure",
-                onfail="The Intents changed during failure")
-        intent_check = intent_check and same_intents
-        '''
+            sameIntents = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=sameIntents,
+            onpass="Intents are consistent with before failure",
+            onfail="The Intents changed during failure" )
+        intentCheck = intentCheck and sameIntents
+        """
+        main.step( "Get the OF Table entries and compare to before " +
+                   "component failure" )
+        FlowTables = main.TRUE
+        flows2 = []
+        for i in range( 28 ):
+            main.log.info( "Checking flow table on s" + str( i + 1 ) )
+            tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
+            flows2.append( tmpFlows )
+            tempResult = main.Mininet2.flowComp(
+                flow1=flows[ i ],
+                flow2=tmpFlows )
+            FlowTables = FlowTables and tempResult
+            if FlowTables == main.FALSE:
+                main.log.info( "Differences in flow table for switch: s" +
+                               str( i + 1 ) )
+        if FlowTables == main.TRUE:
+            main.log.report( "No changes were found in the flow tables" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=FlowTables,
+            onpass="No changes were found in the flow tables",
+            onfail="Changes were found in the flow tables" )
 
-
-
-        main.step("Get the OF Table entries and compare to before component failure")
-        Flow_Tables = main.TRUE
-        flows2=[]
-        for i in range(28):
-            main.log.info("Checking flow table on s" + str(i+1))
-            tmp_flows = main.Mininet2.get_flowTable(1.3, "s"+str(i+1))
-            flows2.append(tmp_flows)
-            temp_result = main.Mininet2.flow_comp(flow1=flows[i],flow2=tmp_flows)
-            Flow_Tables = Flow_Tables and temp_result
-            if Flow_Tables == main.FALSE:
-                main.log.info("Differences in flow table for switch: "+str(i+1))
-        if Flow_Tables == main.TRUE:
-            main.log.report("No changes were found in the flow tables")
-        utilities.assert_equals(expect=main.TRUE,actual=Flow_Tables,
-                onpass="No changes were found in the flow tables",
-                onfail="Changes were found in the flow tables")
-
-        main.step("Check the continuous pings to ensure that no packets were dropped during component failure")
-        #FIXME: This check is always failing. Investigate cause
-        #NOTE:  this may be something to do with file permsissions
+        main.step( "Check the continuous pings to ensure that no packets " +
+                   "were dropped during component failure" )
+        # FIXME: This check is always failing. Investigate cause
+        # NOTE:  this may be something to do with file permsissions
         #       or slight change in format
-        main.Mininet2.pingKill(main.params['TESTONUSER'], main.params['TESTONIP'])
-        Loss_In_Pings = main.FALSE 
-        #NOTE: checkForLoss returns main.FALSE with 0% packet loss
-        for i in range(8,18):
-            main.log.info("Checking for a loss in pings along flow from s" + str(i))
-            Loss_In_Pings = main.Mininet2.checkForLoss("/tmp/ping.h"+str(i)) or Loss_In_Pings
-        if Loss_In_Pings == main.TRUE:
-            main.log.info("Loss in ping detected")
-        elif Loss_In_Pings == main.ERROR:
-            main.log.info("There are multiple mininet process running")
-        elif Loss_In_Pings == main.FALSE:
-            main.log.info("No Loss in the pings")
-            main.log.report("No loss of dataplane connectivity")
-        utilities.assert_equals(expect=main.FALSE,actual=Loss_In_Pings,
-                onpass="No Loss of connectivity",
-                onfail="Loss of dataplane connectivity detected")
-        #NOTE: Since intents are not persisted with Hazelcast, we expect this
-        Loss_In_Pings = main.FALSE
+        main.Mininet2.pingKill(
+            main.params[ 'TESTONUSER' ],
+            main.params[ 'TESTONIP' ] )
+        LossInPings = main.FALSE
+        # NOTE: checkForLoss returns main.FALSE with 0% packet loss
+        for i in range( 8, 18 ):
+            main.log.info(
+                "Checking for a loss in pings along flow from s" +
+                str( i ) )
+            LossInPings = main.Mininet2.checkForLoss(
+                "/tmp/ping.h" +
+                str( i ) ) or LossInPings
+        if LossInPings == main.TRUE:
+            main.log.info( "Loss in ping detected" )
+        elif LossInPings == main.ERROR:
+            main.log.info( "There are multiple mininet process running" )
+        elif LossInPings == main.FALSE:
+            main.log.info( "No Loss in the pings" )
+            main.log.report( "No loss of dataplane connectivity" )
+        utilities.assert_equals(
+            expect=main.FALSE,
+            actual=LossInPings,
+            onpass="No Loss of connectivity",
+            onfail="Loss of dataplane connectivity detected" )
+        # NOTE: Since intents are not persisted with IntnentStore,
+        #       we expect loss in dataplane connectivity
+        LossInPings = main.FALSE
 
-
-        #Test of LeadershipElection
-        leader_list = []
-        leader_result = main.TRUE
-        for controller in range(1,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            leaderN = node.election_test_leader()
-            leader_list.append(leaderN)
+        # Test of LeadershipElection
+        leaderList = []
+        leaderResult = main.TRUE
+        for controller in range( 1, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            leaderN = node.electionTestLeader()
+            leaderList.append( leaderN )
             if leaderN == main.FALSE:
-                #error in  response
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
-            elif leaderN == None:
-                main.log.report("ONOS"+str(controller) + " shows no leader for the election-app was elected after the old one died")
-                leader_result = main.FALSE
-        if len( set( leader_list ) ) != 1:
-            leader_result = main.FALSE
-            main.log.error("Inconsistent view of leader for the election test app")
-            #TODO: print the list
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a new leader was re-elected after restart)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+                # error in  response
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, check the" +
+                                 " error logs" )
+                leaderResult = main.FALSE
+            elif leaderN is None:
+                main.log.report( "ONOS" + str( controller ) +
+                                 " shows no leader for the election-app was" +
+                                 " elected after the old one died" )
+                leaderResult = main.FALSE
+        if len( set( leaderList ) ) != 1:
+            leaderResult = main.FALSE
+            main.log.error(
+                "Inconsistent view of leader for the election test app" )
+            # TODO: print the list
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a new " +
+                             "leader was re-elected if applicable )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-
-        result = mastership_check and intent_check and Flow_Tables and (not Loss_In_Pings) and roles_not_null\
-                and leader_result
-        result = int(result)
+        result = ( mastershipCheck and intentCheck and FlowTables and
+                   ( not LossInPings ) and rolesNotNull and leaderResult )
+        result = int( result )
         if result == main.TRUE:
-            main.log.report("Constant State Tests Passed")
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="Constant State Tests Passed",
-                onfail="Constant state tests failed")
+            main.log.report( "Constant State Tests Passed" )
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="Constant State Tests Passed",
+                                 onfail="Constant state tests failed" )
 
-    def CASE8 (self,main):
-        '''
+    def CASE8( self, main ):
+        """
         Compare topo
-        '''
+        """
         import sys
-        sys.path.append("/home/admin/sts") # Trying to remove some dependancies, #FIXME add this path to params
-        from sts.topology.teston_topology import TestONTopology # assumes that sts is already in you PYTHONPATH
+        # FIXME add this path to params
+        sys.path.append( "/home/admin/sts" )
+        # assumes that sts is already in you PYTHONPATH
+        from sts.topology.teston_topology import TestONTopology
         import json
         import time
 
-        description ="Compare ONOS Topology view to Mininet topology"
-        main.case(description)
-        main.log.report(description)
-        main.step("Create TestONTopology object")
+        description = "Compare ONOS Topology view to Mininet topology"
+        main.case( description )
+        main.log.report( description )
+        main.step( "Create TestONTopology object" )
         ctrls = []
         count = 1
         while True:
             temp = ()
-            if ('ip' + str(count)) in main.params['CTRL']:
-                temp = temp + (getattr(main,('ONOS' + str(count))),)
-                temp = temp + ("ONOS"+str(count),)
-                temp = temp + (main.params['CTRL']['ip'+str(count)],)
-                temp = temp + (eval(main.params['CTRL']['port'+str(count)]),)
-                ctrls.append(temp)
+            if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
+                temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
+                temp = temp + ( "ONOS" + str( count ), )
+                temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
+                temp = temp + \
+                    ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+                ctrls.append( temp )
                 count = count + 1
             else:
                 break
-        MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        MNTopo = TestONTopology(
+            main.Mininet1,
+            ctrls )  # can also add Intent API info for intent operations
 
-        main.step("Comparing ONOS topology to MN")
-        devices_results = main.TRUE
-        ports_results = main.TRUE
-        links_results = main.TRUE
-        topo_result = main.FALSE
+        main.step( "Comparing ONOS topology to MN" )
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = main.TRUE
+        hostsResults = main.TRUE
+        topoResult = main.FALSE
         elapsed = 0
         count = 0
-        main.step("Collecting topology information from ONOS")
-        start_time = time.time()
-        while topo_result == main.FALSE and elapsed < 60:
+        main.step( "Collecting topology information from ONOS" )
+        startTime = time.time()
+        # Give time for Gossip to work
+        while topoResult == main.FALSE and elapsed < 60:
             count = count + 1
             if count > 1:
-                MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
-            cli_start = time.time()
+                # TODO: Depricate STS usage
+                MNTopo = TestONTopology( main.Mininet1, ctrls )
+            cliStart = time.time()
             devices = []
             devices.append( main.ONOScli1.devices() )
             devices.append( main.ONOScli2.devices() )
@@ -1337,13 +1725,22 @@
             devices.append( main.ONOScli6.devices() )
             devices.append( main.ONOScli7.devices() )
             hosts = []
-            hosts.append( main.ONOScli1.hosts() )
-            hosts.append( main.ONOScli2.hosts() )
-            hosts.append( main.ONOScli3.hosts() )
-            hosts.append( main.ONOScli4.hosts() )
-            hosts.append( main.ONOScli5.hosts() )
-            hosts.append( main.ONOScli6.hosts() )
-            hosts.append( main.ONOScli7.hosts() )
+            hosts.append( json.loads( main.ONOScli1.hosts() ) )
+            hosts.append( json.loads( main.ONOScli2.hosts() ) )
+            hosts.append( json.loads( main.ONOScli3.hosts() ) )
+            hosts.append( json.loads( main.ONOScli4.hosts() ) )
+            hosts.append( json.loads( main.ONOScli5.hosts() ) )
+            hosts.append( json.loads( main.ONOScli6.hosts() ) )
+            hosts.append( json.loads( main.ONOScli7.hosts() ) )
+            ipResult = main.TRUE
+            for controller in range( 0, len( hosts ) ):
+                controllerStr = str( controller + 1 )
+                for host in hosts[ controller ]:
+                    if host is None or host.get( 'ips', [] ) == []:
+                        main.log.error(
+                            "DEBUG:Error with host ips on controller" +
+                            controllerStr + ": " + str( host ) )
+                        ipResult = main.FALSE
             ports = []
             ports.append( main.ONOScli1.ports() )
             ports.append( main.ONOScli2.ports() )
@@ -1368,491 +1765,551 @@
             clusters.append( main.ONOScli5.clusters() )
             clusters.append( main.ONOScli6.clusters() )
             clusters.append( main.ONOScli7.clusters() )
-            paths = []
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli1.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli2.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli3.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli4.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli5.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli6.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli7.topology() )
-            paths.append( temp_topo.get('paths', False) )
 
+            elapsed = time.time() - startTime
+            cliTime = time.time() - cliStart
+            print "CLI time: " + str( cliTime )
 
-            elapsed = time.time() - start_time
-            cli_time = time.time() - cli_start
-            print "CLI time: " + str(cli_time)
-
-            for controller in range(num_controllers):
-                if devices[controller] or not "Error" in devices[controller]:
-                    current_devices_result =  main.Mininet1.compare_switches(MNTopo, json.loads(devices[controller]))
+            for controller in range( numControllers ):
+                controllerStr = str( controller + 1 )
+                if devices[ controller ] or "Error" not in devices[
+                        controller ]:
+                    currentDevicesResult = main.Mininet1.compareSwitches(
+                        MNTopo,
+                        json.loads( devices[ controller ] ) )
                 else:
-                    current_devices_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_devices_result,
-                        onpass="ONOS"+str(int(controller+1))+" Switches view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" Switches view is incorrect")
+                    currentDevicesResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentDevicesResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " Switches view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " Switches view is incorrect" )
 
-                if ports[controller] or not "Error" in ports[controller]:
-                    current_ports_result =  main.Mininet1.compare_ports(MNTopo, json.loads(ports[controller]))
+                if ports[ controller ] or "Error" not in ports[ controller ]:
+                    currentPortsResult = main.Mininet1.comparePorts(
+                        MNTopo,
+                        json.loads( ports[ controller ] ) )
                 else:
-                    current_ports_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_ports_result,
-                        onpass="ONOS"+str(int(controller+1))+" ports view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" ports view is incorrect")
+                    currentPortsResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentPortsResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " ports view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " ports view is incorrect" )
 
-                if links[controller] or not "Error" in links[controller]:
-                    current_links_result =  main.Mininet1.compare_links(MNTopo, json.loads(links[controller]))
+                if links[ controller ] or "Error" not in links[ controller ]:
+                    currentLinksResult = main.Mininet1.compareLinks(
+                        MNTopo,
+                        json.loads( links[ controller ] ) )
                 else:
-                    current_links_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_links_result,
-                        onpass="ONOS"+str(int(controller+1))+" links view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" links view is incorrect")
-            devices_results = devices_results and current_devices_result
-            ports_results = ports_results and current_ports_result
-            links_results = links_results and current_links_result
+                    currentLinksResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentLinksResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " links view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " links view is incorrect" )
 
-            #Compare json objects for hosts, dataplane clusters and paths
+                if hosts[ controller ] or "Error" not in hosts[ controller ]:
+                    currentHostsResult = main.Mininet1.compareHosts(
+                        MNTopo, hosts[ controller ] )
+                else:
+                    currentHostsResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentHostsResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " hosts exist in Mininet",
+                                         onfail="ONOS" + controllerStr +
+                                         " hosts don't match Mininet" )
 
-            #hosts
-            consistent_hosts_result = main.TRUE
+                devicesResults = devicesResults and currentDevicesResult
+                portsResults = portsResults and currentPortsResult
+                linksResults = linksResults and currentLinksResult
+                hostsResults = hostsResults and currentHostsResult
+
+            # Compare json objects for hosts and dataplane clusters
+
+            # hosts
+            consistentHostsResult = main.TRUE
             for controller in range( len( hosts ) ):
-                if not "Error" in hosts[controller]:
-                    if hosts[controller] == hosts[0]:
+                controllerStr = str( controller + 1 )
+                if "Error" not in hosts[ controller ]:
+                    if hosts[ controller ] == hosts[ 0 ]:
                         continue
-                    else:#hosts not consistent
-                        main.log.report("hosts from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                        main.log.warn( repr( hosts[controller] ) )
-                        consistent_hosts_result = main.FALSE
+                    else:  # hosts not consistent
+                        main.log.report( "hosts from ONOS" + controllerStr +
+                                         " is inconsistent with ONOS1" )
+                        main.log.warn( repr( hosts[ controller ] ) )
+                        consistentHostsResult = main.FALSE
 
                 else:
-                    main.log.report("Error in getting ONOS hosts from ONOS" + str(controller + 1) )
-                    consistent_hosts_result = main.FALSE
-                    main.log.warn("ONOS" + str(controller + 1) + " hosts response: " + repr(hosts[controller]) )
-            utilities.assert_equals(expect = main.TRUE,actual=consistent_hosts_result,
-                    onpass="Hosts view is consistent across all ONOS nodes",
-                    onfail="ONOS nodes have different views of hosts")
+                    main.log.report( "Error in getting ONOS hosts from ONOS" +
+                                     controllerStr )
+                    consistentHostsResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
+                                   " hosts response: " +
+                                   repr( hosts[ controller ] ) )
+            utilities.assert_equals(
+                expect=main.TRUE,
+                actual=consistentHostsResult,
+                onpass="Hosts view is consistent across all ONOS nodes",
+                onfail="ONOS nodes have different views of hosts" )
 
-            #Strongly connected clusters of devices
-            consistent_clusters_result = main.TRUE
+            # Strongly connected clusters of devices
+            consistentClustersResult = main.TRUE
             for controller in range( len( clusters ) ):
-                if not "Error" in clusters[controller]:
-                    if clusters[controller] == clusters[0]:
+                controllerStr = str( controller + 1 )
+                if "Error" not in clusters[ controller ]:
+                    if clusters[ controller ] == clusters[ 0 ]:
                         continue
-                    else:#clusters not consistent
-                        main.log.report("clusters from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                        consistent_clusters_result = main.FALSE
+                    else:  # clusters not consistent
+                        main.log.report( "clusters from ONOS" +
+                                         controllerStr +
+                                         " is inconsistent with ONOS1" )
+                        consistentClustersResult = main.FALSE
 
                 else:
-                    main.log.report("Error in getting dataplane clusters from ONOS" + str(controller + 1) )
-                    consistent_clusters_result = main.FALSE
-                    main.log.warn("ONOS" + str(controller + 1) + " clusters response: " + repr(clusters[controller]) )
-            utilities.assert_equals(expect = main.TRUE,actual=consistent_clusters_result,
-                    onpass="Clusters view is consistent across all ONOS nodes",
-                    onfail="ONOS nodes have different views of clusters")
-            num_clusters =  len(json.loads(clusters[0])) #there should always only be one cluster
-            utilities.assert_equals(expect = 1, actual = num_clusters,
-                    onpass="ONOS shows 1 SCC",
-                    onfail="ONOS shows "+str(num_clusters) +" SCCs")
+                    main.log.report( "Error in getting dataplane clusters " +
+                                     "from ONOS" + controllerStr )
+                    consistentClustersResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
+                                   " clusters response: " +
+                                   repr( clusters[ controller ] ) )
+            utilities.assert_equals(
+                expect=main.TRUE,
+                actual=consistentClustersResult,
+                onpass="Clusters view is consistent across all ONOS nodes",
+                onfail="ONOS nodes have different views of clusters" )
+            # there should always only be one cluster
+            numClusters = len( json.loads( clusters[ 0 ] ) )
+            clusterResults = main.FALSE
+            if numClusters == 1:
+                clusterResults = main.TRUE
+            utilities.assert_equals(
+                expect=1,
+                actual=numClusters,
+                onpass="ONOS shows 1 SCC",
+                onfail="ONOS shows " + str( numClusters ) + " SCCs" )
 
+            topoResult = ( devicesResults and portsResults and linksResults
+                           and hostsResults and consistentHostsResult
+                           and consistentClustersResult and clusterResults
+                           and ipResult )
 
-            #paths
-            consistent_paths_result = main.TRUE
-            for controller in range( len( paths ) ):
-                if not "Error" in paths[controller]:
-                    if paths[controller] == paths[0]:
-                        continue
-                    else:#paths not consistent
-                        main.log.report("paths from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                        consistent_paths_result = main.FALSE
+        topoResult = topoResult and int( count <= 2 )
+        note = "note it takes about " + str( int( cliTime ) ) + \
+            " seconds for the test to make all the cli calls to fetch " +\
+            "the topology from each ONOS instance"
+        main.log.info(
+            "Very crass estimate for topology discovery/convergence( " +
+            str( note ) + " ): " + str( elapsed ) + " seconds, " +
+            str( count ) + " tries" )
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                 onpass="Topology Check Test successful",
+                                 onfail="Topology Check Test NOT successful" )
+        if topoResult == main.TRUE:
+            main.log.report( "ONOS topology view matches Mininet topology" )
 
-                else:
-                    main.log.report("Error in getting paths from ONOS" + str(controller + 1) )
-                    consistent_paths_result = main.FALSE
-                    main.log.warn("ONOS" + str(controller + 1) + " paths response: " + repr(paths[controller]) )
-            utilities.assert_equals(expect = main.TRUE,actual=consistent_paths_result,
-                    onpass="Paths count is consistent across all ONOS nodes",
-                    onfail="ONOS nodes have different counts of paths")
-
-
-            topo_result = devices_results and ports_results and links_results\
-                    and consistent_hosts_result and consistent_clusters_result and consistent_paths_result
-
-        topo_result = topo_result and int(count <= 2)
-        note = "note it takes about "+str( int(cli_time) )+" seconds for the test to make all the cli calls to fetch the topology from each ONOS instance"
-        main.log.report("Very crass estimate for topology discovery/convergence("+ str(note) + "): " +\
-                str(elapsed) + " seconds, " + str(count) +" tries" )
-        utilities.assert_equals(expect=main.TRUE, actual=topo_result,
-                onpass="Topology Check Test successful",
-                onfail="Topology Check Test NOT successful")
-        if topo_result == main.TRUE:
-            main.log.report("ONOS topology view matches Mininet topology")
-
-
-    def CASE9 (self,main):
-        '''
+    def CASE9( self, main ):
+        """
         Link s3-s28 down
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        import time
+        # NOTE: You should probably run a topology check after this
 
-        link_sleep = float(main.params['timers']['LinkDiscovery'])
+        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        description = "Turn off a link to ensure that Link Discovery is working properly"
-        main.log.report(description)
-        main.case(description)
+        description = "Turn off a link to ensure that Link Discovery " +\
+                      "is working properly"
+        main.log.report( description )
+        main.case( description )
 
+        main.step( "Kill Link between s3 and s28" )
+        LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
+        main.log.info( "Waiting " + str( linkSleep ) +
+                       " seconds for link down to be discovered" )
+        time.sleep( linkSleep )
+        utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
+                                 onpass="Link down succesful",
+                                 onfail="Failed to bring link down" )
+        # TODO do some sort of check here
 
-        main.step("Kill Link between s3 and s28")
-        Link_Down = main.Mininet1.link(END1="s3",END2="s28",OPTION="down")
-        main.log.info("Waiting " + str(link_sleep) + " seconds for link down to be discovered")
-        time.sleep(link_sleep)
-        utilities.assert_equals(expect=main.TRUE,actual=Link_Down,
-                onpass="Link down succesful",
-                onfail="Failed to bring link down")
-        #TODO do some sort of check here
-
-    def CASE10 (self,main):
-        '''
+    def CASE10( self, main ):
+        """
         Link s3-s28 up
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        import time
+        # NOTE: You should probably run a topology check after this
 
-        link_sleep = float(main.params['timers']['LinkDiscovery'])
+        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        description = "Restore a link to ensure that Link Discovery is working properly"
-        main.log.report(description)
-        main.case(description)
+        description = "Restore a link to ensure that Link Discovery is " + \
+                      "working properly"
+        main.log.report( description )
+        main.case( description )
 
-        main.step("Bring link between s3 and s28 back up")
-        Link_Up = main.Mininet1.link(END1="s3",END2="s28",OPTION="up")
-        main.log.info("Waiting " + str(link_sleep) + " seconds for link up to be discovered")
-        time.sleep(link_sleep)
-        utilities.assert_equals(expect=main.TRUE,actual=Link_Up,
-                onpass="Link up succesful",
-                onfail="Failed to bring link up")
-        #TODO do some sort of check here
+        main.step( "Bring link between s3 and s28 back up" )
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
+        main.log.info( "Waiting " + str( linkSleep ) +
+                       " seconds for link up to be discovered" )
+        time.sleep( linkSleep )
+        utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
+                                 onpass="Link up succesful",
+                                 onfail="Failed to bring link up" )
+        # TODO do some sort of check here
 
-
-    def CASE11 (self, main) :
-        '''
+    def CASE11( self, main ):
+        """
         Switch Down
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        # NOTE: You should probably run a topology check after this
         import time
 
-        switch_sleep = float(main.params['timers']['SwitchDiscovery'])
+        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
 
         description = "Killing a switch to ensure it is discovered correctly"
-        main.log.report(description)
-        main.case(description)
+        main.log.report( description )
+        main.case( description )
+        switch = main.params[ 'kill' ][ 'switch' ]
+        switchDPID = main.params[ 'kill' ][ 'dpid' ]
 
-        #TODO: Make this switch parameterizable
-        main.step("Kill s28 ")
-        main.log.report("Deleting s28")
-        main.Mininet1.del_switch("s28")
-        main.log.info("Waiting " + str(switch_sleep) + " seconds for switch down to be discovered")
-        time.sleep(switch_sleep)
-        device = main.ONOScli1.get_device(dpid="0028")
-        #Peek at the deleted switch
-        main.log.warn( str(device) )
+        # TODO: Make this switch parameterizable
+        main.step( "Kill " + switch )
+        main.log.report( "Deleting " + switch )
+        main.Mininet1.delSwitch( switch )
+        main.log.info( "Waiting " + str( switchSleep ) +
+                       " seconds for switch down to be discovered" )
+        time.sleep( switchSleep )
+        device = main.ONOScli1.getDevice( dpid=switchDPID )
+        # Peek at the deleted switch
+        main.log.warn( str( device ) )
         result = main.FALSE
-        if device and device['available'] == False:
+        if device and device[ 'available' ] is False:
             result = main.TRUE
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="Kill switch succesful",
-                onfail="Failed to kill switch?")
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="Kill switch succesful",
+                                 onfail="Failed to kill switch?" )
 
-    def CASE12 (self, main) :
-        '''
+    def CASE12( self, main ):
+        """
         Switch Up
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        # NOTE: You should probably run a topology check after this
         import time
 
-        switch_sleep = float(main.params['timers']['SwitchDiscovery'])
+        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
+        switch = main.params[ 'kill' ][ 'switch' ]
+        switchDPID = main.params[ 'kill' ][ 'dpid' ]
+        links = main.params[ 'kill' ][ 'links' ].split()
         description = "Adding a switch to ensure it is discovered correctly"
-        main.log.report(description)
-        main.case(description)
+        main.log.report( description )
+        main.case( description )
 
-        main.step("Add back s28")
-        main.log.report("Adding back s28")
-        main.Mininet1.add_switch("s28", dpid = '0000000000002800')
-        #TODO: New dpid or same? Ask Thomas?
-        main.Mininet1.add_link('s28', 's3')
-        main.Mininet1.add_link('s28', 's6')
-        main.Mininet1.add_link('s28', 'h28')
-        main.Mininet1.assign_sw_controller(sw="28",count=num_controllers,
-                ip1=ONOS1_ip,port1=ONOS1_port,
-                ip2=ONOS2_ip,port2=ONOS2_port,
-                ip3=ONOS3_ip,port3=ONOS3_port,
-                ip4=ONOS4_ip,port4=ONOS4_port,
-                ip5=ONOS5_ip,port5=ONOS5_port,
-                ip6=ONOS6_ip,port6=ONOS6_port,
-                ip7=ONOS7_ip,port7=ONOS7_port)
-        main.log.info("Waiting " + str(switch_sleep) + " seconds for switch up to be discovered")
-        time.sleep(switch_sleep)
-        device = main.ONOScli1.get_device(dpid="0028")
-        #Peek at the deleted switch
-        main.log.warn( str(device) )
+        main.step( "Add back " + switch )
+        main.log.report( "Adding back " + switch )
+        main.Mininet1.addSwitch( switch, dpid=switchDPID )
+        # TODO: New dpid or same? Ask Thomas?
+        for peer in links:
+            main.Mininet1.addLink( switch, peer )
+        main.Mininet1.assignSwController( sw=switch.split( 's' )[ 1 ],
+                                          count=numControllers,
+                                          ip1=ONOS1Ip,
+                                          port1=ONOS1Port,
+                                          ip2=ONOS2Ip,
+                                          port2=ONOS2Port,
+                                          ip3=ONOS3Ip,
+                                          port3=ONOS3Port,
+                                          ip4=ONOS4Ip,
+                                          port4=ONOS4Port,
+                                          ip5=ONOS5Ip,
+                                          port5=ONOS5Port,
+                                          ip6=ONOS6Ip,
+                                          port6=ONOS6Port,
+                                          ip7=ONOS7Ip,
+                                          port7=ONOS7Port )
+        main.log.info( "Waiting " + str( switchSleep ) +
+                       " seconds for switch up to be discovered" )
+        time.sleep( switchSleep )
+        device = main.ONOScli1.getDevice( dpid=switchDPID )
+        # Peek at the deleted switch
+        main.log.warn( str( device ) )
         result = main.FALSE
-        if device and device['available'] == True:
+        if device and device[ 'available' ]:
             result = main.TRUE
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="add switch succesful",
-                onfail="Failed to add switch?")
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="add switch succesful",
+                                 onfail="Failed to add switch?" )
 
-    def CASE13 (self, main) :
-        '''
+    def CASE13( self, main ):
+        """
         Clean up
-        '''
+        """
         import os
         import time
-        #printing colors to terminal
+        # TODO: make use of this elsewhere
+        ips = []
+        ips.append( ONOS1Ip )
+        ips.append( ONOS2Ip )
+        ips.append( ONOS3Ip )
+        ips.append( ONOS4Ip )
+        ips.append( ONOS5Ip )
+        ips.append( ONOS6Ip )
+        ips.append( ONOS7Ip )
+
+        # printing colors to terminal
         colors = {}
-        colors['cyan']   = '\033[96m'
-        colors['purple'] = '\033[95m'
-        colors['blue']   = '\033[94m'
-        colors['green']  = '\033[92m'
-        colors['yellow'] = '\033[93m'
-        colors['red']    = '\033[91m'
-        colors['end']    = '\033[0m'
+        colors[ 'cyan' ] = '\033[96m'
+        colors[ 'purple' ] = '\033[95m'
+        colors[ 'blue' ] = '\033[94m'
+        colors[ 'green' ] = '\033[92m'
+        colors[ 'yellow' ] = '\033[93m'
+        colors[ 'red' ] = '\033[91m'
+        colors[ 'end' ] = '\033[0m'
         description = "Test Cleanup"
-        main.log.report(description)
-        main.case(description)
-        main.step("Killing tcpdumps")
-        main.Mininet2.stop_tcpdump()
+        main.log.report( description )
+        main.case( description )
+        main.step( "Killing tcpdumps" )
+        main.Mininet2.stopTcpdump()
 
-        main.step("Checking ONOS Logs for errors")
-        print colors['purple'] + "Checking logs for errors on ONOS1:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS1_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS2:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS2_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS3:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS3_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS4:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS4_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS5:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS5_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS6:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS6_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS7:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS7_ip)
+        main.step( "Checking ONOS Logs for errors" )
+        for i in range( 7 ):
+            print colors[ 'purple' ] + "Checking logs for errors on " + \
+                "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
+            print main.ONOSbench.checkLogs( ips[ i ] )
 
-        main.step("Copying MN pcap and ONOS log files to test station")
+        main.step( "Copying MN pcap and ONOS log files to test station" )
         testname = main.TEST
-        teststation_user = main.params['TESTONUSER']
-        teststation_IP = main.params['TESTONIP']
-        #NOTE: MN Pcap file is being saved to ~/packet_captures
+        teststationUser = main.params[ 'TESTONUSER' ]
+        teststationIP = main.params[ 'TESTONIP' ]
+        # NOTE: MN Pcap file is being saved to ~/packet_captures
         #       scp this file as MN and TestON aren't necessarily the same vm
-        #FIXME: scp
-        #####mn files
-        #TODO: Load these from params
-        #NOTE: must end in /
-        log_folder = "/opt/onos/log/"
-        log_files = ["karaf.log", "karaf.log.1"]
-        #NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS1_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS1-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS2_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS2-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS3_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS3-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS4_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS4-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS5_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS5-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS6_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS6-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS7_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS7-"+f )
+        # FIXME: scp
+        # mn files
+        # TODO: Load these from params
+        # NOTE: must end in /
+        logFolder = "/opt/onos/log/"
+        logFiles = [ "karaf.log", "karaf.log.1" ]
+        # NOTE: must end in /
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            for i in range( 7 ):
+                main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
+                                                logFolder + f + " " +
+                                                teststationUser + "@" +
+                                                teststationIP + ":" +
+                                                dstDir + str( testname ) +
+                                                "-ONOS" + str( i + 1 ) + "-" +
+                                                f )
+                main.ONOSbench.handle.expect( "\$" )
 
-        #std*.log's
-        #NOTE: must end in /
-        log_folder = "/opt/onos/var/"
-        log_files = ["stderr.log", "stdout.log"]
-        #NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS1_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS1-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS2_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS2-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS3_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS3-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS4_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS4-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS5_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS5-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS6_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS6-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS7_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS7-"+f )
+        # std*.log's
+        # NOTE: must end in /
+        logFolder = "/opt/onos/var/"
+        logFiles = [ "stderr.log", "stdout.log" ]
+        # NOTE: must end in /
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            for i in range( 7 ):
+                main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
+                                                logFolder + f + " " +
+                                                teststationUser + "@" +
+                                                teststationIP + ":" +
+                                                dstDir + str( testname ) +
+                                                "-ONOS" + str( i + 1 ) + "-" +
+                                                f )
+                main.ONOSbench.handle.expect( "\$" )
+        # sleep so scp can finish
+        time.sleep( 10 )
+        main.Mininet1.stopNet()
+        main.step( "Packing and rotating pcap archives" )
+        os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
 
+        # TODO: actually check something here
+        utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
+                                 onpass="Test cleanup successful",
+                                 onfail="Test cleanup NOT successful" )
 
-        #sleep so scp can finish
-        time.sleep(10)
-        main.step("Packing and rotating pcap archives")
-        os.system("~/TestON/dependencies/rotate.sh "+ str(testname))
-
-
-        #TODO: actually check something here
-        utilities.assert_equals(expect=main.TRUE, actual=main.TRUE,
-                onpass="Test cleanup successful",
-                onfail="Test cleanup NOT successful")
-
-    def CASE14 ( self, main ) :
-        '''
+    def CASE14( self, main ):
+        """
         start election app on all onos nodes
-        '''
-        leader_result = main.TRUE
-        #install app on onos 1
-        main.log.info("Install leadership election app")
-        main.ONOScli1.feature_install("onos-app-election")
-        #wait for election
-        #check for leader
-        leader = main.ONOScli1.election_test_leader()
-        #verify leader is ONOS1
-        if leader == ONOS1_ip:
-            #all is well
+        """
+        leaderResult = main.TRUE
+        # install app on onos 1
+        main.log.info( "Install leadership election app" )
+        main.ONOScli1.featureInstall( "onos-app-election" )
+        # wait for election
+        # check for leader
+        leader = main.ONOScli1.electionTestLeader()
+        # verify leader is ONOS1
+        if leader == ONOS1Ip:
+            # all is well
             pass
-        elif leader == None:
-            #No leader elected
-            main.log.report("No leader was elected")
-            leader_result = main.FALSE
+        elif leader is None:
+            # No leader elected
+            main.log.report( "No leader was elected" )
+            leaderResult = main.FALSE
         elif leader == main.FALSE:
-            #error in  response
-            #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-            main.log.report("Something is wrong with election_test_leader function, check the error logs")
-            leader_result = main.FALSE
+            # error in  response
+            # TODO: add check for "Command not found:" in the driver, this
+            # means the app isn't loaded
+            main.log.report( "Something is wrong with electionTestLeader" +
+                             " function, check the error logs" )
+            leaderResult = main.FALSE
         else:
-            #error in  response
-            main.log.report("Unexpected response from election_test_leader function:'"+str(leader)+"'")
-            leader_result = main.FALSE
+            # error in  response
+            main.log.report(
+                "Unexpected response from electionTestLeader function:'" +
+                str( leader ) +
+                "'" )
+            leaderResult = main.FALSE
 
-
-
-
-        #install on other nodes and check for leader.
-        #Should be onos1 and each app should show the same leader
-        for controller in range(2,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            node.feature_install("onos-app-election")
-            leaderN = node.election_test_leader()
-            #verify leader is ONOS1
-            if leaderN == ONOS1_ip:
-                #all is well
+        # install on other nodes and check for leader.
+        # Should be onos1 and each app should show the same leader
+        for controller in range( 2, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            node.featureInstall( "onos-app-election" )
+            leaderN = node.electionTestLeader()
+            # verify leader is ONOS1
+            if leaderN == ONOS1Ip:
+                # all is well
                 pass
             elif leaderN == main.FALSE:
-                #error in  response
-                #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
+                # error in  response
+                # TODO: add check for "Command not found:" in the driver, this
+                # means the app isn't loaded
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, check the" +
+                                 " error logs" )
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
-                main.log.report("ONOS" + str(controller) + " sees "+str(leaderN) +
-                        " as the leader of the election app. Leader should be "+str(leader) )
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a leader was elected)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+                leaderResult = main.FALSE
+                main.log.report( "ONOS" + str( controller ) + " sees " +
+                                 str( leaderN ) +
+                                 " as the leader of the election app. Leader" +
+                                 " should be " +
+                                 str( leader ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a leader " +
+                             "was elected )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-    def CASE15 ( self, main ) :
-        '''
+    def CASE15( self, main ):
+        """
         Check that Leadership Election is still functional
-        '''
-        leader_result = main.TRUE
+        """
+        leaderResult = main.TRUE
         description = "Check that Leadership Election is still functional"
-        main.log.report(description)
-        main.case(description)
-        main.step("Find current leader and withdraw")
-        leader = main.ONOScli1.election_test_leader()
-        #TODO: do some sanity checking on leader before using it
-        withdraw_result = main.FALSE
-        if leader == ONOS1_ip:
-            old_leader = getattr( main, "ONOScli1" )
-        elif leader == ONOS2_ip:
-            old_leader = getattr( main, "ONOScli2" )
-        elif leader == ONOS3_ip:
-            old_leader = getattr( main, "ONOScli3" )
-        elif leader == ONOS4_ip:
-            old_leader = getattr( main, "ONOScli4" )
-        elif leader == ONOS5_ip:
-            old_leader = getattr( main, "ONOScli5" )
-        elif leader == ONOS6_ip:
-            old_leader = getattr( main, "ONOScli6" )
-        elif leader == ONOS7_ip:
-            old_leader = getattr( main, "ONOScli7" )
-        elif leader == None or leader == main.FALSE:
-            main.log.report("Leader for the election app should be an ONOS node,"\
-                    +"instead got '"+str(leader)+"'")
-            leader_result = main.FALSE
-        withdraw_result = old_leader.election_test_withdraw()
-
-
-        main.step("Make sure new leader is elected")
-        leader_list = []
-        for controller in range(1,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            leader_list.append( node.election_test_leader() )
-        for leaderN in leader_list:
-            if leaderN == leader:
-                main.log.report("ONOS"+str(controller)+" still sees " + str(leader) +\
-                        " as leader after they withdrew")
-                leader_result = main.FALSE
-            elif leaderN == main.FALSE:
-                #error in  response
-                #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
-        consistent_leader = main.FALSE
-        if len( set( leader_list ) ) == 1:
-            main.log.info("Each Election-app sees '"+str(leader_list[0])+"' as the leader")
-            consistent_leader = main.TRUE
+        main.log.report( description )
+        main.case( description )
+        main.step( "Find current leader and withdraw" )
+        leader = main.ONOScli1.electionTestLeader()
+        # TODO: do some sanity checking on leader before using it
+        withdrawResult = main.FALSE
+        if leader == ONOS1Ip:
+            oldLeader = getattr( main, "ONOScli1" )
+        elif leader == ONOS2Ip:
+            oldLeader = getattr( main, "ONOScli2" )
+        elif leader == ONOS3Ip:
+            oldLeader = getattr( main, "ONOScli3" )
+        elif leader == ONOS4Ip:
+            oldLeader = getattr( main, "ONOScli4" )
+        elif leader == ONOS5Ip:
+            oldLeader = getattr( main, "ONOScli5" )
+        elif leader == ONOS6Ip:
+            oldLeader = getattr( main, "ONOScli6" )
+        elif leader == ONOS7Ip:
+            oldLeader = getattr( main, "ONOScli7" )
+        elif leader is None or leader == main.FALSE:
+            main.log.report(
+                "Leader for the election app should be an ONOS node," +
+                "instead got '" + str( leader ) + "'" )
+            leaderResult = main.FALSE
+            oldLeader = None
         else:
-            main.log.report("Inconsistent responses for leader of Election-app:")
-            for n in range(len(leader_list)):
-                main.log.report("ONOS" + str(n+1) + " response: " + str(leader_list[n]) )
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a new leader was elected when the old leader resigned)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+            main.log.error( "Leader election --- why am I HERE?!?")
+        if oldLeader:
+            withdrawResult = oldLeader.electionTestWithdraw()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=withdrawResult,
+            onpass="App was withdrawn from election",
+            onfail="App was not withdrawn from election" )
 
+        main.step( "Make sure new leader is elected" )
+        leaderList = []
+        for controller in range( 1, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            leaderList.append( node.electionTestLeader() )
+        for leaderN in leaderList:
+            if leaderN == leader:
+                main.log.report(
+                    "ONOS" + str( controller ) +
+                    " still sees " + str( leader ) +
+                    " as leader after they withdrew" )
+                leaderResult = main.FALSE
+            elif leaderN == main.FALSE:
+                # error in  response
+                # TODO: add check for "Command not found:" in the driver, this
+                # means the app isn't loaded
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, " +
+                                 "check the error logs" )
+                leaderResult = main.FALSE
+        consistentLeader = main.FALSE
+        if len( set( leaderList ) ) == 1:
+            main.log.info( "Each Election-app sees '" +
+                           str( leaderList[ 0 ] ) +
+                           "' as the leader" )
+            consistentLeader = main.TRUE
+        else:
+            main.log.report(
+                "Inconsistent responses for leader of Election-app:" )
+            for n in range( len( leaderList ) ):
+                main.log.report( "ONOS" + str( n + 1 ) + " response: " +
+                                 str( leaderList[ n ] ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a new " +
+                             "leader was elected when the old leader " +
+                             "resigned )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-        main.step("Run for election on old leader(just so everyone is in the hat)")
-        run_result = old_leader.election_test_run()
-        if consistent_leader == main.TRUE:
-            after_run = main.ONOScli1.election_test_leader()
-            #verify leader didn't just change
-            if after_run == leader_list[0]:
-                leader_result = main.TRUE
+        main.step( "Run for election on old leader( just so everyone " +
+                   "is in the hat )" )
+        if oldLeader:
+            runResult = oldLeader.electionTestRun()
+        else:
+            runResult = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=runResult,
+            onpass="App re-ran for election",
+            onfail="App failed to run for election" )
+        if consistentLeader == main.TRUE:
+            afterRun = main.ONOScli1.electionTestLeader()
+            # verify leader didn't just change
+            if afterRun == leaderList[ 0 ]:
+                leaderResult = main.TRUE
             else:
-                leader_result = main.FALSE
-        #TODO: assert on  run and withdraw results?
+                leaderResult = main.FALSE
+        # TODO: assert on  run and withdraw results?
 
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election after the old leader re-ran for election")
-
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election after " +
+                   "the old leader re-ran for election" )
diff --git a/TestON/tests/HATestClusterRestart/HATestClusterRestart.topo b/TestON/tests/HATestClusterRestart/HATestClusterRestart.topo
index 4d4156c..9305025 100644
--- a/TestON/tests/HATestClusterRestart/HATestClusterRestart.topo
+++ b/TestON/tests/HATestClusterRestart/HATestClusterRestart.topo
@@ -151,7 +151,7 @@
                 <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
                 <arg2> --topo mytopo </arg2>
                 <arg3> </arg3>
-                <controller> remote </controller>
+                <controller> none </controller>
             </COMPONENTS>
         </Mininet1>
 
@@ -162,11 +162,7 @@
             <type>RemoteMininetDriver</type>
             <connect_order>17</connect_order>
             <COMPONENTS>
-                # Specify the Option for mininet
-                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
-                <arg2> --topo mytopo --arp</arg2>
-                <controller> remote </controller>
-             </COMPONENTS>
+            </COMPONENTS>
         </Mininet2>
 
     </COMPONENT>
diff --git a/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.params b/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.params
index 78e0c83..595b78c 100644
--- a/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.params
+++ b/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.params
@@ -1,9 +1,10 @@
 <PARAMS>
     <testcases>1,2,8,3,4,5,14,[6],8,7,4,15,9,8,4,10,8,4,11,8,4,12,8,4,13</testcases>
     <ENV>
-    <cellName>HA</cellName>
+        <cellName>HA</cellName>
     </ENV>
     <Git>False</Git>
+    <branch> master </branch>
     <num_controllers> 7 </num_controllers>
 
     <CTRL>
@@ -56,6 +57,11 @@
         <LinkDiscovery>.2</LinkDiscovery>
         <SwitchDiscovery>.2</SwitchDiscovery>
     </timers>
+    <kill>
+        <switch> s5 </switch>
+        <dpid> 0000000000005000 </dpid>
+        <links> h5 s2 s1 s6 </links>
+    </kill>
     <MNtcpdump>
         <intf>eth0</intf>
         <port> </port>
diff --git a/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py b/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py
index b9d2925..3e7de57 100644
--- a/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py
+++ b/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py
@@ -1,4 +1,4 @@
-'''
+"""
 Description: This test is to determine if ONOS can handle
     a minority of it's nodes restarting
 
@@ -18,794 +18,1090 @@
 CASE13: Clean up
 CASE14: start election app on all onos nodes
 CASE15: Check that Leadership Election is still functional
-'''
+"""
+
+
 class HATestMinorityRestart:
 
-    def __init__(self) :
+    def __init__( self ):
         self.default = ''
 
-    def CASE1(self,main) :
-        '''
+    def CASE1( self, main ):
+        """
         CASE1 is to compile ONOS and push it to the test machines
 
         Startup sequence:
-        git pull
-        mvn clean install
-        onos-package
         cell <name>
         onos-verify-cell
         NOTE: temporary - onos-remove-raft-logs
+        onos-uninstall
+        start mininet
+        git pull
+        mvn clean install
+        onos-package
         onos-install -f
         onos-wait-for-start
-        '''
-        import time
-        main.log.report("ONOS HA test: Restart minority of ONOS nodes - initialization")
-        main.case("Setting up test environment")
+        start cli sessions
+        start tcpdump
+        """
+        main.log.report(
+            "ONOS HA test: Restart minority of ONOS nodes - initialization" )
+        main.case( "Setting up test environment" )
+        # TODO: save all the timers and output them for plotting
 
         # load some vairables from the params file
-        PULL_CODE = False
-        if main.params['Git'] == 'True':
-            PULL_CODE = True
-        cell_name = main.params['ENV']['cellName']
+        PULLCODE = False
+        if main.params[ 'Git' ] == 'True':
+            PULLCODE = True
+        gitBranch = main.params[ 'branch' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
 
-        #set global variables
-        global ONOS1_ip
-        global ONOS1_port
-        global ONOS2_ip
-        global ONOS2_port
-        global ONOS3_ip
-        global ONOS3_port
-        global ONOS4_ip
-        global ONOS4_port
-        global ONOS5_ip
-        global ONOS5_port
-        global ONOS6_ip
-        global ONOS6_port
-        global ONOS7_ip
-        global ONOS7_port
-        global num_controllers
+        # set global variables
+        global ONOS1Ip
+        global ONOS1Port
+        global ONOS2Ip
+        global ONOS2Port
+        global ONOS3Ip
+        global ONOS3Port
+        global ONOS4Ip
+        global ONOS4Port
+        global ONOS5Ip
+        global ONOS5Port
+        global ONOS6Ip
+        global ONOS6Port
+        global ONOS7Ip
+        global ONOS7Port
+        global numControllers
 
-        ONOS1_ip = main.params['CTRL']['ip1']
-        ONOS1_port = main.params['CTRL']['port1']
-        ONOS2_ip = main.params['CTRL']['ip2']
-        ONOS2_port = main.params['CTRL']['port2']
-        ONOS3_ip = main.params['CTRL']['ip3']
-        ONOS3_port = main.params['CTRL']['port3']
-        ONOS4_ip = main.params['CTRL']['ip4']
-        ONOS4_port = main.params['CTRL']['port4']
-        ONOS5_ip = main.params['CTRL']['ip5']
-        ONOS5_port = main.params['CTRL']['port5']
-        ONOS6_ip = main.params['CTRL']['ip6']
-        ONOS6_port = main.params['CTRL']['port6']
-        ONOS7_ip = main.params['CTRL']['ip7']
-        ONOS7_port = main.params['CTRL']['port7']
-        num_controllers = int(main.params['num_controllers'])
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
+        ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
+        ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
+        ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
+        ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
+        ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
+        numControllers = int( main.params[ 'num_controllers' ] )
 
+        main.step( "Applying cell variable to environment" )
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
-        main.step("Applying cell variable to environment")
-        cell_result = main.ONOSbench.set_cell(cell_name)
-        verify_result = main.ONOSbench.verify_cell()
+        # FIXME:this is short term fix
+        main.log.report( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftLogs()
+        main.log.report( "Uninstalling ONOS" )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+        main.ONOSbench.onosUninstall( ONOS2Ip )
+        main.ONOSbench.onosUninstall( ONOS3Ip )
+        main.ONOSbench.onosUninstall( ONOS4Ip )
+        main.ONOSbench.onosUninstall( ONOS5Ip )
+        main.ONOSbench.onosUninstall( ONOS6Ip )
+        main.ONOSbench.onosUninstall( ONOS7Ip )
 
-        #FIXME:this is short term fix
-        main.log.report("Removing raft logs")
-        main.ONOSbench.onos_remove_raft_logs()
-        main.log.report("Uninstalling ONOS")
-        main.ONOSbench.onos_uninstall(ONOS1_ip)
-        main.ONOSbench.onos_uninstall(ONOS2_ip)
-        main.ONOSbench.onos_uninstall(ONOS3_ip)
-        main.ONOSbench.onos_uninstall(ONOS4_ip)
-        main.ONOSbench.onos_uninstall(ONOS5_ip)
-        main.ONOSbench.onos_uninstall(ONOS6_ip)
-        main.ONOSbench.onos_uninstall(ONOS7_ip)
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
 
-        clean_install_result = main.TRUE
-        git_pull_result = main.TRUE
+        main.step( "Starting Mininet" )
+        main.Mininet1.startNet( )
 
-        main.step("Compiling the latest version of ONOS")
-        if PULL_CODE:
-            main.step("Git checkout and pull master")
-            main.ONOSbench.git_checkout("master")
-            git_pull_result = main.ONOSbench.git_pull()
+        main.step( "Compiling the latest version of ONOS" )
+        if PULLCODE:
+            main.step( "Git checkout and pull " + gitBranch )
+            main.ONOSbench.gitCheckout( gitBranch )
+            gitPullResult = main.ONOSbench.gitPull()
 
-            main.step("Using mvn clean & install")
-            clean_install_result = main.TRUE
-            if git_pull_result == main.TRUE:
-                clean_install_result = main.ONOSbench.clean_install()
-            else:
-                main.log.warn("Did not pull new code so skipping mvn "+ \
-                        "clean install")
-        main.ONOSbench.get_version(report=True)
+            main.step( "Using mvn clean & install" )
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
 
-        main.step("Creating ONOS package")
-        package_result = main.ONOSbench.onos_package()
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
 
-        main.step("Installing ONOS package")
-        onos1_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS1_ip)
-        onos2_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS2_ip)
-        onos3_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS3_ip)
-        onos4_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS4_ip)
-        onos5_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS5_ip)
-        onos6_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS6_ip)
-        onos7_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS7_ip)
-        onos_install_result = onos1_install_result and onos2_install_result\
-                and onos3_install_result and onos4_install_result\
-                and onos5_install_result and onos6_install_result\
-                and onos7_install_result
-        '''
-        #FIXME: work around until onos is less fragile
-        main.ONOSbench.handle.sendline("onos-cluster-install")
-        print main.ONOSbench.handle.expect("\$")
-        onos_install_result = main.TRUE
-        '''
+        main.step( "Installing ONOS package" )
+        onos1InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS1Ip )
+        onos2InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS2Ip )
+        onos3InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS3Ip )
+        onos4InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS4Ip )
+        onos5InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS5Ip )
+        onos6InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS6Ip )
+        onos7InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS7Ip )
+        onosInstallResult = onos1InstallResult and onos2InstallResult\
+            and onos3InstallResult and onos4InstallResult\
+            and onos5InstallResult and onos6InstallResult\
+            and onos7InstallResult
 
-
-        main.step("Checking if ONOS is up yet")
-        #TODO check bundle:list?
-        for i in range(2):
-            onos1_isup = main.ONOSbench.isup(ONOS1_ip)
-            if not onos1_isup:
-                main.log.report("ONOS1 didn't start!")
-            onos2_isup = main.ONOSbench.isup(ONOS2_ip)
-            if not onos2_isup:
-                main.log.report("ONOS2 didn't start!")
-            onos3_isup = main.ONOSbench.isup(ONOS3_ip)
-            if not onos3_isup:
-                main.log.report("ONOS3 didn't start!")
-            onos4_isup = main.ONOSbench.isup(ONOS4_ip)
-            if not onos4_isup:
-                main.log.report("ONOS4 didn't start!")
-            onos5_isup = main.ONOSbench.isup(ONOS5_ip)
-            if not onos5_isup:
-                main.log.report("ONOS5 didn't start!")
-            onos6_isup = main.ONOSbench.isup(ONOS6_ip)
-            if not onos6_isup:
-                main.log.report("ONOS6 didn't start!")
-            onos7_isup = main.ONOSbench.isup(ONOS7_ip)
-            if not onos7_isup:
-                main.log.report("ONOS7 didn't start!")
-            onos_isup_result = onos1_isup and onos2_isup and onos3_isup\
-                    and onos4_isup and onos5_isup and onos6_isup and onos7_isup
-            if onos_isup_result == main.TRUE:
+        main.step( "Checking if ONOS is up yet" )
+        for i in range( 2 ):
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            if not onos1Isup:
+                main.log.report( "ONOS1 didn't start!" )
+                main.ONOSbench.onosStop( ONOS1Ip )
+                main.ONOSbench.onosStart( ONOS1Ip )
+            onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+            if not onos2Isup:
+                main.log.report( "ONOS2 didn't start!" )
+                main.ONOSbench.onosStop( ONOS2Ip )
+                main.ONOSbench.onosStart( ONOS2Ip )
+            onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+            if not onos3Isup:
+                main.log.report( "ONOS3 didn't start!" )
+                main.ONOSbench.onosStop( ONOS3Ip )
+                main.ONOSbench.onosStart( ONOS3Ip )
+            onos4Isup = main.ONOSbench.isup( ONOS4Ip )
+            if not onos4Isup:
+                main.log.report( "ONOS4 didn't start!" )
+                main.ONOSbench.onosStop( ONOS4Ip )
+                main.ONOSbench.onosStart( ONOS4Ip )
+            onos5Isup = main.ONOSbench.isup( ONOS5Ip )
+            if not onos5Isup:
+                main.log.report( "ONOS5 didn't start!" )
+                main.ONOSbench.onosStop( ONOS5Ip )
+                main.ONOSbench.onosStart( ONOS5Ip )
+            onos6Isup = main.ONOSbench.isup( ONOS6Ip )
+            if not onos6Isup:
+                main.log.report( "ONOS6 didn't start!" )
+                main.ONOSbench.onosStop( ONOS6Ip )
+                main.ONOSbench.onosStart( ONOS6Ip )
+            onos7Isup = main.ONOSbench.isup( ONOS7Ip )
+            if not onos7Isup:
+                main.log.report( "ONOS7 didn't start!" )
+                main.ONOSbench.onosStop( ONOS7Ip )
+                main.ONOSbench.onosStart( ONOS7Ip )
+            onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
+                and onos4Isup and onos5Isup and onos6Isup and onos7Isup
+            if onosIsupResult == main.TRUE:
                 break
-        # TODO: if it becomes an issue, we can retry this step  a few times
 
+        cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
+        cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
+        cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
+        cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
+        cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
+        cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
+        cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
+        cliResults = cliResult1 and cliResult2 and cliResult3 and\
+            cliResult4 and cliResult5 and cliResult6 and cliResult7
 
-        cli_result1 = main.ONOScli1.start_onos_cli(ONOS1_ip)
-        cli_result2 = main.ONOScli2.start_onos_cli(ONOS2_ip)
-        cli_result3 = main.ONOScli3.start_onos_cli(ONOS3_ip)
-        cli_result4 = main.ONOScli4.start_onos_cli(ONOS4_ip)
-        cli_result5 = main.ONOScli5.start_onos_cli(ONOS5_ip)
-        cli_result6 = main.ONOScli6.start_onos_cli(ONOS6_ip)
-        cli_result7 = main.ONOScli7.start_onos_cli(ONOS7_ip)
-        cli_results = cli_result1 and cli_result2 and cli_result3 and\
-                cli_result4 and cli_result5 and cli_result6 and cli_result7
+        main.step( "Start Packet Capture MN" )
+        main.Mininet2.startTcpdump(
+            str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
+            + "-MN.pcap",
+            intf=main.params[ 'MNtcpdump' ][ 'intf' ],
+            port=main.params[ 'MNtcpdump' ][ 'port' ] )
 
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and onosInstallResult
+                        and onosIsupResult and cliResults )
 
-        main.step("Start Packet Capture MN")
-        main.Mininet2.start_tcpdump(
-                str(main.params['MNtcpdump']['folder'])+str(main.TEST)+"-MN.pcap",
-                intf = main.params['MNtcpdump']['intf'],
-                port = main.params['MNtcpdump']['port'])
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+                                 onpass="Test startup successful",
+                                 onfail="Test startup NOT successful" )
 
-
-        case1_result = (clean_install_result and package_result and
-                cell_result and verify_result and onos_install_result and
-                onos_isup_result and cli_results)
-
-        utilities.assert_equals(expect=main.TRUE, actual=case1_result,
-                onpass="Test startup successful",
-                onfail="Test startup NOT successful")
-
-
-        if case1_result==main.FALSE:
+        if case1Result == main.FALSE:
             main.cleanup()
             main.exit()
 
-    def CASE2(self,main) :
-        '''
+    def CASE2( self, main ):
+        """
         Assign mastership to controllers
-        '''
-        import time
-        import json
+        """
         import re
 
-        main.log.report("Assigning switches to controllers")
-        main.case("Assigning Controllers")
-        main.step("Assign switches to controllers")
+        main.log.report( "Assigning switches to controllers" )
+        main.case( "Assigning Controllers" )
+        main.step( "Assign switches to controllers" )
 
-        for i in range (1,29):
-           main.Mininet1.assign_sw_controller(sw=str(i),count=num_controllers,
-                    ip1=ONOS1_ip,port1=ONOS1_port,
-                    ip2=ONOS2_ip,port2=ONOS2_port,
-                    ip3=ONOS3_ip,port3=ONOS3_port,
-                    ip4=ONOS4_ip,port4=ONOS4_port,
-                    ip5=ONOS5_ip,port5=ONOS5_port,
-                    ip6=ONOS6_ip,port6=ONOS6_port,
-                    ip7=ONOS7_ip,port7=ONOS7_port)
+        for i in range( 1, 29 ):
+            main.Mininet1.assignSwController(
+                sw=str( i ),
+                count=numControllers,
+                ip1=ONOS1Ip, port1=ONOS1Port,
+                ip2=ONOS2Ip, port2=ONOS2Port,
+                ip3=ONOS3Ip, port3=ONOS3Port,
+                ip4=ONOS4Ip, port4=ONOS4Port,
+                ip5=ONOS5Ip, port5=ONOS5Port,
+                ip6=ONOS6Ip, port6=ONOS6Port,
+                ip7=ONOS7Ip, port7=ONOS7Port )
 
-        mastership_check = main.TRUE
-        for i in range (1,29):
-            response = main.Mininet1.get_sw_controller("s"+str(i))
+        mastershipCheck = main.TRUE
+        for i in range( 1, 29 ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
             try:
-                main.log.info(str(response))
-            except:
-                main.log.info(repr(response))
-            if re.search("tcp:"+ONOS1_ip,response)\
-                    and re.search("tcp:"+ONOS2_ip,response)\
-                    and re.search("tcp:"+ONOS3_ip,response)\
-                    and re.search("tcp:"+ONOS4_ip,response)\
-                    and re.search("tcp:"+ONOS5_ip,response)\
-                    and re.search("tcp:"+ONOS6_ip,response)\
-                    and re.search("tcp:"+ONOS7_ip,response):
-                mastership_check = mastership_check and main.TRUE
+                main.log.info( str( response ) )
+            except Exception:
+                main.log.info( repr( response ) )
+            if re.search( "tcp:" + ONOS1Ip, response )\
+                    and re.search( "tcp:" + ONOS2Ip, response )\
+                    and re.search( "tcp:" + ONOS3Ip, response )\
+                    and re.search( "tcp:" + ONOS4Ip, response )\
+                    and re.search( "tcp:" + ONOS5Ip, response )\
+                    and re.search( "tcp:" + ONOS6Ip, response )\
+                    and re.search( "tcp:" + ONOS7Ip, response ):
+                mastershipCheck = mastershipCheck and main.TRUE
             else:
-                mastership_check = main.FALSE
-        if mastership_check == main.TRUE:
-            main.log.report("Switch mastership assigned correctly")
-        utilities.assert_equals(expect = main.TRUE,actual=mastership_check,
-                onpass="Switch mastership assigned correctly",
-                onfail="Switches not assigned correctly to controllers")
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
+            main.log.report( "Switch mastership assigned correctly" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=mastershipCheck,
+            onpass="Switch mastership assigned correctly",
+            onfail="Switches not assigned correctly to controllers" )
 
-        #Manually assign mastership to the controller we want
-        role_call = main.TRUE
-        role_check = main.TRUE
+        # Manually assign mastership to the controller we want
+        roleCall = main.TRUE
+        roleCheck = main.TRUE
+        try:
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+            assert deviceId, "No device id for s1 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS1Ip )
+            # Check assignment
+            if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("1000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS1_ip)
-        if ONOS1_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+            assert deviceId, "No device id for s28 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS1Ip )
+            # Check assignment
+            if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("2800")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS1_ip)
-        if ONOS1_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+            assert deviceId, "No device id for s2 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS2Ip )
+            # Check assignment
+            if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("2000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS2_ip)
-        if ONOS2_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+            assert deviceId, "No device id for s3 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS2Ip )
+            # Check assignment
+            if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("3000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS2_ip)
-        if ONOS2_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+            assert deviceId, "No device id for s5 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS3Ip )
+            # Check assignment
+            if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("5000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS3_ip)
-        if ONOS3_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+            assert deviceId, "No device id for s6 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS3Ip )
+            # Check assignment
+            if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("6000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS3_ip)
-        if ONOS3_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+            assert deviceId, "No device id for s4 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS4Ip )
+            # Check assignment
+            if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id =  main.ONOScli1.get_device("3004")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS4_ip)
-        if ONOS4_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            for i in range( 8, 18 ):
+                dpid = '3' + str( i ).zfill( 3 )
+                deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+                assert deviceId, "No device id for s%i in ONOS" % i
+                roleCall = roleCall and main.ONOScli1.deviceRole(
+                    deviceId,
+                    ONOS5Ip )
+                # Check assignment
+                if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                    roleCheck = roleCheck and main.TRUE
+                else:
+                    roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("3008")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+            assert deviceId, "No device id for s7 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS6Ip )
+            # Check assignment
+            if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("3009")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            for i in range( 18, 28 ):
+                dpid = '6' + str( i ).zfill( 3 )
+                deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+                assert deviceId, "No device id for s%i in ONOS" % i
+                roleCall = roleCall and main.ONOScli1.deviceRole(
+                    deviceId,
+                    ONOS7Ip )
+                # Check assignment
+                if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                    roleCheck = roleCheck and main.TRUE
+                else:
+                    roleCheck = roleCheck and main.FALSE
+        except ( AttributeError, AssertionError ):
+            main.log.exception( "Something is wrong with ONOS device view" )
+            main.log.info( main.ONOScli1.devices() )
 
-        device_id = main.ONOScli1.get_device("3010")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=roleCall,
+            onpass="Re-assigned switch mastership to designated controller",
+            onfail="Something wrong with deviceRole calls" )
 
-        device_id = main.ONOScli1.get_device("3011")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=roleCheck,
+            onpass="Switches were successfully reassigned to designated " +
+                   "controller",
+            onfail="Switches were not successfully reassigned" )
+        mastershipCheck = mastershipCheck and roleCall and roleCheck
+        utilities.assert_equals( expect=main.TRUE, actual=mastershipCheck,
+                                 onpass="Switch mastership correctly assigned",
+                                 onfail="Error in (re)assigning switch" +
+                                 " mastership" )
 
-        device_id = main.ONOScli1.get_device("3012")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3013")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3014")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3015")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3016")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3017")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6007")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS6_ip)
-        if ONOS6_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6018")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6019")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6020")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6021")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6022")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6023")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6024")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6025")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6026")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6027")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        utilities.assert_equals(expect = main.TRUE,actual=role_call,
-                onpass="Re-assigned switch mastership to designated controller",
-                onfail="Something wrong with device_role calls")
-
-        utilities.assert_equals(expect = main.TRUE,actual=role_check,
-                onpass="Switches were successfully reassigned to designated controller",
-                onfail="Switches were not successfully reassigned")
-        mastership_check = mastership_check and role_call and role_check
-        utilities.assert_equals(expect = main.TRUE,actual=mastership_check,
-                onpass="Switch mastership correctly assigned",
-                onfail="Error in (re)assigning switch mastership")
-
-
-    def CASE3(self,main) :
+    def CASE3( self, main ):
         """
         Assign intents
-
         """
         import time
         import json
-        import re
-        main.log.report("Adding host intents")
-        main.case("Adding host Intents")
+        main.log.report( "Adding host intents" )
+        main.case( "Adding host Intents" )
 
-        main.step("Discovering  Hosts( Via pingall for now)")
-        #FIXME: Once we have a host discovery mechanism, use that instead
+        main.step( "Discovering  Hosts( Via pingall for now )" )
+        # FIXME: Once we have a host discovery mechanism, use that instead
 
-        #install onos-app-fwd
-        main.log.info("Install reactive forwarding app")
-        main.ONOScli1.feature_install("onos-app-fwd")
-        main.ONOScli2.feature_install("onos-app-fwd")
-        main.ONOScli3.feature_install("onos-app-fwd")
-        main.ONOScli4.feature_install("onos-app-fwd")
-        main.ONOScli5.feature_install("onos-app-fwd")
-        main.ONOScli6.feature_install("onos-app-fwd")
-        main.ONOScli7.feature_install("onos-app-fwd")
+        # install onos-app-fwd
+        main.log.info( "Install reactive forwarding app" )
+        main.ONOScli1.featureInstall( "onos-app-fwd" )
+        main.ONOScli2.featureInstall( "onos-app-fwd" )
+        main.ONOScli3.featureInstall( "onos-app-fwd" )
+        main.ONOScli4.featureInstall( "onos-app-fwd" )
+        main.ONOScli5.featureInstall( "onos-app-fwd" )
+        main.ONOScli6.featureInstall( "onos-app-fwd" )
+        main.ONOScli7.featureInstall( "onos-app-fwd" )
 
-        #REACTIVE FWD test
-        ping_result = main.FALSE
+        # REACTIVE FWD test
+        pingResult = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=pingResult,
+            onpass="Reactive Pingall test passed",
+            onfail="Reactive Pingall failed, one or more ping pairs failed" )
         time2 = time.time()
-        main.log.info("Time for pingall: %2f seconds" % (time2 - time1))
+        main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
 
-        #uninstall onos-app-fwd
-        main.log.info("Uninstall reactive forwarding app")
-        main.ONOScli1.feature_uninstall("onos-app-fwd")
-        main.ONOScli2.feature_uninstall("onos-app-fwd")
-        main.ONOScli3.feature_uninstall("onos-app-fwd")
-        main.ONOScli4.feature_uninstall("onos-app-fwd")
-        main.ONOScli5.feature_uninstall("onos-app-fwd")
-        main.ONOScli6.feature_uninstall("onos-app-fwd")
-        main.ONOScli7.feature_uninstall("onos-app-fwd")
-        #timeout for fwd flows
-        time.sleep(10)
+        # uninstall onos-app-fwd
+        main.log.info( "Uninstall reactive forwarding app" )
+        main.ONOScli1.featureUninstall( "onos-app-fwd" )
+        main.ONOScli2.featureUninstall( "onos-app-fwd" )
+        main.ONOScli3.featureUninstall( "onos-app-fwd" )
+        main.ONOScli4.featureUninstall( "onos-app-fwd" )
+        main.ONOScli5.featureUninstall( "onos-app-fwd" )
+        main.ONOScli6.featureUninstall( "onos-app-fwd" )
+        main.ONOScli7.featureUninstall( "onos-app-fwd" )
+        # timeout for fwd flows
+        time.sleep( 10 )
 
-        main.step("Add  host intents")
-        #TODO:  move the host numbers to params
-        import json
-        intents_json= json.loads(main.ONOScli1.hosts())
-        intent_add_result = True
-        for i in range(8,18):
-            main.log.info("Adding host intent between h"+str(i)+" and h"+str(i+10))
-            host1 =  "00:00:00:00:00:" + str(hex(i)[2:]).zfill(2).upper()
-            host2 =  "00:00:00:00:00:" + str(hex(i+10)[2:]).zfill(2).upper()
-            host1_id = main.ONOScli1.get_host(host1)['id']
-            host2_id = main.ONOScli1.get_host(host2)['id']
-            #NOTE: get host can return None
-            if host1_id and host2_id:
-                tmp_result = main.ONOScli1.add_host_intent(host1_id, host2_id )
+        main.step( "Add  host intents" )
+        intentIds = []
+        # TODO:  move the host numbers to params
+        #        Maybe look at all the paths we ping?
+        intentAddResult = True
+        hostResult = main.TRUE
+        for i in range( 8, 18 ):
+            main.log.info( "Adding host intent between h" + str( i ) +
+                           " and h" + str( i + 10 ) )
+            host1 = "00:00:00:00:00:" + \
+                str( hex( i )[ 2: ] ).zfill( 2 ).upper()
+            host2 = "00:00:00:00:00:" + \
+                str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
+            # NOTE: getHost can return None
+            host1Dict = main.ONOScli1.getHost( host1 )
+            host2Dict = main.ONOScli1.getHost( host2 )
+            host1Id = None
+            host2Id = None
+            if host1Dict and host2Dict:
+                host1Id = host1Dict.get( 'id', None )
+                host2Id = host2Dict.get( 'id', None )
+            if host1Id and host2Id:
+                # Changed onos node to test something
+                tmpId = main.ONOScli4.addHostIntent(
+                    host1Id,
+                    host2Id )
+                if tmpId:
+                    main.log.info( "Added intent with id: " + tmpId )
+                    intentIds.append( tmpId )
+                else:
+                    main.log.error( "addHostIntent reutrned None" )
             else:
-                main.log.error("Error, get_host() failed")
-                tmp_result = main.FALSE
-            intent_add_result = bool(intent_add_result and tmp_result)
-        utilities.assert_equals(expect=True, actual=intent_add_result,
-                onpass="Switch mastership correctly assigned",
-                onfail="Error in (re)assigning switch mastership")
-        #TODO Check if intents all exist in datastore
-        #NOTE: Do we need to print this once the test is working?
-        #main.log.info(json.dumps(json.loads(main.ONOScli1.intents(json_format=True)),
-        #    sort_keys=True, indent=4, separators=(',', ': ') ) )
+                main.log.error( "Error, getHost() failed" )
+                main.log.warn( json.dumps( json.loads( main.ONOScli1.hosts() ),
+                                           sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                hostResult = main.FALSE
+        onosIds = main.ONOScli1.getAllIntentsId()
+        main.log.info( "Submitted intents: " + str( intentIds ) )
+        main.log.info( "Intents in ONOS: " + str( onosIds ) )
+        for intent in intentIds:
+            if intent in onosIds:
+                pass  # intent submitted is still in onos
+            else:
+                intentAddResult = False
+        # Print the intent states
+        intents = main.ONOScli1.intents()
+        intentStates = []
+        installedCheck = True 
+        main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+        count = 0
+        for intent in json.loads( intents ):  # Iter through intents of a node
+            state = intent.get( 'state', None )
+            if "INSTALLED" not in state:
+                installedCheck = False
+            intentId = intent.get( 'id', None )
+            intentStates.append( ( intentId, state ) )
+        # add submitted intents not in the store
+        tmplist = [ i for i, s in intentStates ]
+        missingIntents = False
+        for i in intentIds:
+            if i not in tmplist:
+                intentStates.append( ( i, " - " ) )
+                missingIntents = True
+        intentStates.sort()
+        for i, s in intentStates:
+            count += 1
+            main.log.info( "%-6s%-15s%-15s" %
+                           ( str( count ), str( i ), str( s ) ) )
+        main.ONOScli1.leaders()
+        main.ONOScli1.partitions()
+        # for node in nodes:
+        #     node.pendingMap()
+        pendingMap = main.ONOScli1.pendingMap()
+        main.ONOScli2.pendingMap()
+        main.ONOScli3.pendingMap()
+        main.ONOScli4.pendingMap()
+        main.ONOScli5.pendingMap()
+        main.ONOScli6.pendingMap()
+        main.ONOScli7.pendingMap()
+        intentAddResult = bool( pingResult and hostResult and intentAddResult
+                                and not missingIntents and installedCheck )
+        utilities.assert_equals(
+            expect=True,
+            actual=intentAddResult,
+            onpass="Pushed host intents to ONOS",
+            onfail="Error in pushing host intents to ONOS" )
 
-    def CASE4(self,main) :
+        if not intentAddResult or "key" in pendingMap:
+            import time
+            installedCheck = True
+            main.log.info( "Sleeping 60 seconds to see if intents are found" )
+            time.sleep( 60 )
+            onosIds = main.ONOScli1.getAllIntentsId()
+            main.log.info( "Submitted intents: " + str( intentIds ) )
+            main.log.info( "Intents in ONOS: " + str( onosIds ) )
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            for intent in json.loads( intents ):
+                # Iter through intents of a node
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            # add submitted intents not in the store
+            tmplist = [ i for i, s in intentStates ]
+            for i in intentIds:
+                if i not in tmplist:
+                    intentStates.append( ( i, " - " ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.pendingMap()
+            main.ONOScli2.pendingMap()
+            main.ONOScli3.pendingMap()
+            main.ONOScli4.pendingMap()
+            main.ONOScli5.pendingMap()
+            main.ONOScli6.pendingMap()
+            main.ONOScli7.pendingMap()
+
+    def CASE4( self, main ):
         """
         Ping across added host intents
         """
-        description = " Ping across added host intents"
-        main.log.report(description)
-        main.case(description)
-        Ping_Result = main.TRUE
-        for i in range(8,18):
-            ping = main.Mininet1.pingHost(src="h"+str(i),target="h"+str(i+10))
-            Ping_Result = Ping_Result and ping
-            if ping==main.FALSE:
-                main.log.warn("Ping failed between h"+str(i)+" and h" + str(i+10))
-            elif ping==main.TRUE:
-                main.log.info("Ping test passed!")
-                Ping_Result = main.TRUE
-        if Ping_Result==main.FALSE:
-            main.log.report("Intents have not been installed correctly, pings failed.")
-        if Ping_Result==main.TRUE:
-            main.log.report("Intents have been installed correctly and verified by pings")
-        utilities.assert_equals(expect = main.TRUE,actual=Ping_Result,
-                onpass="Intents have been installed correctly and pings work",
-                onfail ="Intents have not been installed correctly, pings failed." )
-
-    def CASE5(self,main) :
-        '''
-        Reading state of ONOS
-        '''
-        import time
         import json
-        from subprocess import Popen, PIPE
-        from sts.topology.teston_topology import TestONTopology # assumes that sts is already in you PYTHONPATH
+        description = " Ping across added host intents"
+        main.log.report( description )
+        main.case( description )
+        PingResult = main.TRUE
+        for i in range( 8, 18 ):
+            ping = main.Mininet1.pingHost( src="h" + str( i ),
+                                           target="h" + str( i + 10 ) )
+            PingResult = PingResult and ping
+            if ping == main.FALSE:
+                main.log.warn( "Ping failed between h" + str( i ) +
+                               " and h" + str( i + 10 ) )
+            elif ping == main.TRUE:
+                main.log.info( "Ping test passed!" )
+                # Don't set PingResult or you'd override failures
+        if PingResult == main.FALSE:
+            main.log.report(
+                "Intents have not been installed correctly, pings failed." )
+            # TODO: pretty print
+            main.log.warn( "ONSO1 intents: " )
+            main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
+                                       sort_keys=True,
+                                       indent=4,
+                                       separators=( ',', ': ' ) ) )
+        if PingResult == main.TRUE:
+            main.log.report(
+                "Intents have been installed correctly and verified by pings" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=PingResult,
+            onpass="Intents have been installed correctly and pings work",
+            onfail="Intents have not been installed correctly, pings failed." )
 
-        main.log.report("Setting up and gathering data for current state")
-        main.case("Setting up and gathering data for current state")
-        #The general idea for this test case is to pull the state of (intents,flows, topology,...) from each ONOS node
-        #We can then compare them with eachother and also with past states
+        installedCheck = True
+        if PingResult is not main.TRUE:
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            # Iter through intents of a node
+            for intent in json.loads( intents ):
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.partitions()
+            main.ONOScli1.pendingMap()
+            main.ONOScli2.pendingMap()
+            main.ONOScli3.pendingMap()
+            main.ONOScli4.pendingMap()
+            main.ONOScli5.pendingMap()
+            main.ONOScli6.pendingMap()
+            main.ONOScli7.pendingMap()
+        if not installedCheck:
+            main.log.info( "Waiting 60 seconds to see if intent states change" )
+            time.sleep( 60 )
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            # Iter through intents of a node
+            for intent in json.loads( intents ):
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.partitions()
+            main.ONOScli1.pendingMap()
+            main.ONOScli2.pendingMap()
+            main.ONOScli3.pendingMap()
+            main.ONOScli4.pendingMap()
+            main.ONOScli5.pendingMap()
+            main.ONOScli6.pendingMap()
+            main.ONOScli7.pendingMap()
 
-        main.step("Get the Mastership of each switch from each controller")
-        global mastership_state
-        mastership_state = []
+    def CASE5( self, main ):
+        """
+        Reading state of ONOS
+        """
+        import json
+        # assumes that sts is already in you PYTHONPATH
+        from sts.topology.teston_topology import TestONTopology
 
-        #Assert that each device has a master
-        ONOS1_master_not_null = main.ONOScli1.roles_not_null()
-        ONOS2_master_not_null = main.ONOScli2.roles_not_null()
-        ONOS3_master_not_null = main.ONOScli3.roles_not_null()
-        ONOS4_master_not_null = main.ONOScli4.roles_not_null()
-        ONOS5_master_not_null = main.ONOScli5.roles_not_null()
-        ONOS6_master_not_null = main.ONOScli6.roles_not_null()
-        ONOS7_master_not_null = main.ONOScli7.roles_not_null()
-        roles_not_null = ONOS1_master_not_null and ONOS2_master_not_null and\
-                ONOS3_master_not_null and ONOS4_master_not_null and\
-                ONOS5_master_not_null and ONOS6_master_not_null and\
-                ONOS7_master_not_null
-        utilities.assert_equals(expect = main.TRUE,actual=roles_not_null,
-                onpass="Each device has a master",
-                onfail="Some devices don't have a master assigned")
+        main.log.report( "Setting up and gathering data for current state" )
+        main.case( "Setting up and gathering data for current state" )
+        # The general idea for this test case is to pull the state of
+        # ( intents,flows, topology,... ) from each ONOS node
+        # We can then compare them with eachother and also with past states
 
+        main.step( "Get the Mastership of each switch from each controller" )
+        global mastershipState
+        mastershipState = []
 
-        ONOS1_mastership = main.ONOScli1.roles()
-        ONOS2_mastership = main.ONOScli2.roles()
-        ONOS3_mastership = main.ONOScli3.roles()
-        ONOS4_mastership = main.ONOScli4.roles()
-        ONOS5_mastership = main.ONOScli5.roles()
-        ONOS6_mastership = main.ONOScli6.roles()
-        ONOS7_mastership = main.ONOScli7.roles()
-        #print json.dumps(json.loads(ONOS1_mastership), sort_keys=True, indent=4, separators=(',', ': '))
-        if "Error" in ONOS1_mastership or not ONOS1_mastership\
-                or "Error" in ONOS2_mastership or not ONOS2_mastership\
-                or "Error" in ONOS3_mastership or not ONOS3_mastership\
-                or "Error" in ONOS4_mastership or not ONOS4_mastership\
-                or "Error" in ONOS5_mastership or not ONOS5_mastership\
-                or "Error" in ONOS6_mastership or not ONOS6_mastership\
-                or "Error" in ONOS7_mastership or not ONOS7_mastership:
-                    main.log.report("Error in getting ONOS roles")
-                    main.log.warn("ONOS1 mastership response: " + repr(ONOS1_mastership))
-                    main.log.warn("ONOS2 mastership response: " + repr(ONOS2_mastership))
-                    main.log.warn("ONOS3 mastership response: " + repr(ONOS3_mastership))
-                    main.log.warn("ONOS4 mastership response: " + repr(ONOS4_mastership))
-                    main.log.warn("ONOS5 mastership response: " + repr(ONOS5_mastership))
-                    main.log.warn("ONOS6 mastership response: " + repr(ONOS6_mastership))
-                    main.log.warn("ONOS7 mastership response: " + repr(ONOS7_mastership))
-                    consistent_mastership = main.FALSE
-        elif ONOS1_mastership == ONOS2_mastership\
-                and ONOS1_mastership == ONOS3_mastership\
-                and ONOS1_mastership == ONOS4_mastership\
-                and ONOS1_mastership == ONOS5_mastership\
-                and ONOS1_mastership == ONOS6_mastership\
-                and ONOS1_mastership == ONOS7_mastership:
-                    mastership_state = ONOS1_mastership
-                    consistent_mastership = main.TRUE
-                    main.log.report("Switch roles are consistent across all ONOS nodes")
+        # Assert that each device has a master
+        ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
+        ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
+        ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
+        ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
+        ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
+        ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
+        ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
+        rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
+            ONOS3MasterNotNull and ONOS4MasterNotNull and\
+            ONOS5MasterNotNull and ONOS6MasterNotNull and\
+            ONOS7MasterNotNull
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=rolesNotNull,
+            onpass="Each device has a master",
+            onfail="Some devices don't have a master assigned" )
+
+        ONOS1Mastership = main.ONOScli1.roles()
+        ONOS2Mastership = main.ONOScli2.roles()
+        ONOS3Mastership = main.ONOScli3.roles()
+        ONOS4Mastership = main.ONOScli4.roles()
+        ONOS5Mastership = main.ONOScli5.roles()
+        ONOS6Mastership = main.ONOScli6.roles()
+        ONOS7Mastership = main.ONOScli7.roles()
+        if "Error" in ONOS1Mastership or not ONOS1Mastership\
+                or "Error" in ONOS2Mastership or not ONOS2Mastership\
+                or "Error" in ONOS3Mastership or not ONOS3Mastership\
+                or "Error" in ONOS4Mastership or not ONOS4Mastership\
+                or "Error" in ONOS5Mastership or not ONOS5Mastership\
+                or "Error" in ONOS6Mastership or not ONOS6Mastership\
+                or "Error" in ONOS7Mastership or not ONOS7Mastership:
+            main.log.report( "Error in getting ONOS roles" )
+            main.log.warn(
+                "ONOS1 mastership response: " +
+                repr( ONOS1Mastership ) )
+            main.log.warn(
+                "ONOS2 mastership response: " +
+                repr( ONOS2Mastership ) )
+            main.log.warn(
+                "ONOS3 mastership response: " +
+                repr( ONOS3Mastership ) )
+            main.log.warn(
+                "ONOS4 mastership response: " +
+                repr( ONOS4Mastership ) )
+            main.log.warn(
+                "ONOS5 mastership response: " +
+                repr( ONOS5Mastership ) )
+            main.log.warn(
+                "ONOS6 mastership response: " +
+                repr( ONOS6Mastership ) )
+            main.log.warn(
+                "ONOS7 mastership response: " +
+                repr( ONOS7Mastership ) )
+            consistentMastership = main.FALSE
+        elif ONOS1Mastership == ONOS2Mastership\
+                and ONOS1Mastership == ONOS3Mastership\
+                and ONOS1Mastership == ONOS4Mastership\
+                and ONOS1Mastership == ONOS5Mastership\
+                and ONOS1Mastership == ONOS6Mastership\
+                and ONOS1Mastership == ONOS7Mastership:
+            mastershipState = ONOS1Mastership
+            consistentMastership = main.TRUE
+            main.log.report(
+                "Switch roles are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 roles: ", json.dumps(json.loads(ONOS1_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 roles: ", json.dumps(json.loads(ONOS2_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 roles: ", json.dumps(json.loads(ONOS3_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 roles: ", json.dumps(json.loads(ONOS4_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 roles: ", json.dumps(json.loads(ONOS5_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 roles: ", json.dumps(json.loads(ONOS6_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 roles: ", json.dumps(json.loads(ONOS7_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            consistent_mastership = main.FALSE
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_mastership,
-                onpass="Switch roles are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of switch roles")
+            main.log.warn(
+                "ONOS1 roles: ",
+                json.dumps(
+                    json.loads( ONOS1Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS2 roles: ",
+                json.dumps(
+                    json.loads( ONOS2Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS3 roles: ",
+                json.dumps(
+                    json.loads( ONOS3Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS4 roles: ",
+                json.dumps(
+                    json.loads( ONOS4Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS5 roles: ",
+                json.dumps(
+                    json.loads( ONOS5Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS6 roles: ",
+                json.dumps(
+                    json.loads( ONOS6Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS7 roles: ",
+                json.dumps(
+                    json.loads( ONOS7Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            consistentMastership = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentMastership,
+            onpass="Switch roles are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of switch roles" )
 
-
-        main.step("Get the intents from each controller")
-        global intent_state
-        intent_state = []
-        ONOS1_intents = main.ONOScli1.intents( json_format=True )
-        ONOS2_intents = main.ONOScli2.intents( json_format=True )
-        ONOS3_intents = main.ONOScli3.intents( json_format=True )
-        ONOS4_intents = main.ONOScli4.intents( json_format=True )
-        ONOS5_intents = main.ONOScli5.intents( json_format=True )
-        ONOS6_intents = main.ONOScli6.intents( json_format=True )
-        ONOS7_intents = main.ONOScli7.intents( json_format=True )
-        intent_check = main.FALSE
-        if "Error" in ONOS1_intents or not ONOS1_intents\
-                or "Error" in ONOS2_intents or not ONOS2_intents\
-                or "Error" in ONOS3_intents or not ONOS3_intents\
-                or "Error" in ONOS4_intents or not ONOS4_intents\
-                or "Error" in ONOS5_intents or not ONOS5_intents\
-                or "Error" in ONOS6_intents or not ONOS6_intents\
-                or "Error" in ONOS7_intents or not ONOS7_intents:
-                    main.log.report("Error in getting ONOS intents")
-                    main.log.warn("ONOS1 intents response: " + repr(ONOS1_intents))
-                    main.log.warn("ONOS2 intents response: " + repr(ONOS2_intents))
-                    main.log.warn("ONOS3 intents response: " + repr(ONOS3_intents))
-                    main.log.warn("ONOS4 intents response: " + repr(ONOS4_intents))
-                    main.log.warn("ONOS5 intents response: " + repr(ONOS5_intents))
-                    main.log.warn("ONOS6 intents response: " + repr(ONOS6_intents))
-                    main.log.warn("ONOS7 intents response: " + repr(ONOS7_intents))
-        elif ONOS1_intents == ONOS2_intents\
-                and ONOS1_intents == ONOS3_intents\
-                and ONOS1_intents == ONOS4_intents\
-                and ONOS1_intents == ONOS5_intents\
-                and ONOS1_intents == ONOS6_intents\
-                and ONOS1_intents == ONOS7_intents:
-                    intent_state = ONOS1_intents
-                    intent_check = main.TRUE
-                    main.log.report("Intents are consistent across all ONOS nodes")
+        main.step( "Get the intents from each controller" )
+        global intentState
+        intentState = []
+        ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
+        ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
+        ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
+        ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
+        ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
+        ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
+        ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+        intentCheck = main.FALSE
+        if "Error" in ONOS1Intents or not ONOS1Intents\
+                or "Error" in ONOS2Intents or not ONOS2Intents\
+                or "Error" in ONOS3Intents or not ONOS3Intents\
+                or "Error" in ONOS4Intents or not ONOS4Intents\
+                or "Error" in ONOS5Intents or not ONOS5Intents\
+                or "Error" in ONOS6Intents or not ONOS6Intents\
+                or "Error" in ONOS7Intents or not ONOS7Intents:
+            main.log.report( "Error in getting ONOS intents" )
+            main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
+            main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
+            main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
+            main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
+            main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
+            main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
+            main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
+        elif ONOS1Intents == ONOS2Intents\
+                and ONOS1Intents == ONOS3Intents\
+                and ONOS1Intents == ONOS4Intents\
+                and ONOS1Intents == ONOS5Intents\
+                and ONOS1Intents == ONOS6Intents\
+                and ONOS1Intents == ONOS7Intents:
+            intentState = ONOS1Intents
+            intentCheck = main.TRUE
+            main.log.report( "Intents are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 intents: ", json.dumps(json.loads(ONOS1_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 intents: ", json.dumps(json.loads(ONOS2_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 intents: ", json.dumps(json.loads(ONOS3_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 intents: ", json.dumps(json.loads(ONOS4_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 intents: ", json.dumps(json.loads(ONOS5_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 intents: ", json.dumps(json.loads(ONOS6_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 intents: ", json.dumps(json.loads(ONOS7_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-        utilities.assert_equals(expect = main.TRUE,actual=intent_check,
-                onpass="Intents are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of intents")
+            main.log.warn(
+                "ONOS1 intents: ",
+                json.dumps(
+                    json.loads( ONOS1Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS2 intents: ",
+                json.dumps(
+                    json.loads( ONOS2Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS3 intents: ",
+                json.dumps(
+                    json.loads( ONOS3Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS4 intents: ",
+                json.dumps(
+                    json.loads( ONOS4Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS5 intents: ",
+                json.dumps(
+                    json.loads( ONOS5Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS6 intents: ",
+                json.dumps(
+                    json.loads( ONOS6Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS7 intents: ",
+                json.dumps(
+                    json.loads( ONOS7Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=intentCheck,
+            onpass="Intents are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of intents" )
 
+        main.step( "Get the flows from each controller" )
+        global flowState
+        flowState = []
+        flowCheck = main.FALSE
+        try:
+            ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
+            ONOS2Flows = main.ONOScli2.flows( jsonFormat=True )
+            ONOS3Flows = main.ONOScli3.flows( jsonFormat=True )
+            ONOS4Flows = main.ONOScli4.flows( jsonFormat=True )
+            ONOS5Flows = main.ONOScli5.flows( jsonFormat=True )
+            ONOS6Flows = main.ONOScli6.flows( jsonFormat=True )
+            ONOS7Flows = main.ONOScli7.flows( jsonFormat=True )
+            assert ONOS1Flows, "ONOS1 Flows should not be empty"
+            assert ONOS2Flows, "ONOS2 Flows should not be empty"
+            assert ONOS3Flows, "ONOS3 Flows should not be empty"
+            assert ONOS4Flows, "ONOS4 Flows should not be empty"
+            assert ONOS5Flows, "ONOS5 Flows should not be empty"
+            assert ONOS6Flows, "ONOS6 Flows should not be empty"
+            assert ONOS7Flows, "ONOS7 Flows should not be empty"
+            assert "Error" not in ONOS1Flows, "ONOS1 Flows contains 'Error'"
+            assert "Error" not in ONOS2Flows, "ONOS2 Flows contains 'Error'"
+            assert "Error" not in ONOS3Flows, "ONOS3 Flows contains 'Error'"
+            assert "Error" not in ONOS4Flows, "ONOS4 Flows contains 'Error'"
+            assert "Error" not in ONOS5Flows, "ONOS5 Flows contains 'Error'"
+            assert "Error" not in ONOS6Flows, "ONOS6 Flows contains 'Error'"
+            assert "Error" not in ONOS7Flows, "ONOS7 Flows contains 'Error'"
+            ONOS1FlowsJson = json.loads( ONOS1Flows )
+            ONOS2FlowsJson = json.loads( ONOS2Flows )
+            ONOS3FlowsJson = json.loads( ONOS3Flows )
+            ONOS4FlowsJson = json.loads( ONOS4Flows )
+            ONOS5FlowsJson = json.loads( ONOS5Flows )
+            ONOS6FlowsJson = json.loads( ONOS6Flows )
+            ONOS7FlowsJson = json.loads( ONOS7Flows )
+        except ( ValueError, AssertionError ):  # From json.loads, or asserts
+            main.log.exception( "One or more 'flows' responses from " +
+                                "ONOS couldn't be decoded." )
+            main.log.warn( "ONOS1 flows repsponse: " + ONOS1Flows )
+            main.log.warn( "ONOS2 flows repsponse: " + ONOS2Flows )
+            main.log.warn( "ONOS3 flows repsponse: " + ONOS3Flows )
+            main.log.warn( "ONOS4 flows repsponse: " + ONOS4Flows )
+            main.log.warn( "ONOS5 flows repsponse: " + ONOS5Flows )
+            main.log.warn( "ONOS6 flows repsponse: " + ONOS6Flows )
+            main.log.warn( "ONOS7 flows repsponse: " + ONOS7Flows )
+        else:  # No exceptions
+            if len( ONOS1FlowsJson ) == len( ONOS2FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS3FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS4FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS5FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS6FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS7FlowsJson ):
+                # TODO: Do a better check, maybe compare flows on switches?
+                # NOTE Possible issue with this not always being set?
+                flowState = ONOS1Flows
+                flowCheck = main.TRUE
+                main.log.report( "Flow count is consistent across all" +
+                                 " ONOS nodes" )
+            else:
+                main.log.warn( "ONOS1 flows: " +
+                               json.dumps( ONOS1FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS2 flows: " +
+                               json.dumps( ONOS2FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS3 flows: " +
+                               json.dumps( ONOS3FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS4 flows: " +
+                               json.dumps( ONOS4FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS5 flows: " +
+                               json.dumps( ONOS5FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS6 flows: " +
+                               json.dumps( ONOS6FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS7 flows: " +
+                               json.dumps( ONOS7FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=flowCheck,
+            onpass="The flow count is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different flow counts" )
 
-        main.step("Get the flows from each controller")
-        global flow_state
-        flow_state = []
-        ONOS1_flows = main.ONOScli1.flows( json_format=True )
-        ONOS2_flows = main.ONOScli2.flows( json_format=True )
-        ONOS3_flows = main.ONOScli3.flows( json_format=True )
-        ONOS4_flows = main.ONOScli4.flows( json_format=True )
-        ONOS5_flows = main.ONOScli5.flows( json_format=True )
-        ONOS6_flows = main.ONOScli6.flows( json_format=True )
-        ONOS7_flows = main.ONOScli7.flows( json_format=True )
-        flow_check = main.FALSE
-        if "Error" in ONOS1_flows or not ONOS1_flows\
-                or "Error" in ONOS2_flows or not ONOS2_flows\
-                or "Error" in ONOS3_flows or not ONOS3_flows\
-                or "Error" in ONOS4_flows or not ONOS4_flows\
-                or "Error" in ONOS5_flows or not ONOS5_flows\
-                or "Error" in ONOS6_flows or not ONOS6_flows\
-                or "Error" in ONOS7_flows or not ONOS7_flows:
-                    main.log.report("Error in getting ONOS intents")
-                    main.log.warn("ONOS1 flows repsponse: "+ ONOS1_flows)
-                    main.log.warn("ONOS2 flows repsponse: "+ ONOS2_flows)
-                    main.log.warn("ONOS3 flows repsponse: "+ ONOS3_flows)
-                    main.log.warn("ONOS4 flows repsponse: "+ ONOS4_flows)
-                    main.log.warn("ONOS5 flows repsponse: "+ ONOS5_flows)
-                    main.log.warn("ONOS6 flows repsponse: "+ ONOS6_flows)
-                    main.log.warn("ONOS7 flows repsponse: "+ ONOS7_flows)
-        elif len(json.loads(ONOS1_flows)) == len(json.loads(ONOS2_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS3_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS4_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS5_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS6_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS7_flows)):
-                #TODO: Do a better check, maybe compare flows on switches?
-                    flow_state = ONOS1_flows
-                    flow_check = main.TRUE
-                    main.log.report("Flow count is consistent across all ONOS nodes")
-        else:
-            main.log.warn("ONOS1 flows: "+ json.dumps(json.loads(ONOS1_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 flows: "+ json.dumps(json.loads(ONOS2_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 flows: "+ json.dumps(json.loads(ONOS3_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 flows: "+ json.dumps(json.loads(ONOS4_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 flows: "+ json.dumps(json.loads(ONOS5_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 flows: "+ json.dumps(json.loads(ONOS6_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 flows: "+ json.dumps(json.loads(ONOS7_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-        utilities.assert_equals(expect = main.TRUE,actual=flow_check,
-                onpass="The flow count is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different flow counts")
-
-
-        main.step("Get the OF Table entries")
+        main.step( "Get the OF Table entries" )
         global flows
-        flows=[]
-        for i in range(1,29):
-            flows.append(main.Mininet2.get_flowTable(1.3, "s"+str(i)))
+        flows = []
+        for i in range( 1, 29 ):
+            flows.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
+        if flowCheck == main.FALSE:
+            for table in flows:
+                main.log.warn( table )
+        # TODO: Compare switch flow tables with ONOS flow tables
 
-        #TODO: Compare switch flow tables with ONOS flow tables
+        main.step( "Start continuous pings" )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source1' ],
+            target=main.params[ 'PING' ][ 'target1' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source2' ],
+            target=main.params[ 'PING' ][ 'target2' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source3' ],
+            target=main.params[ 'PING' ][ 'target3' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source4' ],
+            target=main.params[ 'PING' ][ 'target4' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source5' ],
+            target=main.params[ 'PING' ][ 'target5' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source6' ],
+            target=main.params[ 'PING' ][ 'target6' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source7' ],
+            target=main.params[ 'PING' ][ 'target7' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source8' ],
+            target=main.params[ 'PING' ][ 'target8' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source9' ],
+            target=main.params[ 'PING' ][ 'target9' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source10' ],
+            target=main.params[ 'PING' ][ 'target10' ],
+            pingTime=500 )
 
-        main.step("Start continuous pings")
-        main.Mininet2.pingLong(src=main.params['PING']['source1'],
-                            target=main.params['PING']['target1'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source2'],
-                            target=main.params['PING']['target2'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source3'],
-                            target=main.params['PING']['target3'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source4'],
-                            target=main.params['PING']['target4'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source5'],
-                            target=main.params['PING']['target5'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source6'],
-                            target=main.params['PING']['target6'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source7'],
-                            target=main.params['PING']['target7'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source8'],
-                            target=main.params['PING']['target8'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source9'],
-                            target=main.params['PING']['target9'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source10'],
-                            target=main.params['PING']['target10'],pingTime=500)
-
-        main.step("Create TestONTopology object")
+        main.step( "Create TestONTopology object" )
         ctrls = []
         count = 1
         while True:
             temp = ()
-            if ('ip' + str(count)) in main.params['CTRL']:
-                temp = temp + (getattr(main,('ONOS' + str(count))),)
-                temp = temp + ("ONOS"+str(count),)
-                temp = temp + (main.params['CTRL']['ip'+str(count)],)
-                temp = temp + (eval(main.params['CTRL']['port'+str(count)]),)
-                ctrls.append(temp)
+            if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
+                temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
+                temp = temp + ( "ONOS" + str( count ), )
+                temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
+                temp = temp + \
+                    ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+                ctrls.append( temp )
                 count = count + 1
             else:
                 break
-        MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        MNTopo = TestONTopology(
+            main.Mininet1,
+            ctrls )  # can also add Intent API info for intent operations
 
-        main.step("Collecting topology information from ONOS")
+        main.step( "Collecting topology information from ONOS" )
         devices = []
         devices.append( main.ONOScli1.devices() )
         devices.append( main.ONOScli2.devices() )
@@ -822,10 +1118,6 @@
         hosts.append( json.loads( main.ONOScli5.hosts() ) )
         hosts.append( json.loads( main.ONOScli6.hosts() ) )
         hosts.append( json.loads( main.ONOScli7.hosts() ) )
-        for controller in range(0, len(hosts) ):
-            for host in hosts[controller]:
-                if host['ips'] == []:
-                    main.log.error("DEBUG:Error with host ips on controller"+str(controller+1)+": " + str(host))
         ports = []
         ports.append( main.ONOScli1.ports() )
         ports.append( main.ONOScli2.ports() )
@@ -850,478 +1142,574 @@
         clusters.append( main.ONOScli5.clusters() )
         clusters.append( main.ONOScli6.clusters() )
         clusters.append( main.ONOScli7.clusters() )
-        paths = []
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli1.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli2.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli3.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli4.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli5.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli6.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli7.topology() )
-        paths.append( temp_topo.get('paths', False) )
+        # Compare json objects for hosts and dataplane clusters
 
-        #Compare json objects for hosts, dataplane clusters and paths
-
-        #hosts
-        consistent_hosts_result = main.TRUE
+        # hosts
+        consistentHostsResult = main.TRUE
         for controller in range( len( hosts ) ):
-            if not "Error" in hosts[controller]:
-                if hosts[controller] == hosts[0]:
+            controllerStr = str( controller + 1 )
+            if "Error" not in hosts[ controller ]:
+                if hosts[ controller ] == hosts[ 0 ]:
                     continue
-                else:#hosts not consistent
-                    main.log.report("hosts from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                    main.log.warn( repr( hosts[controller] ) )
-                    consistent_hosts_result = main.FALSE
+                else:  # hosts not consistent
+                    main.log.report( "hosts from ONOS" +
+                                     controllerStr +
+                                     " is inconsistent with ONOS1" )
+                    main.log.warn( repr( hosts[ controller ] ) )
+                    consistentHostsResult = main.FALSE
 
             else:
-                main.log.report("Error in getting ONOS hosts from ONOS" + str(controller + 1) )
-                consistent_hosts_result = main.FALSE
-                main.log.warn("ONOS" + str(controller + 1) + " hosts response: " + repr(hosts[controller]) )
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_hosts_result,
-                onpass="Hosts view is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of hosts")
+                main.log.report( "Error in getting ONOS hosts from ONOS" +
+                                 controllerStr )
+                consistentHostsResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
+                               " hosts response: " +
+                               repr( hosts[ controller ] ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentHostsResult,
+            onpass="Hosts view is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of hosts" )
 
-        #Strongly connected clusters of devices
-        consistent_clusters_result = main.TRUE
+        ipResult = main.TRUE
+        for controller in range( 0, len( hosts ) ):
+            controllerStr = str( controller + 1 )
+            for host in hosts[ controller ]:
+                if host.get( 'ips', [] ) == []:
+                    main.log.error(
+                        "DEBUG:Error with host ips on controller" +
+                        controllerStr + ": " + str( host ) )
+                    ipResult = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=ipResult,
+            onpass="The ips of the hosts aren't empty",
+            onfail="The ip of at least one host is missing" )
+
+        # Strongly connected clusters of devices
+        consistentClustersResult = main.TRUE
         for controller in range( len( clusters ) ):
-            if not "Error" in clusters[controller]:
-                if clusters[controller] == clusters[0]:
+            if "Error" not in clusters[ controller ]:
+                if clusters[ controller ] == clusters[ 0 ]:
                     continue
-                else:#clusters not consistent
-                    main.log.report("clusters from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                    consistent_clusters_result = main.FALSE
+                else:  # clusters not consistent
+                    main.log.report( "clusters from ONOS" +
+                                     controllerStr +
+                                     " is inconsistent with ONOS1" )
+                    consistentClustersResult = main.FALSE
 
             else:
-                main.log.report("Error in getting dataplane clusters from ONOS" + str(controller + 1) )
-                consistent_clusters_result = main.FALSE
-                main.log.warn("ONOS" + str(controller + 1) + " clusters response: " + repr(clusters[controller]) )
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_clusters_result,
-                onpass="Clusters view is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of clusters")
-        num_clusters =  len(json.loads(clusters[0])) #there should always only be one cluster
-        utilities.assert_equals(expect = 1, actual = num_clusters,
-                onpass="ONOS shows 1 SCC",
-                onfail="ONOS shows "+str(num_clusters) +" SCCs")
+                main.log.report( "Error in getting dataplane clusters " +
+                                 "from ONOS" + controllerStr )
+                consistentClustersResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
+                               " clusters response: " +
+                               repr( clusters[ controller ] ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentClustersResult,
+            onpass="Clusters view is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of clusters" )
+        # there should always only be one cluster
+        numClusters = len( json.loads( clusters[ 0 ] ) )
+        clusterResults = main.FALSE
+        if numClusters == 1:
+            clusterResults = main.TRUE
+        utilities.assert_equals(
+            expect=1,
+            actual=numClusters,
+            onpass="ONOS shows 1 SCC",
+            onfail="ONOS shows " + str( numClusters ) + " SCCs" )
 
-
-        #paths
-        consistent_paths_result = main.TRUE
-        for controller in range( len( paths ) ):
-            if not "Error" in paths[controller]:
-                if paths[controller] == paths[0]:
-                    continue
-                else:#paths not consistent
-                    main.log.report("paths from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                    consistent_paths_result = main.FALSE
-
+        main.step( "Comparing ONOS topology to MN" )
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = main.TRUE
+        for controller in range( numControllers ):
+            controllerStr = str( controller + 1 )
+            if devices[ controller ] or "Error" not in devices[ controller ]:
+                currentDevicesResult = main.Mininet1.compareSwitches(
+                    MNTopo,
+                    json.loads(
+                        devices[ controller ] ) )
             else:
-                main.log.report("Error in getting paths from ONOS" + str(controller + 1) )
-                consistent_paths_result = main.FALSE
-                main.log.warn("ONOS" + str(controller + 1) + " paths response: " + repr(paths[controller]) )
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_paths_result,
-                onpass="Paths count is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different counts of paths")
+                currentDevicesResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentDevicesResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " Switches view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " Switches view is incorrect" )
 
-
-        main.step("Comparing ONOS topology to MN")
-        devices_results = main.TRUE
-        ports_results = main.TRUE
-        links_results = main.TRUE
-        for controller in range(num_controllers):
-            if devices[controller] or not "Error" in devices[controller]:
-                current_devices_result =  main.Mininet1.compare_switches(MNTopo, json.loads(devices[controller]))
+            if ports[ controller ] or "Error" not in ports[ controller ]:
+                currentPortsResult = main.Mininet1.comparePorts(
+                    MNTopo,
+                    json.loads(
+                        ports[ controller ] ) )
             else:
-                current_devices_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_devices_result,
-                    onpass="ONOS"+str(int(controller+1))+" Switches view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" Switches view is incorrect")
+                currentPortsResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentPortsResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " ports view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " ports view is incorrect" )
 
-            if ports[controller] or not "Error" in ports[controller]:
-                current_ports_result =  main.Mininet1.compare_ports(MNTopo, json.loads(ports[controller]))
+            if links[ controller ] or "Error" not in links[ controller ]:
+                currentLinksResult = main.Mininet1.compareLinks(
+                    MNTopo,
+                    json.loads(
+                        links[ controller ] ) )
             else:
-                current_ports_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_ports_result,
-                    onpass="ONOS"+str(int(controller+1))+" ports view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" ports view is incorrect")
+                currentLinksResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentLinksResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " links view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " links view is incorrect" )
 
-            if links[controller] or not "Error" in links[controller]:
-                current_links_result =  main.Mininet1.compare_links(MNTopo, json.loads(links[controller]))
-            else:
-                current_links_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_links_result,
-                    onpass="ONOS"+str(int(controller+1))+" links view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" links view is incorrect")
+            devicesResults = devicesResults and currentDevicesResult
+            portsResults = portsResults and currentPortsResult
+            linksResults = linksResults and currentLinksResult
 
-            devices_results = devices_results and current_devices_result
-            ports_results = ports_results and current_ports_result
-            links_results = links_results and current_links_result
+        topoResult = devicesResults and portsResults and linksResults\
+                     and consistentHostsResult and consistentClustersResult\
+                     and clusterResults and ipResult
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                 onpass="Topology Check Test successful",
+                                 onfail="Topology Check Test NOT successful" )
 
-        topo_result = devices_results and ports_results and links_results\
-                and consistent_hosts_result and consistent_clusters_result\
-                and consistent_paths_result
-        utilities.assert_equals(expect=main.TRUE, actual=topo_result,
-                onpass="Topology Check Test successful",
-                onfail="Topology Check Test NOT successful")
+        finalAssert = main.TRUE
+        finalAssert = finalAssert and topoResult and flowCheck \
+                      and intentCheck and consistentMastership and rolesNotNull
+        utilities.assert_equals( expect=main.TRUE, actual=finalAssert,
+                                 onpass="State check successful",
+                                 onfail="State check NOT successful" )
 
-        final_assert = main.TRUE
-        final_assert = final_assert and topo_result and flow_check \
-                and intent_check and consistent_mastership and roles_not_null
-        utilities.assert_equals(expect=main.TRUE, actual=final_assert,
-                onpass="State check successful",
-                onfail="State check NOT successful")
-
-
-    def CASE6(self,main) :
-        '''
+    def CASE6( self, main ):
+        """
         The Failure case.
-        '''
+        """
         import time
-        main.log.report("Killing 3 ONOS nodes")
-        main.log.case("Restart minority of ONOS nodes")
-        #TODO: Randomize these nodes
-        main.ONOSbench.onos_kill(ONOS1_ip)
-        time.sleep(10)
-        main.ONOSbench.onos_kill(ONOS2_ip)
-        time.sleep(10)
-        main.ONOSbench.onos_kill(ONOS3_ip)
+        main.log.report( "Killing 3 ONOS nodes" )
+        main.log.case( "Restart minority of ONOS nodes" )
+        # TODO: Randomize these nodes
+        main.ONOSbench.onosKill( ONOS1Ip )
+        time.sleep( 10 )
+        main.ONOSbench.onosKill( ONOS2Ip )
+        time.sleep( 10 )
+        main.ONOSbench.onosKill( ONOS3Ip )
 
-        main.step("Checking if ONOS is up yet")
+        main.step( "Checking if ONOS is up yet" )
         count = 0
-        onos_isup_result = main.FALSE
-        while onos_isup_result == main.FALSE and count < 10:
-            onos1_isup = main.ONOSbench.isup(ONOS1_ip)
-            onos2_isup = main.ONOSbench.isup(ONOS2_ip)
-            onos3_isup = main.ONOSbench.isup(ONOS3_ip)
-            onos_isup_result = onos1_isup and onos2_isup and onos3_isup
+        onosIsupResult = main.FALSE
+        while onosIsupResult == main.FALSE and count < 10:
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+            onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+            onosIsupResult = onos1Isup and onos2Isup and onos3Isup
             count = count + 1
         # TODO: if it becomes an issue, we can retry this step  a few times
 
+        cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
+        cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
+        cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
+        cliResults = cliResult1 and cliResult2 and cliResult3
 
-        cli_result1 = main.ONOScli1.start_onos_cli(ONOS1_ip)
-        cli_result2 = main.ONOScli2.start_onos_cli(ONOS2_ip)
-        cli_result3 = main.ONOScli3.start_onos_cli(ONOS3_ip)
-        cli_results = cli_result1 and cli_result2 and cli_result3
+        # Grab the time of restart so we chan check how long the gossip
+        # protocol has had time to work
+        main.restartTime = time.time()
+        caseResults = main.TRUE and onosIsupResult and cliResults
+        utilities.assert_equals( expect=main.TRUE, actual=caseResults,
+                                 onpass="ONOS restart successful",
+                                 onfail="ONOS restart NOT successful" )
 
-        main.log.info("Install leadership election app on restarted node")
-
-        case_results = main.TRUE and onos_isup_result and cli_results
-        utilities.assert_equals(expect=main.TRUE, actual=case_results,
-                onpass="ONOS restart successful",
-                onfail="ONOS restart NOT successful")
-
-
-    def CASE7(self,main) :
-        '''
+    def CASE7( self, main ):
+        """
         Check state after ONOS failure
-        '''
-        import os
+        """
         import json
-        main.case("Running ONOS Constant State Tests")
+        import time
+        main.case( "Running ONOS Constant State Tests" )
 
-        #Assert that each device has a master
-        ONOS1_master_not_null = main.ONOScli1.roles_not_null()
-        ONOS2_master_not_null = main.ONOScli2.roles_not_null()
-        ONOS3_master_not_null = main.ONOScli3.roles_not_null()
-        ONOS4_master_not_null = main.ONOScli4.roles_not_null()
-        ONOS5_master_not_null = main.ONOScli5.roles_not_null()
-        ONOS6_master_not_null = main.ONOScli6.roles_not_null()
-        ONOS7_master_not_null = main.ONOScli7.roles_not_null()
-        roles_not_null = ONOS1_master_not_null and ONOS2_master_not_null and\
-                ONOS3_master_not_null and ONOS4_master_not_null and\
-                ONOS5_master_not_null and ONOS6_master_not_null and\
-                ONOS7_master_not_null
-        utilities.assert_equals(expect = main.TRUE,actual=roles_not_null,
-                onpass="Each device has a master",
-                onfail="Some devices don't have a master assigned")
+        # Assert that each device has a master
+        ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
+        ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
+        ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
+        ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
+        ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
+        ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
+        ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
+        rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
+            ONOS3MasterNotNull and ONOS4MasterNotNull and\
+            ONOS5MasterNotNull and ONOS6MasterNotNull and\
+            ONOS7MasterNotNull
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=rolesNotNull,
+            onpass="Each device has a master",
+            onfail="Some devices don't have a master assigned" )
 
-
-
-        main.step("Check if switch roles are consistent across all nodes")
-        ONOS1_mastership = main.ONOScli1.roles()
-        ONOS2_mastership = main.ONOScli2.roles()
-        ONOS3_mastership = main.ONOScli3.roles()
-        ONOS4_mastership = main.ONOScli4.roles()
-        ONOS5_mastership = main.ONOScli5.roles()
-        ONOS6_mastership = main.ONOScli6.roles()
-        ONOS7_mastership = main.ONOScli7.roles()
-        #print json.dumps(json.loads(ONOS1_mastership), sort_keys=True, indent=4, separators=(',', ': '))
-        if "Error" in ONOS1_mastership or not ONOS1_mastership\
-                or "Error" in ONOS2_mastership or not ONOS2_mastership\
-                or "Error" in ONOS3_mastership or not ONOS3_mastership\
-                or "Error" in ONOS4_mastership or not ONOS4_mastership\
-                or "Error" in ONOS5_mastership or not ONOS5_mastership\
-                or "Error" in ONOS6_mastership or not ONOS6_mastership\
-                or "Error" in ONOS7_mastership or not ONOS7_mastership:
-                    main.log.error("Error in getting ONOS mastership")
-                    main.log.warn("ONOS1 mastership response: " + repr(ONOS1_mastership))
-                    main.log.warn("ONOS2 mastership response: " + repr(ONOS2_mastership))
-                    main.log.warn("ONOS3 mastership response: " + repr(ONOS3_mastership))
-                    main.log.warn("ONOS4 mastership response: " + repr(ONOS4_mastership))
-                    main.log.warn("ONOS5 mastership response: " + repr(ONOS5_mastership))
-                    main.log.warn("ONOS6 mastership response: " + repr(ONOS6_mastership))
-                    main.log.warn("ONOS7 mastership response: " + repr(ONOS7_mastership))
-                    consistent_mastership = main.FALSE
-        elif ONOS1_mastership == ONOS2_mastership\
-                and ONOS1_mastership == ONOS3_mastership\
-                and ONOS1_mastership == ONOS4_mastership\
-                and ONOS1_mastership == ONOS5_mastership\
-                and ONOS1_mastership == ONOS6_mastership\
-                and ONOS1_mastership == ONOS7_mastership:
-                    consistent_mastership = main.TRUE
-                    main.log.report("Switch roles are consistent across all ONOS nodes")
+        main.step( "Check if switch roles are consistent across all nodes" )
+        ONOS1Mastership = main.ONOScli1.roles()
+        ONOS2Mastership = main.ONOScli2.roles()
+        ONOS3Mastership = main.ONOScli3.roles()
+        ONOS4Mastership = main.ONOScli4.roles()
+        ONOS5Mastership = main.ONOScli5.roles()
+        ONOS6Mastership = main.ONOScli6.roles()
+        ONOS7Mastership = main.ONOScli7.roles()
+        if "Error" in ONOS1Mastership or not ONOS1Mastership\
+                or "Error" in ONOS2Mastership or not ONOS2Mastership\
+                or "Error" in ONOS3Mastership or not ONOS3Mastership\
+                or "Error" in ONOS4Mastership or not ONOS4Mastership\
+                or "Error" in ONOS5Mastership or not ONOS5Mastership\
+                or "Error" in ONOS6Mastership or not ONOS6Mastership\
+                or "Error" in ONOS7Mastership or not ONOS7Mastership:
+            main.log.error( "Error in getting ONOS mastership" )
+            main.log.warn( "ONOS1 mastership response: " +
+                           repr( ONOS1Mastership ) )
+            main.log.warn( "ONOS2 mastership response: " +
+                           repr( ONOS2Mastership ) )
+            main.log.warn( "ONOS3 mastership response: " +
+                           repr( ONOS3Mastership ) )
+            main.log.warn( "ONOS4 mastership response: " +
+                           repr( ONOS4Mastership ) )
+            main.log.warn( "ONOS5 mastership response: " +
+                           repr( ONOS5Mastership ) )
+            main.log.warn( "ONOS6 mastership response: " +
+                           repr( ONOS6Mastership ) )
+            main.log.warn( "ONOS7 mastership response: " +
+                           repr( ONOS7Mastership ) )
+            consistentMastership = main.FALSE
+        elif ONOS1Mastership == ONOS2Mastership\
+                and ONOS1Mastership == ONOS3Mastership\
+                and ONOS1Mastership == ONOS4Mastership\
+                and ONOS1Mastership == ONOS5Mastership\
+                and ONOS1Mastership == ONOS6Mastership\
+                and ONOS1Mastership == ONOS7Mastership:
+            consistentMastership = main.TRUE
+            main.log.report(
+                "Switch roles are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 roles: ", json.dumps(json.loads(ONOS1_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 roles: ", json.dumps(json.loads(ONOS2_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 roles: ", json.dumps(json.loads(ONOS3_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 roles: ", json.dumps(json.loads(ONOS4_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 roles: ", json.dumps(json.loads(ONOS5_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 roles: ", json.dumps(json.loads(ONOS6_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 roles: ", json.dumps(json.loads(ONOS7_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            consistent_mastership = main.FALSE
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_mastership,
-                onpass="Switch roles are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of switch roles")
-
+            main.log.warn( "ONOS1 roles: ", json.dumps(
+                json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS2 roles: ", json.dumps(
+                json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS3 roles: ", json.dumps(
+                json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS4 roles: ", json.dumps(
+                json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS5 roles: ", json.dumps(
+                json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS6 roles: ", json.dumps(
+                json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS7 roles: ", json.dumps(
+                json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            consistentMastership = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentMastership,
+            onpass="Switch roles are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of switch roles" )
 
         description2 = "Compare switch roles from before failure"
-        main.step(description2)
+        main.step( description2 )
 
-        current_json = json.loads(ONOS1_mastership)
-        old_json = json.loads(mastership_state)
-        mastership_check = main.TRUE
-        for i in range(1,29):
-            switchDPID = str(main.Mininet1.getSwitchDPID(switch="s"+str(i)))
+        currentJson = json.loads( ONOS1Mastership )
+        oldJson = json.loads( mastershipState )
+        mastershipCheck = main.TRUE
+        for i in range( 1, 29 ):
+            switchDPID = str(
+                main.Mininet1.getSwitchDPID(
+                    switch="s" +
+                    str( i ) ) )
 
-            current = [switch['master'] for switch in current_json if switchDPID in switch['id']]
-            old = [switch['master'] for switch in old_json if switchDPID in switch['id']]
+            current = [ switch[ 'master' ] for switch in currentJson
+                        if switchDPID in switch[ 'id' ] ]
+            old = [ switch[ 'master' ] for switch in oldJson
+                    if switchDPID in switch[ 'id' ] ]
             if current == old:
-                mastership_check = mastership_check and main.TRUE
+                mastershipCheck = mastershipCheck and main.TRUE
             else:
-                main.log.warn("Mastership of switch %s changed" % switchDPID)
-                mastership_check = main.FALSE
-        if mastership_check == main.TRUE:
-            main.log.report("Mastership of Switches was not changed")
-        utilities.assert_equals(expect=main.TRUE,actual=mastership_check,
-                onpass="Mastership of Switches was not changed",
-                onfail="Mastership of some switches changed")
-        #NOTE: we expect mastership to change on controller failure
-        mastership_check = consistent_mastership
+                main.log.warn( "Mastership of switch %s changed" % switchDPID )
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
+            main.log.report( "Mastership of Switches was not changed" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=mastershipCheck,
+            onpass="Mastership of Switches was not changed",
+            onfail="Mastership of some switches changed" )
+        # NOTE: we expect mastership to change on controller failure
+        mastershipCheck = consistentMastership
 
-
-
-        main.step("Get the intents and compare across all nodes")
-        ONOS1_intents = main.ONOScli1.intents( json_format=True )
-        ONOS2_intents = main.ONOScli2.intents( json_format=True )
-        ONOS3_intents = main.ONOScli3.intents( json_format=True )
-        ONOS4_intents = main.ONOScli4.intents( json_format=True )
-        ONOS5_intents = main.ONOScli5.intents( json_format=True )
-        ONOS6_intents = main.ONOScli6.intents( json_format=True )
-        ONOS7_intents = main.ONOScli7.intents( json_format=True )
-        intent_check = main.FALSE
-        if "Error" in ONOS1_intents or not ONOS1_intents\
-                or "Error" in ONOS2_intents or not ONOS2_intents\
-                or "Error" in ONOS3_intents or not ONOS3_intents\
-                or "Error" in ONOS4_intents or not ONOS4_intents\
-                or "Error" in ONOS5_intents or not ONOS5_intents\
-                or "Error" in ONOS6_intents or not ONOS6_intents\
-                or "Error" in ONOS7_intents or not ONOS7_intents:
-                    main.log.report("Error in getting ONOS intents")
-                    main.log.warn("ONOS1 intents response: " + repr(ONOS1_intents))
-                    main.log.warn("ONOS2 intents response: " + repr(ONOS2_intents))
-                    main.log.warn("ONOS3 intents response: " + repr(ONOS3_intents))
-                    main.log.warn("ONOS4 intents response: " + repr(ONOS4_intents))
-                    main.log.warn("ONOS5 intents response: " + repr(ONOS5_intents))
-                    main.log.warn("ONOS6 intents response: " + repr(ONOS6_intents))
-                    main.log.warn("ONOS7 intents response: " + repr(ONOS7_intents))
-        elif ONOS1_intents == ONOS2_intents\
-                and ONOS1_intents == ONOS3_intents\
-                and ONOS1_intents == ONOS4_intents\
-                and ONOS1_intents == ONOS5_intents\
-                and ONOS1_intents == ONOS6_intents\
-                and ONOS1_intents == ONOS7_intents:
-                    intent_check = main.TRUE
-                    main.log.report("Intents are consistent across all ONOS nodes")
+        main.step( "Get the intents and compare across all nodes" )
+        ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
+        ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
+        ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
+        ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
+        ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
+        ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
+        ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+        intentCheck = main.FALSE
+        if "Error" in ONOS1Intents or not ONOS1Intents\
+                or "Error" in ONOS2Intents or not ONOS2Intents\
+                or "Error" in ONOS3Intents or not ONOS3Intents\
+                or "Error" in ONOS4Intents or not ONOS4Intents\
+                or "Error" in ONOS5Intents or not ONOS5Intents\
+                or "Error" in ONOS6Intents or not ONOS6Intents\
+                or "Error" in ONOS7Intents or not ONOS7Intents:
+            main.log.report( "Error in getting ONOS intents" )
+            main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
+            main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
+            main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
+            main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
+            main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
+            main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
+            main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
+        elif ONOS1Intents == ONOS2Intents\
+                and ONOS1Intents == ONOS3Intents\
+                and ONOS1Intents == ONOS4Intents\
+                and ONOS1Intents == ONOS5Intents\
+                and ONOS1Intents == ONOS6Intents\
+                and ONOS1Intents == ONOS7Intents:
+            intentCheck = main.TRUE
+            main.log.report( "Intents are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 intents: ")
-            print json.dumps(json.loads(ONOS1_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS2 intents: ")
-            print json.dumps(json.loads(ONOS2_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS3 intents: ")
-            print json.dumps(json.loads(ONOS3_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS4 intents: ")
-            print json.dumps(json.loads(ONOS4_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS5 intents: ")
-            print json.dumps(json.loads(ONOS5_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS6 intents: ")
-            print json.dumps(json.loads(ONOS6_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS7 intents: ")
-            print json.dumps(json.loads(ONOS7_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-        utilities.assert_equals(expect = main.TRUE,actual=intent_check,
-                onpass="Intents are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of intents")
+            main.log.warn( "ONOS1 intents: " )
+            print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS2 intents: " )
+            print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS3 intents: " )
+            print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS4 intents: " )
+            print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS5 intents: " )
+            print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS6 intents: " )
+            print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS7 intents: " )
+            print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=intentCheck,
+            onpass="Intents are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of intents" )
+        # Print the intent states
+        intents = []
+        intents.append( ONOS1Intents )
+        intents.append( ONOS2Intents )
+        intents.append( ONOS3Intents )
+        intents.append( ONOS4Intents )
+        intents.append( ONOS5Intents )
+        intents.append( ONOS6Intents )
+        intents.append( ONOS7Intents )
+        intentStates = []
+        for node in intents:  # Iter through ONOS nodes
+            nodeStates = []
+            # Iter through intents of a node
+            for intent in json.loads( node ):
+                nodeStates.append( intent[ 'state' ] )
+            intentStates.append( nodeStates )
+            out = [ (i, nodeStates.count( i ) ) for i in set( nodeStates ) ]
+            main.log.info( dict( out ) )
 
-        #NOTE: Hazelcast has no durability, so intents are lost across system restarts
-        main.step("Compare current intents with intents before the failure")
-        #NOTE: this requires case 5 to pass for intent_state to be set.
+        # NOTE: Store has no durability, so intents are lost across system
+        #       restarts
+        main.step( "Compare current intents with intents before the failure" )
+        # NOTE: this requires case 5 to pass for intentState to be set.
         #      maybe we should stop the test if that fails?
-        if intent_state == ONOS1_intents:
-            same_intents = main.TRUE
-            main.log.report("Intents are consistent with before failure")
-        #TODO: possibly the states have changed? we may need to figure out what the aceptable states are
+        sameIntents = main.TRUE
+        if intentState and intentState == ONOS1Intents:
+            sameIntents = main.TRUE
+            main.log.report( "Intents are consistent with before failure" )
+        # TODO: possibly the states have changed? we may need to figure out
+        # what the aceptable states are
         else:
             try:
-                main.log.warn("ONOS1 intents: ")
-                print json.dumps(json.loads(ONOS1_intents),
-                    sort_keys=True, indent=4, separators=(',', ': '))
-            except:
+                main.log.warn( "ONOS1 intents: " )
+                print json.dumps( json.loads( ONOS1Intents ),
+                                  sort_keys=True, indent=4,
+                                  separators=( ',', ': ' ) )
+            except Exception:
                 pass
-            same_intents = main.FALSE
-        utilities.assert_equals(expect = main.TRUE,actual=same_intents,
-                onpass="Intents are consistent with before failure",
-                onfail="The Intents changed during failure")
-        intent_check = intent_check and same_intents
+            sameIntents = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=sameIntents,
+            onpass="Intents are consistent with before failure",
+            onfail="The Intents changed during failure" )
+        intentCheck = intentCheck and sameIntents
 
+        main.step( "Get the OF Table entries and compare to before " +
+                   "component failure" )
+        FlowTables = main.TRUE
+        flows2 = []
+        for i in range( 28 ):
+            main.log.info( "Checking flow table on s" + str( i + 1 ) )
+            tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
+            flows2.append( tmpFlows )
+            tempResult = main.Mininet2.flowComp(
+                flow1=flows[ i ],
+                flow2=tmpFlows )
+            FlowTables = FlowTables and tempResult
+            if FlowTables == main.FALSE:
+                main.log.info( "Differences in flow table for switch: s" +
+                               str( i + 1 ) )
+        if FlowTables == main.TRUE:
+            main.log.report( "No changes were found in the flow tables" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=FlowTables,
+            onpass="No changes were found in the flow tables",
+            onfail="Changes were found in the flow tables" )
 
-
-        main.step("Get the OF Table entries and compare to before component failure")
-        Flow_Tables = main.TRUE
-        flows2=[]
-        for i in range(28):
-            main.log.info("Checking flow table on s" + str(i+1))
-            tmp_flows = main.Mininet2.get_flowTable(1.3, "s"+str(i+1))
-            flows2.append(tmp_flows)
-            temp_result = main.Mininet2.flow_comp(flow1=flows[i],flow2=tmp_flows)
-            Flow_Tables = Flow_Tables and temp_result
-            if Flow_Tables == main.FALSE:
-                main.log.info("Differences in flow table for switch: "+str(i+1))
-        if Flow_Tables == main.TRUE:
-            main.log.report("No changes were found in the flow tables")
-        utilities.assert_equals(expect=main.TRUE,actual=Flow_Tables,
-                onpass="No changes were found in the flow tables",
-                onfail="Changes were found in the flow tables")
-
-        main.step("Check the continuous pings to ensure that no packets were dropped during component failure")
-        #FIXME: This check is always failing. Investigate cause
-        #NOTE:  this may be something to do with file permsissions
+        main.step( "Check the continuous pings to ensure that no packets " +
+                   "were dropped during component failure" )
+        # FIXME: This check is always failing. Investigate cause
+        # NOTE:  this may be something to do with file permsissions
         #       or slight change in format
-        main.Mininet2.pingKill(main.params['TESTONUSER'], main.params['TESTONIP'])
-        Loss_In_Pings = main.FALSE 
-        #NOTE: checkForLoss returns main.FALSE with 0% packet loss
-        for i in range(8,18):
-            main.log.info("Checking for a loss in pings along flow from s" + str(i))
-            Loss_In_Pings = main.Mininet2.checkForLoss("/tmp/ping.h"+str(i)) or Loss_In_Pings
-        if Loss_In_Pings == main.TRUE:
-            main.log.info("Loss in ping detected")
-        elif Loss_In_Pings == main.ERROR:
-            main.log.info("There are multiple mininet process running")
-        elif Loss_In_Pings == main.FALSE:
-            main.log.info("No Loss in the pings")
-            main.log.report("No loss of dataplane connectivity")
-        utilities.assert_equals(expect=main.FALSE,actual=Loss_In_Pings,
-                onpass="No Loss of connectivity",
-                onfail="Loss of dataplane connectivity detected")
+        main.Mininet2.pingKill(
+            main.params[ 'TESTONUSER' ],
+            main.params[ 'TESTONIP' ] )
+        LossInPings = main.FALSE
+        # NOTE: checkForLoss returns main.FALSE with 0% packet loss
+        for i in range( 8, 18 ):
+            main.log.info(
+                "Checking for a loss in pings along flow from s" +
+                str( i ) )
+            LossInPings = main.Mininet2.checkForLoss(
+                "/tmp/ping.h" +
+                str( i ) ) or LossInPings
+        if LossInPings == main.TRUE:
+            main.log.info( "Loss in ping detected" )
+        elif LossInPings == main.ERROR:
+            main.log.info( "There are multiple mininet process running" )
+        elif LossInPings == main.FALSE:
+            main.log.info( "No Loss in the pings" )
+            main.log.report( "No loss of dataplane connectivity" )
+        utilities.assert_equals(
+            expect=main.FALSE,
+            actual=LossInPings,
+            onpass="No Loss of connectivity",
+            onfail="Loss of dataplane connectivity detected" )
 
-
-        #Test of LeadershipElection
-        leader_list = []
-        leader_result = main.TRUE
-        for controller in range(1,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            leaderN = node.election_test_leader()
-            leader_list.append(leaderN)
+        # Test of LeadershipElection
+        leaderList = []
+        leaderResult = main.TRUE
+        for controller in range( 1, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            leaderN = node.electionTestLeader()
+            leaderList.append( leaderN )
             if leaderN == main.FALSE:
-                #error in  response
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
-            elif leaderN == None:
-                main.log.report("ONOS"+str(controller) + " shows no leader for the election-app was elected after the old one died")
-                leader_result = main.FALSE
-            elif leaderN == ONOS1_ip or leaderN == ONOS2_ip or leaderN == ONOS3_ip:
-                main.log.report("ONOS"+str(controller) + " shows "+str(leaderN)+" as leader for the election-app, but it was restarted")
-                leader_result = main.FALSE
-        if len( set( leader_list ) ) != 1:
-            leader_result = main.FALSE
-            main.log.error("Inconsistent view of leader for the election test app")
-            #TODO: print the list
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a new leader was re-elected if applicable)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+                # error in  response
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, check the" +
+                                 " error logs" )
+                leaderResult = main.FALSE
+            elif leaderN is None:
+                main.log.report( "ONOS" + str( controller ) +
+                                 " shows no leader for the election-app was" +
+                                 " elected after the old one died" )
+                leaderResult = main.FALSE
+            elif leaderN == ONOS1Ip or leaderN == ONOS2Ip or\
+                    leaderN == ONOS3Ip:
+                main.log.report( "ONOS" + str( controller ) +
+                                 " shows " + str( leaderN ) +
+                                 " as leader for the election-app, but it " +
+                                 "was restarted" )
+                leaderResult = main.FALSE
+        if len( set( leaderList ) ) != 1:
+            leaderResult = main.FALSE
+            main.log.error(
+                "Inconsistent view of leader for the election test app" )
+            # TODO: print the list
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a new " +
+                             "leader was re-elected if applicable )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-
-        result = mastership_check and intent_check and Flow_Tables and (not Loss_In_Pings) and roles_not_null\
-                and leader_result
-        result = int(result)
+        result = ( mastershipCheck and intentCheck and FlowTables and
+                   ( not LossInPings ) and rolesNotNull and leaderResult )
+        result = int( result )
         if result == main.TRUE:
-            main.log.report("Constant State Tests Passed")
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="Constant State Tests Passed",
-                onfail="Constant state tests failed")
+            main.log.report( "Constant State Tests Passed" )
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="Constant State Tests Passed",
+                                 onfail="Constant state tests failed" )
 
-    def CASE8 (self,main):
-        '''
+    def CASE8( self, main ):
+        """
         Compare topo
-        '''
+        """
         import sys
-        sys.path.append("/home/admin/sts") # Trying to remove some dependancies, #FIXME add this path to params
-        from sts.topology.teston_topology import TestONTopology # assumes that sts is already in you PYTHONPATH
+        # FIXME add this path to params
+        sys.path.append( "/home/admin/sts" )
+        # assumes that sts is already in you PYTHONPATH
+        from sts.topology.teston_topology import TestONTopology
         import json
         import time
 
-        description ="Compare ONOS Topology view to Mininet topology"
-        main.case(description)
-        main.log.report(description)
-        main.step("Create TestONTopology object")
+        description = "Compare ONOS Topology view to Mininet topology"
+        main.case( description )
+        main.log.report( description )
+        main.step( "Create TestONTopology object" )
         ctrls = []
         count = 1
         while True:
             temp = ()
-            if ('ip' + str(count)) in main.params['CTRL']:
-                temp = temp + (getattr(main,('ONOS' + str(count))),)
-                temp = temp + ("ONOS"+str(count),)
-                temp = temp + (main.params['CTRL']['ip'+str(count)],)
-                temp = temp + (eval(main.params['CTRL']['port'+str(count)]),)
-                ctrls.append(temp)
+            if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
+                temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
+                temp = temp + ( "ONOS" + str( count ), )
+                temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
+                temp = temp + \
+                    ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+                ctrls.append( temp )
                 count = count + 1
             else:
                 break
-        MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        MNTopo = TestONTopology(
+            main.Mininet1,
+            ctrls )  # can also add Intent API info for intent operations
 
-        main.step("Comparing ONOS topology to MN")
-        devices_results = main.TRUE
-        ports_results = main.TRUE
-        links_results = main.TRUE
-        topo_result = main.FALSE
+        main.step( "Comparing ONOS topology to MN" )
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = main.TRUE
+        hostsResults = main.TRUE
+        topoResult = main.FALSE
         elapsed = 0
         count = 0
-        main.step("Collecting topology information from ONOS")
-        start_time = time.time()
-        while topo_result == main.FALSE and elapsed < 60:
+        main.step( "Collecting topology information from ONOS" )
+        startTime = time.time()
+        # Give time for Gossip to work
+        while topoResult == main.FALSE and elapsed < 60:
             count = count + 1
             if count > 1:
-                MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
-            cli_start = time.time()
+                # TODO: Depricate STS usage
+                MNTopo = TestONTopology( main.Mininet1, ctrls )
+            cliStart = time.time()
             devices = []
             devices.append( main.ONOScli1.devices() )
             devices.append( main.ONOScli2.devices() )
@@ -1338,11 +1726,15 @@
             hosts.append( json.loads( main.ONOScli5.hosts() ) )
             hosts.append( json.loads( main.ONOScli6.hosts() ) )
             hosts.append( json.loads( main.ONOScli7.hosts() ) )
-            for controller in range(0, len(hosts) ):
-                for host in hosts[controller]:
-                    host
-                    if host['ips'] == []:
-                        main.log.error("DEBUG:Error with host ips on controller"+str(controller+1)+": " + str(host))
+            ipResult = main.TRUE
+            for controller in range( 0, len( hosts ) ):
+                controllerStr = str( controller + 1 )
+                for host in hosts[ controller ]:
+                    if host is None or host.get( 'ips', [] ) == []:
+                        main.log.error(
+                            "DEBUG:Error with host ips on controller" +
+                            controllerStr + ": " + str( host ) )
+                        ipResult = main.FALSE
             ports = []
             ports.append( main.ONOScli1.ports() )
             ports.append( main.ONOScli2.ports() )
@@ -1367,493 +1759,551 @@
             clusters.append( main.ONOScli5.clusters() )
             clusters.append( main.ONOScli6.clusters() )
             clusters.append( main.ONOScli7.clusters() )
-            paths = []
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli1.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli2.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli3.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli4.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli5.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli6.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli7.topology() )
-            paths.append( temp_topo.get('paths', False) )
 
+            elapsed = time.time() - startTime
+            cliTime = time.time() - cliStart
+            print "CLI time: " + str( cliTime )
 
-            elapsed = time.time() - start_time
-            cli_time = time.time() - cli_start
-            print "CLI time: " + str(cli_time)
-
-            for controller in range(num_controllers):
-                if devices[controller] or not "Error" in devices[controller]:
-                    current_devices_result =  main.Mininet1.compare_switches(MNTopo, json.loads(devices[controller]))
+            for controller in range( numControllers ):
+                controllerStr = str( controller + 1 )
+                if devices[ controller ] or "Error" not in devices[
+                        controller ]:
+                    currentDevicesResult = main.Mininet1.compareSwitches(
+                        MNTopo,
+                        json.loads( devices[ controller ] ) )
                 else:
-                    current_devices_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_devices_result,
-                        onpass="ONOS"+str(int(controller+1))+" Switches view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" Switches view is incorrect")
+                    currentDevicesResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentDevicesResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " Switches view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " Switches view is incorrect" )
 
-                if ports[controller] or not "Error" in ports[controller]:
-                    current_ports_result =  main.Mininet1.compare_ports(MNTopo, json.loads(ports[controller]))
+                if ports[ controller ] or "Error" not in ports[ controller ]:
+                    currentPortsResult = main.Mininet1.comparePorts(
+                        MNTopo,
+                        json.loads( ports[ controller ] ) )
                 else:
-                    current_ports_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_ports_result,
-                        onpass="ONOS"+str(int(controller+1))+" ports view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" ports view is incorrect")
+                    currentPortsResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentPortsResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " ports view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " ports view is incorrect" )
 
-                if links[controller] or not "Error" in links[controller]:
-                    current_links_result =  main.Mininet1.compare_links(MNTopo, json.loads(links[controller]))
+                if links[ controller ] or "Error" not in links[ controller ]:
+                    currentLinksResult = main.Mininet1.compareLinks(
+                        MNTopo,
+                        json.loads( links[ controller ] ) )
                 else:
-                    current_links_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_links_result,
-                        onpass="ONOS"+str(int(controller+1))+" links view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" links view is incorrect")
-            devices_results = devices_results and current_devices_result
-            ports_results = ports_results and current_ports_result
-            links_results = links_results and current_links_result
+                    currentLinksResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentLinksResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " links view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " links view is incorrect" )
 
-            #Compare json objects for hosts, dataplane clusters and paths
+                if hosts[ controller ] or "Error" not in hosts[ controller ]:
+                    currentHostsResult = main.Mininet1.compareHosts(
+                        MNTopo, hosts[ controller ] )
+                else:
+                    currentHostsResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentHostsResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " hosts exist in Mininet",
+                                         onfail="ONOS" + controllerStr +
+                                         " hosts don't match Mininet" )
 
-            #hosts
-            consistent_hosts_result = main.TRUE
+                devicesResults = devicesResults and currentDevicesResult
+                portsResults = portsResults and currentPortsResult
+                linksResults = linksResults and currentLinksResult
+                hostsResults = hostsResults and currentHostsResult
+
+            # Compare json objects for hosts and dataplane clusters
+
+            # hosts
+            consistentHostsResult = main.TRUE
             for controller in range( len( hosts ) ):
-                if not "Error" in hosts[controller]:
-                    if hosts[controller] == hosts[0]:
+                controllerStr = str( controller + 1 )
+                if "Error" not in hosts[ controller ]:
+                    if hosts[ controller ] == hosts[ 0 ]:
                         continue
-                    else:#hosts not consistent
-                        main.log.report("hosts from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                        main.log.warn( repr( hosts[controller] ) )
-                        consistent_hosts_result = main.FALSE
+                    else:  # hosts not consistent
+                        main.log.report( "hosts from ONOS" + controllerStr +
+                                         " is inconsistent with ONOS1" )
+                        main.log.warn( repr( hosts[ controller ] ) )
+                        consistentHostsResult = main.FALSE
 
                 else:
-                    main.log.report("Error in getting ONOS hosts from ONOS" + str(controller + 1) )
-                    consistent_hosts_result = main.FALSE
-            if consistent_hosts_result == main.FALSE:
-                for controller in range( len( hosts ) ):
-                    main.log.warn("ONOS" + str(controller + 1) + " hosts response: " + repr(hosts[controller]) )
-            utilities.assert_equals(expect = main.TRUE,actual=consistent_hosts_result,
-                    onpass="Hosts view is consistent across all ONOS nodes",
-                    onfail="ONOS nodes have different views of hosts")
+                    main.log.report( "Error in getting ONOS hosts from ONOS" +
+                                     controllerStr )
+                    consistentHostsResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
+                                   " hosts response: " +
+                                   repr( hosts[ controller ] ) )
+            utilities.assert_equals(
+                expect=main.TRUE,
+                actual=consistentHostsResult,
+                onpass="Hosts view is consistent across all ONOS nodes",
+                onfail="ONOS nodes have different views of hosts" )
 
-            #Strongly connected clusters of devices
-            consistent_clusters_result = main.TRUE
+            # Strongly connected clusters of devices
+            consistentClustersResult = main.TRUE
             for controller in range( len( clusters ) ):
-                if not "Error" in clusters[controller]:
-                    if clusters[controller] == clusters[0]:
+                controllerStr = str( controller + 1 )
+                if "Error" not in clusters[ controller ]:
+                    if clusters[ controller ] == clusters[ 0 ]:
                         continue
-                    else:#clusters not consistent
-                        main.log.report("clusters from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                        consistent_clusters_result = main.FALSE
+                    else:  # clusters not consistent
+                        main.log.report( "clusters from ONOS" +
+                                         controllerStr +
+                                         " is inconsistent with ONOS1" )
+                        consistentClustersResult = main.FALSE
 
                 else:
-                    main.log.report("Error in getting dataplane clusters from ONOS" + str(controller + 1) )
-                    consistent_clusters_result = main.FALSE
-                    main.log.warn("ONOS" + str(controller + 1) + " clusters response: " + repr(clusters[controller]) )
-            utilities.assert_equals(expect = main.TRUE,actual=consistent_clusters_result,
-                    onpass="Clusters view is consistent across all ONOS nodes",
-                    onfail="ONOS nodes have different views of clusters")
-            num_clusters =  len(json.loads(clusters[0])) #there should always only be one cluster
-            utilities.assert_equals(expect = 1, actual = num_clusters,
-                    onpass="ONOS shows 1 SCC",
-                    onfail="ONOS shows "+str(num_clusters) +" SCCs")
+                    main.log.report( "Error in getting dataplane clusters " +
+                                     "from ONOS" + controllerStr )
+                    consistentClustersResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
+                                   " clusters response: " +
+                                   repr( clusters[ controller ] ) )
+            utilities.assert_equals(
+                expect=main.TRUE,
+                actual=consistentClustersResult,
+                onpass="Clusters view is consistent across all ONOS nodes",
+                onfail="ONOS nodes have different views of clusters" )
+            # there should always only be one cluster
+            numClusters = len( json.loads( clusters[ 0 ] ) )
+            clusterResults = main.FALSE
+            if numClusters == 1:
+                clusterResults = main.TRUE
+            utilities.assert_equals(
+                expect=1,
+                actual=numClusters,
+                onpass="ONOS shows 1 SCC",
+                onfail="ONOS shows " + str( numClusters ) + " SCCs" )
 
+            topoResult = ( devicesResults and portsResults and linksResults
+                           and hostsResults and consistentHostsResult
+                           and consistentClustersResult and clusterResults
+                           and ipResult )
 
-            #paths
-            consistent_paths_result = main.TRUE
-            for controller in range( len( paths ) ):
-                if not "Error" in paths[controller]:
-                    if paths[controller] == paths[0]:
-                        continue
-                    else:#paths not consistent
-                        main.log.report("paths from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                        consistent_paths_result = main.FALSE
+        topoResult = topoResult and int( count <= 2 )
+        note = "note it takes about " + str( int( cliTime ) ) + \
+            " seconds for the test to make all the cli calls to fetch " +\
+            "the topology from each ONOS instance"
+        main.log.info(
+            "Very crass estimate for topology discovery/convergence( " +
+            str( note ) + " ): " + str( elapsed ) + " seconds, " +
+            str( count ) + " tries" )
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                 onpass="Topology Check Test successful",
+                                 onfail="Topology Check Test NOT successful" )
+        if topoResult == main.TRUE:
+            main.log.report( "ONOS topology view matches Mininet topology" )
 
-                else:
-                    main.log.report("Error in getting paths from ONOS" + str(controller + 1) )
-                    consistent_paths_result = main.FALSE
-                    main.log.warn("ONOS" + str(controller + 1) + " paths response: " + repr(paths[controller]) )
-            utilities.assert_equals(expect = main.TRUE,actual=consistent_paths_result,
-                    onpass="Paths count is consistent across all ONOS nodes",
-                    onfail="ONOS nodes have different counts of paths")
-
-
-            topo_result = devices_results and ports_results and links_results\
-                    and consistent_hosts_result and consistent_clusters_result and consistent_paths_result
-
-        topo_result = topo_result and int(count <= 2)
-        note = "note it takes about "+str( int(cli_time) )+" seconds for the test to make all the cli calls to fetch the topology from each ONOS instance"
-        main.log.report("Very crass estimate for topology discovery/convergence("+ str(note) + "): " +\
-                str(elapsed) + " seconds, " + str(count) +" tries" )
-        utilities.assert_equals(expect=main.TRUE, actual=topo_result,
-                onpass="Topology Check Test successful",
-                onfail="Topology Check Test NOT successful")
-        if topo_result == main.TRUE:
-            main.log.report("ONOS topology view matches Mininet topology")
-
-
-    def CASE9 (self,main):
-        '''
+    def CASE9( self, main ):
+        """
         Link s3-s28 down
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        import time
+        # NOTE: You should probably run a topology check after this
 
-        link_sleep = float(main.params['timers']['LinkDiscovery'])
+        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        description = "Turn off a link to ensure that Link Discovery is working properly"
-        main.log.report(description)
-        main.case(description)
+        description = "Turn off a link to ensure that Link Discovery " +\
+                      "is working properly"
+        main.log.report( description )
+        main.case( description )
 
+        main.step( "Kill Link between s3 and s28" )
+        LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
+        main.log.info( "Waiting " + str( linkSleep ) +
+                       " seconds for link down to be discovered" )
+        time.sleep( linkSleep )
+        utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
+                                 onpass="Link down succesful",
+                                 onfail="Failed to bring link down" )
+        # TODO do some sort of check here
 
-        main.step("Kill Link between s3 and s28")
-        Link_Down = main.Mininet1.link(END1="s3",END2="s28",OPTION="down")
-        main.log.info("Waiting " + str(link_sleep) + " seconds for link down to be discovered")
-        time.sleep(link_sleep)
-        utilities.assert_equals(expect=main.TRUE,actual=Link_Down,
-                onpass="Link down succesful",
-                onfail="Failed to bring link down")
-        #TODO do some sort of check here
-
-    def CASE10 (self,main):
-        '''
+    def CASE10( self, main ):
+        """
         Link s3-s28 up
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        import time
+        # NOTE: You should probably run a topology check after this
 
-        link_sleep = float(main.params['timers']['LinkDiscovery'])
+        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        description = "Restore a link to ensure that Link Discovery is working properly"
-        main.log.report(description)
-        main.case(description)
+        description = "Restore a link to ensure that Link Discovery is " + \
+                      "working properly"
+        main.log.report( description )
+        main.case( description )
 
-        main.step("Bring link between s3 and s28 back up")
-        Link_Up = main.Mininet1.link(END1="s3",END2="s28",OPTION="up")
-        main.log.info("Waiting " + str(link_sleep) + " seconds for link up to be discovered")
-        time.sleep(link_sleep)
-        utilities.assert_equals(expect=main.TRUE,actual=Link_Up,
-                onpass="Link up succesful",
-                onfail="Failed to bring link up")
-        #TODO do some sort of check here
+        main.step( "Bring link between s3 and s28 back up" )
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
+        main.log.info( "Waiting " + str( linkSleep ) +
+                       " seconds for link up to be discovered" )
+        time.sleep( linkSleep )
+        utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
+                                 onpass="Link up succesful",
+                                 onfail="Failed to bring link up" )
+        # TODO do some sort of check here
 
-
-    def CASE11 (self, main) :
-        '''
+    def CASE11( self, main ):
+        """
         Switch Down
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        # NOTE: You should probably run a topology check after this
         import time
 
-        switch_sleep = float(main.params['timers']['SwitchDiscovery'])
+        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
 
         description = "Killing a switch to ensure it is discovered correctly"
-        main.log.report(description)
-        main.case(description)
+        main.log.report( description )
+        main.case( description )
+        switch = main.params[ 'kill' ][ 'switch' ]
+        switchDPID = main.params[ 'kill' ][ 'dpid' ]
 
-        #TODO: Make this switch parameterizable
-        main.step("Kill s28 ")
-        main.log.report("Deleting s28")
-        main.Mininet1.del_switch("s28")
-        main.log.info("Waiting " + str(switch_sleep) + " seconds for switch down to be discovered")
-        time.sleep(switch_sleep)
-        device = main.ONOScli1.get_device(dpid="0028")
-        #Peek at the deleted switch
-        main.log.warn( str(device) )
+        # TODO: Make this switch parameterizable
+        main.step( "Kill " + switch )
+        main.log.report( "Deleting " + switch )
+        main.Mininet1.delSwitch( switch )
+        main.log.info( "Waiting " + str( switchSleep ) +
+                       " seconds for switch down to be discovered" )
+        time.sleep( switchSleep )
+        device = main.ONOScli1.getDevice( dpid=switchDPID )
+        # Peek at the deleted switch
+        main.log.warn( str( device ) )
         result = main.FALSE
-        if device and device['available'] == False:
+        if device and device[ 'available' ] is False:
             result = main.TRUE
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="Kill switch succesful",
-                onfail="Failed to kill switch?")
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="Kill switch succesful",
+                                 onfail="Failed to kill switch?" )
 
-    def CASE12 (self, main) :
-        '''
+    def CASE12( self, main ):
+        """
         Switch Up
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        # NOTE: You should probably run a topology check after this
         import time
 
-        switch_sleep = float(main.params['timers']['SwitchDiscovery'])
+        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
+        switch = main.params[ 'kill' ][ 'switch' ]
+        switchDPID = main.params[ 'kill' ][ 'dpid' ]
+        links = main.params[ 'kill' ][ 'links' ].split()
         description = "Adding a switch to ensure it is discovered correctly"
-        main.log.report(description)
-        main.case(description)
+        main.log.report( description )
+        main.case( description )
 
-        main.step("Add back s28")
-        main.log.report("Adding back s28")
-        main.Mininet1.add_switch("s28", dpid = '0000000000002800')
-        #TODO: New dpid or same? Ask Thomas?
-        main.Mininet1.add_link('s28', 's3')
-        main.Mininet1.add_link('s28', 's6')
-        main.Mininet1.add_link('s28', 'h28')
-        main.Mininet1.assign_sw_controller(sw="28",count=num_controllers,
-                ip1=ONOS1_ip,port1=ONOS1_port,
-                ip2=ONOS2_ip,port2=ONOS2_port,
-                ip3=ONOS3_ip,port3=ONOS3_port,
-                ip4=ONOS4_ip,port4=ONOS4_port,
-                ip5=ONOS5_ip,port5=ONOS5_port,
-                ip6=ONOS6_ip,port6=ONOS6_port,
-                ip7=ONOS7_ip,port7=ONOS7_port)
-        main.log.info("Waiting " + str(switch_sleep) + " seconds for switch up to be discovered")
-        time.sleep(switch_sleep)
-        device = main.ONOScli1.get_device(dpid="0028")
-        #Peek at the deleted switch
-        main.log.warn( str(device) )
+        main.step( "Add back " + switch )
+        main.log.report( "Adding back " + switch )
+        main.Mininet1.addSwitch( switch, dpid=switchDPID )
+        # TODO: New dpid or same? Ask Thomas?
+        for peer in links:
+            main.Mininet1.addLink( switch, peer )
+        main.Mininet1.assignSwController( sw=switch.split( 's' )[ 1 ],
+                                          count=numControllers,
+                                          ip1=ONOS1Ip,
+                                          port1=ONOS1Port,
+                                          ip2=ONOS2Ip,
+                                          port2=ONOS2Port,
+                                          ip3=ONOS3Ip,
+                                          port3=ONOS3Port,
+                                          ip4=ONOS4Ip,
+                                          port4=ONOS4Port,
+                                          ip5=ONOS5Ip,
+                                          port5=ONOS5Port,
+                                          ip6=ONOS6Ip,
+                                          port6=ONOS6Port,
+                                          ip7=ONOS7Ip,
+                                          port7=ONOS7Port )
+        main.log.info( "Waiting " + str( switchSleep ) +
+                       " seconds for switch up to be discovered" )
+        time.sleep( switchSleep )
+        device = main.ONOScli1.getDevice( dpid=switchDPID )
+        # Peek at the deleted switch
+        main.log.warn( str( device ) )
         result = main.FALSE
-        if device and device['available'] == True:
+        if device and device[ 'available' ]:
             result = main.TRUE
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="add switch succesful",
-                onfail="Failed to add switch?")
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="add switch succesful",
+                                 onfail="Failed to add switch?" )
 
-    def CASE13 (self, main) :
-        '''
+    def CASE13( self, main ):
+        """
         Clean up
-        '''
+        """
         import os
         import time
-        #printing colors to terminal
+        # TODO: make use of this elsewhere
+        ips = []
+        ips.append( ONOS1Ip )
+        ips.append( ONOS2Ip )
+        ips.append( ONOS3Ip )
+        ips.append( ONOS4Ip )
+        ips.append( ONOS5Ip )
+        ips.append( ONOS6Ip )
+        ips.append( ONOS7Ip )
+
+        # printing colors to terminal
         colors = {}
-        colors['cyan']   = '\033[96m'
-        colors['purple'] = '\033[95m'
-        colors['blue']   = '\033[94m'
-        colors['green']  = '\033[92m'
-        colors['yellow'] = '\033[93m'
-        colors['red']    = '\033[91m'
-        colors['end']    = '\033[0m'
+        colors[ 'cyan' ] = '\033[96m'
+        colors[ 'purple' ] = '\033[95m'
+        colors[ 'blue' ] = '\033[94m'
+        colors[ 'green' ] = '\033[92m'
+        colors[ 'yellow' ] = '\033[93m'
+        colors[ 'red' ] = '\033[91m'
+        colors[ 'end' ] = '\033[0m'
         description = "Test Cleanup"
-        main.log.report(description)
-        main.case(description)
-        main.step("Killing tcpdumps")
-        main.Mininet2.stop_tcpdump()
+        main.log.report( description )
+        main.case( description )
+        main.step( "Killing tcpdumps" )
+        main.Mininet2.stopTcpdump()
 
-        main.step("Checking ONOS Logs for errors")
-        print colors['purple'] + "Checking logs for errors on ONOS1:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS1_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS2:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS2_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS3:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS3_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS4:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS4_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS5:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS5_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS6:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS6_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS7:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS7_ip)
+        main.step( "Checking ONOS Logs for errors" )
+        for i in range( 7 ):
+            print colors[ 'purple' ] + "Checking logs for errors on " + \
+                "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
+            print main.ONOSbench.checkLogs( ips[ i ] )
 
-        main.step("Copying MN pcap and ONOS log files to test station")
+        main.step( "Copying MN pcap and ONOS log files to test station" )
         testname = main.TEST
-        teststation_user = main.params['TESTONUSER']
-        teststation_IP = main.params['TESTONIP']
-        #NOTE: MN Pcap file is being saved to ~/packet_captures
+        teststationUser = main.params[ 'TESTONUSER' ]
+        teststationIP = main.params[ 'TESTONIP' ]
+        # NOTE: MN Pcap file is being saved to ~/packet_captures
         #       scp this file as MN and TestON aren't necessarily the same vm
-        #FIXME: scp
-        #####mn files
-        #TODO: Load these from params
-        #NOTE: must end in /
-        log_folder = "/opt/onos/log/"
-        log_files = ["karaf.log", "karaf.log.1"]
-        #NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS1_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS1-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS2_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS2-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS3_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS3-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS4_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS4-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS5_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS5-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS6_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS6-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS7_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS7-"+f )
+        # FIXME: scp
+        # mn files
+        # TODO: Load these from params
+        # NOTE: must end in /
+        logFolder = "/opt/onos/log/"
+        logFiles = [ "karaf.log", "karaf.log.1" ]
+        # NOTE: must end in /
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            for i in range( 7 ):
+                main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
+                                                logFolder + f + " " +
+                                                teststationUser + "@" +
+                                                teststationIP + ":" +
+                                                dstDir + str( testname ) +
+                                                "-ONOS" + str( i + 1 ) + "-" +
+                                                f )
+                main.ONOSbench.handle.expect( "\$" )
 
-        #std*.log's
-        #NOTE: must end in /
-        log_folder = "/opt/onos/var/"
-        log_files = ["stderr.log", "stdout.log"]
-        #NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS1_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS1-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS2_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS2-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS3_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS3-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS4_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS4-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS5_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS5-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS6_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS6-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS7_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS7-"+f )
+        # std*.log's
+        # NOTE: must end in /
+        logFolder = "/opt/onos/var/"
+        logFiles = [ "stderr.log", "stdout.log" ]
+        # NOTE: must end in /
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            for i in range( 7 ):
+                main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
+                                                logFolder + f + " " +
+                                                teststationUser + "@" +
+                                                teststationIP + ":" +
+                                                dstDir + str( testname ) +
+                                                "-ONOS" + str( i + 1 ) + "-" +
+                                                f )
+                main.ONOSbench.handle.expect( "\$" )
+        # sleep so scp can finish
+        time.sleep( 10 )
+        main.Mininet1.stopNet()
+        main.step( "Packing and rotating pcap archives" )
+        os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
 
+        # TODO: actually check something here
+        utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
+                                 onpass="Test cleanup successful",
+                                 onfail="Test cleanup NOT successful" )
 
-        #sleep so scp can finish
-        time.sleep(10)
-        main.step("Packing and rotating pcap archives")
-        os.system("~/TestON/dependencies/rotate.sh "+ str(testname))
-
-
-        #TODO: actually check something here
-        utilities.assert_equals(expect=main.TRUE, actual=main.TRUE,
-                onpass="Test cleanup successful",
-                onfail="Test cleanup NOT successful")
-
-    def CASE14 ( self, main ) :
-        '''
+    def CASE14( self, main ):
+        """
         start election app on all onos nodes
-        '''
-        leader_result = main.TRUE
-        #install app on onos 1
-        main.log.info("Install leadership election app")
-        main.ONOScli1.feature_install("onos-app-election")
-        #wait for election
-        #check for leader
-        leader = main.ONOScli1.election_test_leader()
-        #verify leader is ONOS1
-        if leader == ONOS1_ip:
-            #all is well
+        """
+        leaderResult = main.TRUE
+        # install app on onos 1
+        main.log.info( "Install leadership election app" )
+        main.ONOScli1.featureInstall( "onos-app-election" )
+        # wait for election
+        # check for leader
+        leader = main.ONOScli1.electionTestLeader()
+        # verify leader is ONOS1
+        if leader == ONOS1Ip:
+            # all is well
             pass
-        elif leader == None:
-            #No leader elected
-            main.log.report("No leader was elected")
-            leader_result = main.FALSE
+        elif leader is None:
+            # No leader elected
+            main.log.report( "No leader was elected" )
+            leaderResult = main.FALSE
         elif leader == main.FALSE:
-            #error in  response
-            #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-            main.log.report("Something is wrong with election_test_leader function, check the error logs")
-            leader_result = main.FALSE
+            # error in  response
+            # TODO: add check for "Command not found:" in the driver, this
+            # means the app isn't loaded
+            main.log.report( "Something is wrong with electionTestLeader" +
+                             " function, check the error logs" )
+            leaderResult = main.FALSE
         else:
-            #error in  response
-            main.log.report("Unexpected response from election_test_leader function:'"+str(leader)+"'")
-            leader_result = main.FALSE
+            # error in  response
+            main.log.report(
+                "Unexpected response from electionTestLeader function:'" +
+                str( leader ) +
+                "'" )
+            leaderResult = main.FALSE
 
-
-
-
-        #install on other nodes and check for leader.
-        #Should be onos1 and each app should show the same leader
-        for controller in range(2,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            node.feature_install("onos-app-election")
-            leaderN = node.election_test_leader()
-            #verify leader is ONOS1
-            if leaderN == ONOS1_ip:
-                #all is well
+        # install on other nodes and check for leader.
+        # Should be onos1 and each app should show the same leader
+        for controller in range( 2, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            node.featureInstall( "onos-app-election" )
+            leaderN = node.electionTestLeader()
+            # verify leader is ONOS1
+            if leaderN == ONOS1Ip:
+                # all is well
                 pass
             elif leaderN == main.FALSE:
-                #error in  response
-                #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
+                # error in  response
+                # TODO: add check for "Command not found:" in the driver, this
+                # means the app isn't loaded
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, check the" +
+                                 " error logs" )
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
-                main.log.report("ONOS" + str(controller) + " sees "+str(leaderN) +
-                        " as the leader of the election app. Leader should be "+str(leader) )
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a leader was elected)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+                leaderResult = main.FALSE
+                main.log.report( "ONOS" + str( controller ) + " sees " +
+                                 str( leaderN ) +
+                                 " as the leader of the election app. Leader" +
+                                 " should be " +
+                                 str( leader ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a leader " +
+                             "was elected )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-    def CASE15 ( self, main ) :
-        '''
+    def CASE15( self, main ):
+        """
         Check that Leadership Election is still functional
-        '''
-        leader_result = main.TRUE
+        """
+        leaderResult = main.TRUE
         description = "Check that Leadership Election is still functional"
-        main.log.report(description)
-        main.case(description)
-        main.step("Find current leader and withdraw")
-        leader = main.ONOScli1.election_test_leader()
-        #TODO: do some sanity checking on leader before using it
-        withdraw_result = main.FALSE
-        if leader == ONOS1_ip:
-            old_leader = getattr( main, "ONOScli1" )
-        elif leader == ONOS2_ip:
-            old_leader = getattr( main, "ONOScli2" )
-        elif leader == ONOS3_ip:
-            old_leader = getattr( main, "ONOScli3" )
-        elif leader == ONOS4_ip:
-            old_leader = getattr( main, "ONOScli4" )
-        elif leader == ONOS5_ip:
-            old_leader = getattr( main, "ONOScli5" )
-        elif leader == ONOS6_ip:
-            old_leader = getattr( main, "ONOScli6" )
-        elif leader == ONOS7_ip:
-            old_leader = getattr( main, "ONOScli7" )
-        elif leader == None or leader == main.FALSE:
-            main.log.report("Leader for the election app should be an ONOS node,"\
-                    +"instead got '"+str(leader)+"'")
-            leader_result = main.FALSE
-        withdraw_result = old_leader.election_test_withdraw()
-
-
-        main.step("Make sure new leader is elected")
-        leader_list = []
-        for controller in range(1,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            leader_list.append( node.election_test_leader() )
-        for leaderN in leader_list:
-            if leaderN == leader:
-                main.log.report("ONOS"+str(controller)+" still sees " + str(leader) +\
-                        " as leader after they withdrew")
-                leader_result = main.FALSE
-            elif leaderN == main.FALSE:
-                #error in  response
-                #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
-        consistent_leader = main.FALSE
-        if len( set( leader_list ) ) == 1:
-            main.log.info("Each Election-app sees '"+str(leader_list[0])+"' as the leader")
-            consistent_leader = main.TRUE
+        main.log.report( description )
+        main.case( description )
+        main.step( "Find current leader and withdraw" )
+        leader = main.ONOScli1.electionTestLeader()
+        # TODO: do some sanity checking on leader before using it
+        withdrawResult = main.FALSE
+        if leader == ONOS1Ip:
+            oldLeader = getattr( main, "ONOScli1" )
+        elif leader == ONOS2Ip:
+            oldLeader = getattr( main, "ONOScli2" )
+        elif leader == ONOS3Ip:
+            oldLeader = getattr( main, "ONOScli3" )
+        elif leader == ONOS4Ip:
+            oldLeader = getattr( main, "ONOScli4" )
+        elif leader == ONOS5Ip:
+            oldLeader = getattr( main, "ONOScli5" )
+        elif leader == ONOS6Ip:
+            oldLeader = getattr( main, "ONOScli6" )
+        elif leader == ONOS7Ip:
+            oldLeader = getattr( main, "ONOScli7" )
+        elif leader is None or leader == main.FALSE:
+            main.log.report(
+                "Leader for the election app should be an ONOS node," +
+                "instead got '" + str( leader ) + "'" )
+            leaderResult = main.FALSE
+            oldLeader = None
         else:
-            main.log.report("Inconsistent responses for leader of Election-app:")
-            for n in range(len(leader_list)):
-                main.log.report("ONOS" + str(n+1) + " response: " + str(leader_list[n]) )
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a new leader was elected when the old leader resigned)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+            main.log.error( "Leader election --- why am I HERE?!?")
+        if oldLeader:
+            withdrawResult = oldLeader.electionTestWithdraw()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=withdrawResult,
+            onpass="App was withdrawn from election",
+            onfail="App was not withdrawn from election" )
 
+        main.step( "Make sure new leader is elected" )
+        leaderList = []
+        for controller in range( 1, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            leaderList.append( node.electionTestLeader() )
+        for leaderN in leaderList:
+            if leaderN == leader:
+                main.log.report(
+                    "ONOS" + str( controller ) +
+                    " still sees " + str( leader ) +
+                    " as leader after they withdrew" )
+                leaderResult = main.FALSE
+            elif leaderN == main.FALSE:
+                # error in  response
+                # TODO: add check for "Command not found:" in the driver, this
+                # means the app isn't loaded
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, " +
+                                 "check the error logs" )
+                leaderResult = main.FALSE
+        consistentLeader = main.FALSE
+        if len( set( leaderList ) ) == 1:
+            main.log.info( "Each Election-app sees '" +
+                           str( leaderList[ 0 ] ) +
+                           "' as the leader" )
+            consistentLeader = main.TRUE
+        else:
+            main.log.report(
+                "Inconsistent responses for leader of Election-app:" )
+            for n in range( len( leaderList ) ):
+                main.log.report( "ONOS" + str( n + 1 ) + " response: " +
+                                 str( leaderList[ n ] ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a new " +
+                             "leader was elected when the old leader " +
+                             "resigned )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-        main.step("Run for election on old leader(just so everyone is in the hat)")
-        run_result = old_leader.election_test_run()
-        if consistent_leader == main.TRUE:
-            after_run = main.ONOScli1.election_test_leader()
-            #verify leader didn't just change
-            if after_run == leader_list[0]:
-                leader_result = main.TRUE
+        main.step( "Run for election on old leader( just so everyone " +
+                   "is in the hat )" )
+        if oldLeader:
+            runResult = oldLeader.electionTestRun()
+        else:
+            runResult = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=runResult,
+            onpass="App re-ran for election",
+            onfail="App failed to run for election" )
+        if consistentLeader == main.TRUE:
+            afterRun = main.ONOScli1.electionTestLeader()
+            # verify leader didn't just change
+            if afterRun == leaderList[ 0 ]:
+                leaderResult = main.TRUE
             else:
-                leader_result = main.FALSE
-        #TODO: assert on  run and withdraw results?
+                leaderResult = main.FALSE
+        # TODO: assert on  run and withdraw results?
 
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election after the old leader re-ran for election")
-
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election after " +
+                   "the old leader re-ran for election" )
diff --git a/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.topo b/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.topo
index 4d4156c..9305025 100644
--- a/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.topo
+++ b/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.topo
@@ -151,7 +151,7 @@
                 <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
                 <arg2> --topo mytopo </arg2>
                 <arg3> </arg3>
-                <controller> remote </controller>
+                <controller> none </controller>
             </COMPONENTS>
         </Mininet1>
 
@@ -162,11 +162,7 @@
             <type>RemoteMininetDriver</type>
             <connect_order>17</connect_order>
             <COMPONENTS>
-                # Specify the Option for mininet
-                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
-                <arg2> --topo mytopo --arp</arg2>
-                <controller> remote </controller>
-             </COMPONENTS>
+            </COMPONENTS>
         </Mininet2>
 
     </COMPONENT>
diff --git a/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.params b/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.params
new file mode 100644
index 0000000..e1421cd
--- /dev/null
+++ b/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.params
@@ -0,0 +1,89 @@
+<PARAMS>
+
+#List of test cases:
+#CASE1: Compile ONOS and push it to the test machines
+#CASE2: Assign mastership to controllers
+#CASE3: Assign intents
+#CASE4: Ping across added host intents
+#CASE5: Reading state of ONOS
+#CASE6: The Failure case. We will create IPTables rules here.
+#CASE7: Check state after control plane partition.
+#CASE8: Compare topo
+#CASE9: Link s3-s28 down
+#CASE10: Link s3-s28 up
+#CASE11: Switch down
+#CASE12: Switch up
+#CASE13: Clean up
+#CASE14: start election app on all onos nodes
+#CASE15: Check that Leadership Election is still functional
+#CASE16: Repair network partition
+              #1,2,8,3,4,5,14,[6],8,7,4,15,9,8,4,10,8,4,11,8,4,12,8,4,13
+    <testcases>1,2,5,14,[6],8,7,4,15,9,8,4,10,8,4,11,8,4,12,8,4,16,13</testcases>
+    <ENV>
+        <cellName>HA</cellName>
+    </ENV>
+    <Git> False </Git>
+    <branch> master </branch>
+    <num_controllers> 7 </num_controllers>
+
+    <CTRL>
+        <ip1>10.128.30.11</ip1>
+        <port1>6633</port1>
+
+        <ip2>10.128.30.12</ip2>
+        <port2>6633</port2>
+
+        <ip3>10.128.30.13</ip3>
+        <port3>6633</port3>
+
+        <ip4>10.128.30.14</ip4>
+        <port4>6633</port4>
+
+        <ip5>10.128.30.15</ip5>
+        <port5>6633</port5>
+
+        <ip6>10.128.30.16</ip6>
+        <port6>6633</port6>
+
+        <ip7>10.128.30.17</ip7>
+        <port7>6633</port7>
+    </CTRL>
+    <TESTONUSER>admin</TESTONUSER>
+    <TESTONIP>10.128.30.9</TESTONIP>
+    <PING>
+        <source1>h8</source1>
+        <source2>h9</source2>
+        <source3>h10</source3>
+        <source4>h11</source4>
+        <source5>h12</source5>
+        <source6>h13</source6>
+        <source7>h14</source7>
+        <source8>h15</source8>
+        <source9>h16</source9>
+        <source10>h17</source10>
+        <target1>10.0.0.18</target1>
+        <target2>10.0.0.19</target2>
+        <target3>10.0.0.20</target3>
+        <target4>10.0.0.21</target4>
+        <target5>10.0.0.22</target5>
+        <target6>10.0.0.23</target6>
+        <target7>10.0.0.24</target7>
+        <target8>10.0.0.25</target8>
+        <target9>10.0.0.26</target9>
+        <target10>10.0.0.27</target10>
+    </PING>
+    <timers>
+        <LinkDiscovery>.2</LinkDiscovery>
+        <SwitchDiscovery>.2</SwitchDiscovery>
+    </timers>
+    <kill>
+        <switch> s5 </switch>
+        <dpid> 0000000000005000 </dpid>
+        <links> h5 s2 s1 s6 </links>
+    </kill>
+    <MNtcpdump>
+        <intf>eth0</intf>
+        <port> </port>
+        <folder>~/packet_captures/</folder>
+    </MNtcpdump>
+</PARAMS>
diff --git a/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.py b/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.py
new file mode 100644
index 0000000..99eb9e5
--- /dev/null
+++ b/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.py
@@ -0,0 +1,1989 @@
+"""
+Description: This test is to determine how ONOS behaves in a control network
+             partion. ONOS 1,2,3 will be split into a sub cluster and ONOS
+             4,5,6,7 will be in another sub-cluster.
+
+List of test cases:
+CASE1: Compile ONOS and push it to the test machines
+CASE2: Assign mastership to controllers
+CASE3: Assign intents
+CASE4: Ping across added host intents
+CASE5: Reading state of ONOS
+CASE6: The Failure case. We will create IPTables rules here.
+CASE7: Check state after control plane partition.
+CASE8: Compare topo
+CASE9: Link s3-s28 down
+CASE10: Link s3-s28 up
+CASE11: Switch down
+CASE12: Switch up
+CASE13: Clean up
+CASE14: start election app on all onos nodes
+CASE15: Check that Leadership Election is still functional
+CASE16: Repair network partition
+"""
+# FIXME: Add new comparison case for during the failure?
+class HATestNetworkPartition:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        """
+        CASE1 is to compile ONOS and push it to the test machines
+
+        Startup sequence:
+        cell <name>
+        onos-verify-cell
+        NOTE: temporary - onos-remove-raft-logs
+        onos-uninstall
+        start mininet
+        git pull
+        mvn clean install
+        onos-package
+        onos-install -f
+        onos-wait-for-start
+        start cli sessions
+        start tcpdump
+        """
+        main.log.report( "ONOS HA test: Network partition - initialization" )
+        main.log.report( "This test will partition a 7 node cluster into " +
+                         "3 node and 4 node sub clusters by blocking " +
+                         "communication between nodes." )
+        main.case( "Setting up test environment" )
+        # TODO: save all the timers and output them for plotting
+
+        # load some vairables from the params file
+        PULLCODE = False
+        if main.params[ 'Git' ] == 'True':
+            PULLCODE = True
+        gitBranch = main.params[ 'branch' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+
+        # set global variables
+        global ONOS1Ip
+        global ONOS1Port
+        global ONOS2Ip
+        global ONOS2Port
+        global ONOS3Ip
+        global ONOS3Port
+        global ONOS4Ip
+        global ONOS4Port
+        global ONOS5Ip
+        global ONOS5Port
+        global ONOS6Ip
+        global ONOS6Port
+        global ONOS7Ip
+        global ONOS7Port
+        global numControllers
+
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
+        ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
+        ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
+        ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
+        ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
+        ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
+        numControllers = int( main.params[ 'num_controllers' ] )
+
+        main.step( "Applying cell variable to environment" )
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
+
+        # FIXME:this is short term fix
+        main.log.report( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftLogs()
+        main.log.report( "Uninstalling ONOS" )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+        main.ONOSbench.onosUninstall( ONOS2Ip )
+        main.ONOSbench.onosUninstall( ONOS3Ip )
+        main.ONOSbench.onosUninstall( ONOS4Ip )
+        main.ONOSbench.onosUninstall( ONOS5Ip )
+        main.ONOSbench.onosUninstall( ONOS6Ip )
+        main.ONOSbench.onosUninstall( ONOS7Ip )
+
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
+
+        main.step( "Starting Mininet" )
+        main.Mininet1.startNet( )
+
+        main.step( "Compiling the latest version of ONOS" )
+        if PULLCODE:
+            main.step( "Git checkout and pull " + gitBranch )
+            main.ONOSbench.gitCheckout( gitBranch )
+            gitPullResult = main.ONOSbench.gitPull()
+
+            main.step( "Using mvn clean & install" )
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+
+        main.step( "Installing ONOS package" )
+        onos1InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS1Ip )
+        onos2InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS2Ip )
+        onos3InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS3Ip )
+        onos4InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS4Ip )
+        onos5InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS5Ip )
+        onos6InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS6Ip )
+        onos7InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS7Ip )
+        onosInstallResult = onos1InstallResult and onos2InstallResult\
+            and onos3InstallResult and onos4InstallResult\
+            and onos5InstallResult and onos6InstallResult\
+            and onos7InstallResult
+
+        main.step( "Checking if ONOS is up yet" )
+        for i in range( 2 ):
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            if not onos1Isup:
+                main.log.report( "ONOS1 didn't start!" )
+                main.ONOSbench.onosStop( ONOS1Ip )
+                main.ONOSbench.onosStart( ONOS1Ip )
+            onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+            if not onos2Isup:
+                main.log.report( "ONOS2 didn't start!" )
+                main.ONOSbench.onosStop( ONOS2Ip )
+                main.ONOSbench.onosStart( ONOS2Ip )
+            onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+            if not onos3Isup:
+                main.log.report( "ONOS3 didn't start!" )
+                main.ONOSbench.onosStop( ONOS3Ip )
+                main.ONOSbench.onosStart( ONOS3Ip )
+            onos4Isup = main.ONOSbench.isup( ONOS4Ip )
+            if not onos4Isup:
+                main.log.report( "ONOS4 didn't start!" )
+                main.ONOSbench.onosStop( ONOS4Ip )
+                main.ONOSbench.onosStart( ONOS4Ip )
+            onos5Isup = main.ONOSbench.isup( ONOS5Ip )
+            if not onos5Isup:
+                main.log.report( "ONOS5 didn't start!" )
+                main.ONOSbench.onosStop( ONOS5Ip )
+                main.ONOSbench.onosStart( ONOS5Ip )
+            onos6Isup = main.ONOSbench.isup( ONOS6Ip )
+            if not onos6Isup:
+                main.log.report( "ONOS6 didn't start!" )
+                main.ONOSbench.onosStop( ONOS6Ip )
+                main.ONOSbench.onosStart( ONOS6Ip )
+            onos7Isup = main.ONOSbench.isup( ONOS7Ip )
+            if not onos7Isup:
+                main.log.report( "ONOS7 didn't start!" )
+                main.ONOSbench.onosStop( ONOS7Ip )
+                main.ONOSbench.onosStart( ONOS7Ip )
+            onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
+                and onos4Isup and onos5Isup and onos6Isup and onos7Isup
+            if onosIsupResult == main.TRUE:
+                break
+
+        cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
+        cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
+        cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
+        cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
+        cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
+        cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
+        cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
+        cliResults = cliResult1 and cliResult2 and cliResult3 and\
+            cliResult4 and cliResult5 and cliResult6 and cliResult7
+
+        main.step( "Start Packet Capture MN" )
+        main.Mininet2.startTcpdump(
+            str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
+            + "-MN.pcap",
+            intf=main.params[ 'MNtcpdump' ][ 'intf' ],
+            port=main.params[ 'MNtcpdump' ][ 'port' ] )
+
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and onosInstallResult
+                        and onosIsupResult and cliResults )
+
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+                                 onpass="Test startup successful",
+                                 onfail="Test startup NOT successful" )
+
+        if case1Result == main.FALSE:
+            main.cleanup()
+            main.exit()
+
+    def CASE2( self, main ):
+        """
+        Assign mastership to controllers
+        """
+        import re
+
+        main.log.report( "Assigning switches to controllers" )
+        main.case( "Assigning Controllers" )
+        main.step( "Assign switches to controllers" )
+
+        for i in range( 1, 29 ):
+            main.Mininet1.assignSwController(
+                sw=str( i ),
+                count=numControllers,
+                ip1=ONOS1Ip, port1=ONOS1Port,
+                ip2=ONOS2Ip, port2=ONOS2Port,
+                ip3=ONOS3Ip, port3=ONOS3Port,
+                ip4=ONOS4Ip, port4=ONOS4Port,
+                ip5=ONOS5Ip, port5=ONOS5Port,
+                ip6=ONOS6Ip, port6=ONOS6Port,
+                ip7=ONOS7Ip, port7=ONOS7Port )
+
+        mastershipCheck = main.TRUE
+        for i in range( 1, 29 ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
+            try:
+                main.log.info( str( response ) )
+            except:
+                main.log.info( repr( response ) )
+            if re.search( "tcp:" + ONOS1Ip, response )\
+                    and re.search( "tcp:" + ONOS2Ip, response )\
+                    and re.search( "tcp:" + ONOS3Ip, response )\
+                    and re.search( "tcp:" + ONOS4Ip, response )\
+                    and re.search( "tcp:" + ONOS5Ip, response )\
+                    and re.search( "tcp:" + ONOS6Ip, response )\
+                    and re.search( "tcp:" + ONOS7Ip, response ):
+                mastershipCheck = mastershipCheck and main.TRUE
+            else:
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
+            main.log.report( "Switch mastership assigned correctly" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=mastershipCheck,
+            onpass="Switch mastership assigned correctly",
+            onfail="Switches not assigned correctly to controllers" )
+
+        # Manually assign mastership to the controller we want
+        roleCall = main.TRUE
+        roleCheck = main.TRUE
+
+        # Assign switch
+        deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS1Ip )
+        # Check assignment
+        if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
+        else:
+            roleCheck = roleCheck and main.FALSE
+
+        # Assign switch
+        deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS1Ip )
+        # Check assignment
+        if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
+        else:
+            roleCheck = roleCheck and main.FALSE
+
+        # Assign switch
+        deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS2Ip )
+        # Check assignment
+        if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
+        else:
+            roleCheck = roleCheck and main.FALSE
+
+        # Assign switch
+        deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS2Ip )
+        # Check assignment
+        if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
+        else:
+            roleCheck = roleCheck and main.FALSE
+
+        # Assign switch
+        deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS3Ip )
+        # Check assignment
+        if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
+        else:
+            roleCheck = roleCheck and main.FALSE
+
+        # Assign switch
+        deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS3Ip )
+        # Check assignment
+        if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
+        else:
+            roleCheck = roleCheck and main.FALSE
+
+        # Assign switch
+        deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS4Ip )
+        # Check assignment
+        if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
+        else:
+            roleCheck = roleCheck and main.FALSE
+
+        for i in range( 8, 18 ):
+            dpid = '3' + str( i ).zfill( 3 )
+            deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS5Ip )
+            # Check assignment
+            if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
+
+        deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS6Ip )
+        # Check assignment
+        if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
+        else:
+            roleCheck = roleCheck and main.FALSE
+
+        for i in range( 18, 28 ):
+            dpid = '6' + str( i ).zfill( 3 )
+            deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS7Ip )
+            # Check assignment
+            if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
+
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=roleCall,
+            onpass="Re-assigned switch mastership to designated controller",
+            onfail="Something wrong with deviceRole calls" )
+
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=roleCheck,
+            onpass="Switches were successfully reassigned to designated " +
+                   "controller",
+            onfail="Switches were not successfully reassigned" )
+        mastershipCheck = mastershipCheck and roleCall and roleCheck
+        utilities.assert_equals( expect=main.TRUE, actual=mastershipCheck,
+                                 onpass="Switch mastership correctly assigned",
+                                 onfail="Error in (re)assigning switch" +
+                                 " mastership" )
+
+    def CASE3( self, main ):
+        """
+        Assign intents
+        """
+        import time
+        import json
+        main.log.report( "Adding host intents" )
+        main.case( "Adding host Intents" )
+
+        main.step( "Discovering  Hosts( Via pingall for now )" )
+        # FIXME: Once we have a host discovery mechanism, use that instead
+
+        # install onos-app-fwd
+        main.log.info( "Install reactive forwarding app" )
+        main.ONOScli1.featureInstall( "onos-app-fwd" )
+        main.ONOScli2.featureInstall( "onos-app-fwd" )
+        main.ONOScli3.featureInstall( "onos-app-fwd" )
+        main.ONOScli4.featureInstall( "onos-app-fwd" )
+        main.ONOScli5.featureInstall( "onos-app-fwd" )
+        main.ONOScli6.featureInstall( "onos-app-fwd" )
+        main.ONOScli7.featureInstall( "onos-app-fwd" )
+
+        # REACTIVE FWD test
+        pingResult = main.FALSE
+        time1 = time.time()
+        pingResult = main.Mininet1.pingall()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=pingResult,
+            onpass="Reactive Pingall test passed",
+            onfail="Reactive Pingall failed, one or more ping pairs failed" )
+        time2 = time.time()
+        main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
+
+        # uninstall onos-app-fwd
+        main.log.info( "Uninstall reactive forwarding app" )
+        main.ONOScli1.featureUninstall( "onos-app-fwd" )
+        main.ONOScli2.featureUninstall( "onos-app-fwd" )
+        main.ONOScli3.featureUninstall( "onos-app-fwd" )
+        main.ONOScli4.featureUninstall( "onos-app-fwd" )
+        main.ONOScli5.featureUninstall( "onos-app-fwd" )
+        main.ONOScli6.featureUninstall( "onos-app-fwd" )
+        main.ONOScli7.featureUninstall( "onos-app-fwd" )
+        # timeout for fwd flows
+        time.sleep( 10 )
+
+        main.step( "Add host intents" )
+        # TODO:  move the host numbers to params
+        #        Maybe look at all the paths we ping?
+        intentAddResult = True
+        for i in range( 8, 18 ):
+            main.log.info( "Adding host intent between h" + str( i ) +
+                           " and h" + str( i + 10 ) )
+            host1 = "00:00:00:00:00:" + \
+                str( hex( i )[ 2: ] ).zfill( 2 ).upper()
+            host2 = "00:00:00:00:00:" + \
+                str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
+            # NOTE: getHost can return None
+            host1Dict = main.ONOScli1.getHost( host1 )
+            host2Dict = main.ONOScli1.getHost( host2 )
+            host1Id = None
+            host2Id = None
+            if host1Dict and host2Dict:
+                host1Id = host1Dict.get( 'id', None )
+                host2Id = host2Dict.get( 'id', None )
+            if host1Id and host2Id:
+                # distribute the intents across ONOS nodes
+                nodeNum = ( i % 7 ) + 1
+                node = getattr( main, ( 'ONOScli' + str( nodeNum ) ) )
+                tmpResult = node.addHostIntent(
+                    host1Id,
+                    host2Id )
+            else:
+                main.log.error( "Error, getHost() failed" )
+                main.log.warn( json.dumps( json.loads( main.ONOScli1.hosts() ),
+                                           sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                tmpResult = main.FALSE
+            intentAddResult = bool( pingResult and intentAddResult
+                                     and tmpResult )
+            # FIXME Check that intents were added?
+            # TODO Use the new return from add host command and look at each
+            #      intent individually
+            #
+            #
+            #
+            #
+            #
+            #
+        # End of for loop to add intents
+        # Print the intent states
+        intents = main.ONOScli1.intents( )
+        intentStates = []
+        for intent in json.loads( intents ):  # Iter through intents of a node
+            intentStates.append( intent.get( 'state', None ) )
+        out = [ (i, intentStates.count( i ) ) for i in set( intentStates ) ]
+        main.log.info( dict( out ) )
+
+        utilities.assert_equals(
+            expect=True,
+            actual=intentAddResult,
+            onpass="Pushed host intents to ONOS",
+            onfail="Error in pushing host intents to ONOS" )
+        # TODO Check if intents all exist in datastore
+
+    def CASE4( self, main ):
+        """
+        Ping across added host intents
+        """
+        import json
+        description = " Ping across added host intents"
+        main.log.report( description )
+        main.case( description )
+        PingResult = main.TRUE
+        for i in range( 8, 18 ):
+            ping = main.Mininet1.pingHost(
+                src="h" + str( i ), target="h" + str( i + 10 ) )
+            PingResult = PingResult and ping
+            if ping == main.FALSE:
+                main.log.warn( "Ping failed between h" + str( i ) +
+                               " and h" + str( i + 10 ) )
+            elif ping == main.TRUE:
+                main.log.info( "Ping test passed!" )
+                # Don't set PingResult or you'd override failures
+        if PingResult == main.FALSE:
+            main.log.report(
+                "Intents have not been installed correctly, pings failed." )
+            main.log.warn( "ONSO1 intents: " )
+            main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
+                                       sort_keys=True,
+                                       indent=4,
+                                       separators=( ',', ': ' ) ) )
+        if PingResult == main.TRUE:
+            main.log.report(
+                "Intents have been installed correctly and verified by pings" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=PingResult,
+            onpass="Intents have been installed correctly and pings work",
+            onfail="Intents have not been installed correctly, pings failed." )
+
+    def CASE5( self, main ):
+        """
+        Reading state of ONOS
+        """
+        import json
+        # assumes that sts is already in you PYTHONPATH
+        from sts.topology.teston_topology import TestONTopology
+
+        main.log.report( "Setting up and gathering data for current state" )
+        main.case( "Setting up and gathering data for current state" )
+        # The general idea for this test case is to pull the state of
+        # ( intents,flows, topology,... ) from each ONOS node
+        # We can then compare them with eachother and also with past states
+
+        main.step( "Get the Mastership of each switch from each controller" )
+        global mastershipState
+        mastershipState = []
+
+        # Assert that each device has a master
+        ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
+        ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
+        ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
+        ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
+        ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
+        ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
+        ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
+        rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
+            ONOS3MasterNotNull and ONOS4MasterNotNull and\
+            ONOS5MasterNotNull and ONOS6MasterNotNull and\
+            ONOS7MasterNotNull
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=rolesNotNull,
+            onpass="Each device has a master",
+            onfail="Some devices don't have a master assigned" )
+
+        ONOS1Mastership = main.ONOScli1.roles()
+        ONOS2Mastership = main.ONOScli2.roles()
+        ONOS3Mastership = main.ONOScli3.roles()
+        ONOS4Mastership = main.ONOScli4.roles()
+        ONOS5Mastership = main.ONOScli5.roles()
+        ONOS6Mastership = main.ONOScli6.roles()
+        ONOS7Mastership = main.ONOScli7.roles()
+        if "Error" in ONOS1Mastership or not ONOS1Mastership\
+                or "Error" in ONOS2Mastership or not ONOS2Mastership\
+                or "Error" in ONOS3Mastership or not ONOS3Mastership\
+                or "Error" in ONOS4Mastership or not ONOS4Mastership\
+                or "Error" in ONOS5Mastership or not ONOS5Mastership\
+                or "Error" in ONOS6Mastership or not ONOS6Mastership\
+                or "Error" in ONOS7Mastership or not ONOS7Mastership:
+            main.log.report( "Error in getting ONOS roles" )
+            for i in range( 1, numControllers + 1 ):
+                mastership = eval( "ONOS" + str( i ) + "Mastership" )
+                main.log.warn(
+                    "ONOS" + str( i ) + " mastership response: " +
+                    repr( mastership ) )
+            consistentMastership = main.FALSE
+        elif ONOS1Mastership == ONOS2Mastership\
+                and ONOS1Mastership == ONOS3Mastership\
+                and ONOS1Mastership == ONOS4Mastership\
+                and ONOS1Mastership == ONOS5Mastership\
+                and ONOS1Mastership == ONOS6Mastership\
+                and ONOS1Mastership == ONOS7Mastership:
+            mastershipState = ONOS1Mastership
+            consistentMastership = main.TRUE
+            main.log.report(
+                "Switch roles are consistent across all ONOS nodes" )
+        else:
+            for i in range( 1, numControllers + 1 ):
+                mastership = eval( "ONOS" + str( i ) + "Mastership" )
+                main.log.warn( "ONOS" + str( i ) + " roles: " +
+                               json.dumps( json.loads( mastership ),
+                                           sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+            consistentMastership = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentMastership,
+            onpass="Switch roles are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of switch roles" )
+
+        main.step( "Get the intents from each controller" )
+        global intentState
+        intentState = []
+        ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
+        ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
+        ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
+        ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
+        ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
+        ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
+        ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+        intentCheck = main.FALSE
+        if "Error" in ONOS1Intents or not ONOS1Intents\
+                or "Error" in ONOS2Intents or not ONOS2Intents\
+                or "Error" in ONOS3Intents or not ONOS3Intents\
+                or "Error" in ONOS4Intents or not ONOS4Intents\
+                or "Error" in ONOS5Intents or not ONOS5Intents\
+                or "Error" in ONOS6Intents or not ONOS6Intents\
+                or "Error" in ONOS7Intents or not ONOS7Intents:
+            main.log.report( "Error in getting ONOS intents" )
+            for i in range( 1, numControllers + 1 ):
+                intents = eval( "ONOS" + str( i ) + "Intents" )
+                main.log.warn(
+                    "ONOS" + str( i ) + " intents response: " +
+                    repr( intents ) )
+        elif ONOS1Intents == ONOS2Intents\
+                and ONOS1Intents == ONOS3Intents\
+                and ONOS1Intents == ONOS4Intents\
+                and ONOS1Intents == ONOS5Intents\
+                and ONOS1Intents == ONOS6Intents\
+                and ONOS1Intents == ONOS7Intents:
+            intentState = ONOS1Intents
+            intentCheck = main.TRUE
+            main.log.report( "Intents are consistent across all ONOS nodes" )
+        else:
+            for i in range( 1, numControllers + 1 ):
+                intents = eval( "ONOS" + str( i ) + "Intents" )
+                main.log.warn( "ONOS" + str( i ) + " intents: " +
+                               json.dumps( json.loads( intents ),
+                                           sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=intentCheck,
+            onpass="Intents are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of intents" )
+
+        main.step( "Get the flows from each controller" )
+        global flowState
+        flowState = []
+        ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
+        ONOS2Flows = main.ONOScli2.flows( jsonFormat=True )
+        ONOS3Flows = main.ONOScli3.flows( jsonFormat=True )
+        ONOS4Flows = main.ONOScli4.flows( jsonFormat=True )
+        ONOS5Flows = main.ONOScli5.flows( jsonFormat=True )
+        ONOS6Flows = main.ONOScli6.flows( jsonFormat=True )
+        ONOS7Flows = main.ONOScli7.flows( jsonFormat=True )
+        ONOS1FlowsJson = json.loads( ONOS1Flows )
+        ONOS2FlowsJson = json.loads( ONOS2Flows )
+        ONOS3FlowsJson = json.loads( ONOS3Flows )
+        ONOS4FlowsJson = json.loads( ONOS4Flows )
+        ONOS5FlowsJson = json.loads( ONOS5Flows )
+        ONOS6FlowsJson = json.loads( ONOS6Flows )
+        ONOS7FlowsJson = json.loads( ONOS7Flows )
+        flowCheck = main.FALSE
+        if "Error" in ONOS1Flows or not ONOS1Flows\
+                or "Error" in ONOS2Flows or not ONOS2Flows\
+                or "Error" in ONOS3Flows or not ONOS3Flows\
+                or "Error" in ONOS4Flows or not ONOS4Flows\
+                or "Error" in ONOS5Flows or not ONOS5Flows\
+                or "Error" in ONOS6Flows or not ONOS6Flows\
+                or "Error" in ONOS7Flows or not ONOS7Flows:
+            main.log.report( "Error in getting ONOS intents" )
+            for i in range( 1, numControllers + 1 ):
+                flowsIter = eval( "ONOS" + str( i ) + "Flows" )
+                main.log.warn( "ONOS" + str( i ) + " flows repsponse: " +
+                               flowsIter )
+        elif len( ONOS1FlowsJson ) == len( ONOS2FlowsJson )\
+                and len( ONOS1FlowsJson ) == len( ONOS3FlowsJson )\
+                and len( ONOS1FlowsJson ) == len( ONOS4FlowsJson )\
+                and len( ONOS1FlowsJson ) == len( ONOS5FlowsJson )\
+                and len( ONOS1FlowsJson ) == len( ONOS6FlowsJson )\
+                and len( ONOS1FlowsJson ) == len( ONOS7FlowsJson ):
+                # TODO: Do a better check, maybe compare flows on switches?
+            flowState = ONOS1Flows
+            flowCheck = main.TRUE
+            main.log.report( "Flow count is consistent across all ONOS nodes" )
+        else:
+            for i in range( 1, numControllers + 1 ):
+                flowsJson = eval( "ONOS" + str( i ) + "FlowsJson" )
+                main.log.warn( "ONOS" + str( i ) + " flows repsponse: " +
+                               json.dumps( flowsJson,
+                                           sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=flowCheck,
+            onpass="The flow count is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different flow counts" )
+
+        main.step( "Get the OF Table entries" )
+        global flows
+        flows = []
+        for i in range( 1, 29 ):
+            flows.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
+
+        # TODO: Compare switch flow tables with ONOS flow tables
+
+        main.step( "Start continuous pings" )
+        for i in range( 1, 11 ):
+            source = main.params[ 'PING' ][ 'source' + str( i ) ]
+            target = main.params[ 'PING' ][ 'target' + str( i ) ]
+            main.Mininet2.pingLong(
+                src=source,
+                target=target,
+                pingTime=500 )
+        main.step( "Create TestONTopology object" )
+        ctrls = []
+        count = 1
+        while True:
+            temp = ()
+            if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
+                temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
+                temp = temp + ( "ONOS" + str( count ), )
+                temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
+                temp = temp + \
+                    ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+                ctrls.append( temp )
+                count = count + 1
+            else:
+                break
+        MNTopo = TestONTopology(
+            main.Mininet1,
+            ctrls )  # can also add Intent API info for intent operations
+
+        main.step( "Collecting topology information from ONOS" )
+        # TODO Refactor to a loop? We want all similar calls together?
+        #      So get all "devices" as close together as possible
+        devices = []
+        print "ONOS1"
+        devices.append( main.ONOScli1.devices() )
+        print "ONOS2"
+        devices.append( main.ONOScli2.devices() )
+        print "ONOS3"
+        devices.append( main.ONOScli3.devices() )
+        print "ONOS4"
+        devices.append( main.ONOScli4.devices() )
+        print "ONOS5"
+        devices.append( main.ONOScli5.devices() )
+        print "ONOS6"
+        devices.append( main.ONOScli6.devices() )
+        print "ONOS7"
+        devices.append( main.ONOScli7.devices() )
+        hosts = []
+        hosts.append( main.ONOScli1.hosts() )
+        hosts.append( main.ONOScli2.hosts() )
+        hosts.append( main.ONOScli3.hosts() )
+        hosts.append( main.ONOScli4.hosts() )
+        hosts.append( main.ONOScli5.hosts() )
+        hosts.append( main.ONOScli6.hosts() )
+        hosts.append( main.ONOScli7.hosts() )
+        ports = []
+        ports.append( main.ONOScli1.ports() )
+        ports.append( main.ONOScli2.ports() )
+        ports.append( main.ONOScli3.ports() )
+        ports.append( main.ONOScli4.ports() )
+        ports.append( main.ONOScli5.ports() )
+        ports.append( main.ONOScli6.ports() )
+        ports.append( main.ONOScli7.ports() )
+        links = []
+        links.append( main.ONOScli1.links() )
+        links.append( main.ONOScli2.links() )
+        links.append( main.ONOScli3.links() )
+        links.append( main.ONOScli4.links() )
+        links.append( main.ONOScli5.links() )
+        links.append( main.ONOScli6.links() )
+        links.append( main.ONOScli7.links() )
+        clusters = []
+        clusters.append( main.ONOScli1.clusters() )
+        clusters.append( main.ONOScli2.clusters() )
+        clusters.append( main.ONOScli3.clusters() )
+        clusters.append( main.ONOScli4.clusters() )
+        clusters.append( main.ONOScli5.clusters() )
+        clusters.append( main.ONOScli6.clusters() )
+        clusters.append( main.ONOScli7.clusters() )
+        # Compare json objects for hosts and dataplane clusters
+
+        # hosts
+        consistentHostsResult = main.TRUE
+        for controller in range( len( hosts ) ):
+            controllerStr = str( controller + 1 )
+            if "Error" not in hosts[ controller ]:
+                if hosts[ controller ] == hosts[ 0 ]:
+                    continue
+                else:  # hosts not consistent
+                    main.log.report( "hosts from ONOS" +
+                                     controllerStr +
+                                     " is inconsistent with ONOS1" )
+                    main.log.warn( repr( hosts[ controller ] ) )
+                    consistentHostsResult = main.FALSE
+
+            else:
+                main.log.report( "Error in getting ONOS hosts from ONOS" +
+                                 controllerStr )
+                consistentHostsResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
+                               " hosts response: " +
+                               repr( hosts[ controller ] ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentHostsResult,
+            onpass="Hosts view is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of hosts" )
+
+        # Strongly connected clusters of devices
+        consistentClustersResult = main.TRUE
+        for controller in range( len( clusters ) ):
+            if "Error" not in clusters[ controller ]:
+                if clusters[ controller ] == clusters[ 0 ]:
+                    continue
+                else:  # clusters not consistent
+                    main.log.report( "clusters from ONOS" +
+                                     controllerStr +
+                                     " is inconsistent with ONOS1" )
+                    consistentClustersResult = main.FALSE
+
+            else:
+                main.log.report( "Error in getting dataplane clusters " +
+                                 "from ONOS" + controllerStr )
+                consistentClustersResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
+                               " clusters response: " +
+                               repr( clusters[ controller ] ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentClustersResult,
+            onpass="Clusters view is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of clusters" )
+        # there should always only be one cluster
+        numClusters = len( json.loads( clusters[ 0 ] ) )
+        utilities.assert_equals(
+            expect=1,
+            actual=numClusters,
+            onpass="ONOS shows 1 SCC",
+            onfail="ONOS shows " +
+            str( numClusters ) +
+            " SCCs" )
+
+        main.step( "Comparing ONOS topology to MN" )
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = main.TRUE
+        for controller in range( numControllers ):
+            controllerStr = str( controller + 1 )
+            if devices[ controller ] or "Error" not in devices[ controller ]:
+                currentDevicesResult = main.Mininet1.compareSwitches(
+                    MNTopo,
+                    json.loads(
+                        devices[ controller ] ) )
+            else:
+                currentDevicesResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentDevicesResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " Switches view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " Switches view is incorrect" )
+
+            if ports[ controller ] or "Error" not in ports[ controller ]:
+                currentPortsResult = main.Mininet1.comparePorts(
+                    MNTopo,
+                    json.loads(
+                        ports[ controller ] ) )
+            else:
+                currentPortsResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentPortsResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " ports view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " ports view is incorrect" )
+
+            if links[ controller ] or "Error" not in links[ controller ]:
+                currentLinksResult = main.Mininet1.compareLinks(
+                    MNTopo,
+                    json.loads(
+                        links[ controller ] ) )
+            else:
+                currentLinksResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentLinksResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " links view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " links view is incorrect" )
+
+            devicesResults = devicesResults and currentDevicesResult
+            portsResults = portsResults and currentPortsResult
+            linksResults = linksResults and currentLinksResult
+
+        topoResult = devicesResults and portsResults and linksResults\
+            and consistentHostsResult and consistentClustersResult
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                 onpass="Topology Check Test successful",
+                                 onfail="Topology Check Test NOT successful" )
+
+        finalAssert = main.TRUE
+        finalAssert = finalAssert and topoResult and flowCheck \
+            and intentCheck and consistentMastership and rolesNotNull
+        utilities.assert_equals( expect=main.TRUE, actual=finalAssert,
+                                 onpass="State check successful",
+                                 onfail="State check NOT successful" )
+
+    def CASE6( self, main ):
+        """
+        The Failure case. We will create IPTables rules here.
+        """
+        import time
+        main.log.report( "Wait 30 seconds instead of inducing a failure" )
+        time.sleep( 30 )
+
+        # 1 blocks 4,5,6,7, mn
+        # 2 blocks 4,5,6,7, mn
+        # 3 blocks 4,5,6,7, mn
+        # 4 block 1,2,3
+        # 5 blocks 1,2,3
+        # 6 blocks 1,2,3
+        # 7 blocks 1,2,3
+
+        # TODO: use new log command
+        logcmd = "log:log \" About to partition the ONOS nodes\""
+        main.ONOScli1.handle.sendline( logcmd )
+        main.ONOScli1.handle.expect( "onos>" )
+        print main.ONOScli1.handle.before
+        main.ONOScli2.handle.sendline( logcmd )
+        main.ONOScli2.handle.expect( "onos>" )
+        print main.ONOScli2.handle.before
+        main.ONOScli3.handle.sendline( logcmd )
+        main.ONOScli3.handle.expect( "onos>" )
+        print main.ONOScli3.handle.before
+        main.ONOScli4.handle.sendline( logcmd )
+        main.ONOScli4.handle.expect( "onos>" )
+        print main.ONOScli4.handle.before
+        main.ONOScli5.handle.sendline( logcmd )
+        main.ONOScli5.handle.expect( "onos>" )
+        print main.ONOScli5.handle.before
+        main.ONOScli6.handle.sendline( logcmd )
+        main.ONOScli6.handle.expect( "onos>" )
+        print main.ONOScli6.handle.before
+        main.ONOScli7.handle.sendline( logcmd )
+        main.ONOScli7.handle.expect( "onos>" )
+        print main.ONOScli7.handle.before
+
+        nodes = []
+        #create list of ONOS components
+        for controller in range( 1, numControllers + 1 ):
+            # loop through ONOS handlers
+            node = getattr( main, ( 'ONOS' + str( controller ) ) )
+            nodes.append( node )
+        for node in nodes:
+            # if node is in first half (rounded down )
+            # ( 0 through 2 ) < ( 3.5 - 1)
+            if nodes.index( node ) < ( numControllers / 2.0 - 1 ):
+                # blocked nodes are the last half ( rounded up )
+                # // is forced integer division
+                for blockNode in nodes[ (numControllers // 2 + 1) * -1: ]:
+                    # block all traffic between these ONOS nodes
+                    # NOTE: ONOS 1 and 2 don't support state tracking
+                    node.setIpTables( blockNode.ip_address, states=False )
+                    node.setIpTables( blockNode.ip_address,
+                                      direction="OUTPUT" , states=False )
+                # block traffic between smaller subcluster and Mininet
+                # TODO make OF controller port confgigurable
+                # FIXME Remove this once ONOS can deal with the conflicting
+                #       device mastership
+                node.setIpTables( main.Mininet1.ip_address, 6633,
+                                  packet_type="tcp", states=False )
+            else:  # the larger subcluster
+                # blocked nodes are the first half
+                for blockNode in nodes[ :(numControllers // 2 ) ]:
+                    # block all traffic between these ONOS nodes
+                    node.setIpTables( blockNode.ip_address )
+                    node.setIpTables( blockNode.ip_address,
+                                      direction="OUTPUT" )
+        #FIXME update this
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=main.TRUE,
+            onpass="Sleeping 30 seconds",
+            onfail="Something is terribly wrong with my math" )
+        main.ONOScli1.handle.sendline( "devices -j" )
+        main.ONOScli1.handle.expect( ["onos>", "\$"] )
+        print main.ONOScli1.handle.before
+        main.ONOScli2.handle.sendline( "devices -j" )
+        main.ONOScli2.handle.expect( ["onos>", "\$"] )
+        print main.ONOScli2.handle.before
+        main.ONOScli3.handle.sendline( "devices -j" )
+        main.ONOScli3.handle.expect( ["onos>", "\$"] )
+        print main.ONOScli3.handle.before
+        main.ONOScli4.handle.sendline( "devices -j" )
+        main.ONOScli4.handle.expect( ["onos>", "\$"] )
+        print main.ONOScli4.handle.before
+        main.ONOScli5.handle.sendline( "devices -j" )
+        main.ONOScli5.handle.expect( ["onos>", "\$"] )
+        print main.ONOScli5.handle.before
+        main.ONOScli6.handle.sendline( "devices -j" )
+        main.ONOScli6.handle.expect( ["onos>", "\$"] )
+        print main.ONOScli6.handle.before
+        main.ONOScli7.handle.sendline( "devices -j" )
+        main.ONOScli7.handle.expect( ["onos>", "\$"] )
+        print main.ONOScli7.handle.before
+        time.sleep(100000)
+
+
+    def CASE7( self, main ):
+        """
+        Check state after ONOS failure
+        """
+        import json
+        main.case( "Running ONOS Constant State Tests" )
+
+        # Assert that each device has a master
+        ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
+        ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
+        ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
+        ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
+        ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
+        ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
+        ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
+        rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
+            ONOS3MasterNotNull and ONOS4MasterNotNull and\
+            ONOS5MasterNotNull and ONOS6MasterNotNull and\
+            ONOS7MasterNotNull
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=rolesNotNull,
+            onpass="Each device has a master",
+            onfail="Some devices don't have a master assigned" )
+
+        main.step( "Check if switch roles are consistent across all nodes" )
+        ONOS1Mastership = main.ONOScli1.roles()
+        ONOS2Mastership = main.ONOScli2.roles()
+        ONOS3Mastership = main.ONOScli3.roles()
+        ONOS4Mastership = main.ONOScli4.roles()
+        ONOS5Mastership = main.ONOScli5.roles()
+        ONOS6Mastership = main.ONOScli6.roles()
+        ONOS7Mastership = main.ONOScli7.roles()
+        if "Error" in ONOS1Mastership or not ONOS1Mastership\
+                or "Error" in ONOS2Mastership or not ONOS2Mastership\
+                or "Error" in ONOS3Mastership or not ONOS3Mastership\
+                or "Error" in ONOS4Mastership or not ONOS4Mastership\
+                or "Error" in ONOS5Mastership or not ONOS5Mastership\
+                or "Error" in ONOS6Mastership or not ONOS6Mastership\
+                or "Error" in ONOS7Mastership or not ONOS7Mastership:
+            main.log.error( "Error in getting ONOS mastership" )
+            main.log.warn( "ONOS1 mastership response: " +
+                           repr( ONOS1Mastership ) )
+            main.log.warn( "ONOS2 mastership response: " +
+                           repr( ONOS2Mastership ) )
+            main.log.warn( "ONOS3 mastership response: " +
+                           repr( ONOS3Mastership ) )
+            main.log.warn( "ONOS4 mastership response: " +
+                           repr( ONOS4Mastership ) )
+            main.log.warn( "ONOS5 mastership response: " +
+                           repr( ONOS5Mastership ) )
+            main.log.warn( "ONOS6 mastership response: " +
+                           repr( ONOS6Mastership ) )
+            main.log.warn( "ONOS7 mastership response: " +
+                           repr( ONOS7Mastership ) )
+            consistentMastership = main.FALSE
+        elif ONOS1Mastership == ONOS2Mastership\
+                and ONOS1Mastership == ONOS3Mastership\
+                and ONOS1Mastership == ONOS4Mastership\
+                and ONOS1Mastership == ONOS5Mastership\
+                and ONOS1Mastership == ONOS6Mastership\
+                and ONOS1Mastership == ONOS7Mastership:
+            consistentMastership = main.TRUE
+            main.log.report(
+                "Switch roles are consistent across all ONOS nodes" )
+        else:
+            for i in range( 1, numControllers + 1 ):
+                mastership = eval( "ONOS" + str( i ) + "Mastership" )
+                main.log.warn( "ONOS" + str( i ) + " roles: " +
+                               json.dumps( json.loads( mastership ),
+                                           sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+            consistentMastership = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentMastership,
+            onpass="Switch roles are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of switch roles" )
+
+        description2 = "Compare switch roles from before failure"
+        main.step( description2 )
+
+        currentJson = json.loads( ONOS1Mastership )
+        oldJson = json.loads( mastershipState )
+        mastershipCheck = main.TRUE
+        for i in range( 1, 29 ):
+            switchDPID = str(
+                main.Mininet1.getSwitchDPID( switch="s" + str( i ) ) )
+
+            current = [ switch[ 'master' ] for switch in currentJson
+                        if switchDPID in switch[ 'id' ] ]
+            old = [ switch[ 'master' ] for switch in oldJson
+                    if switchDPID in switch[ 'id' ] ]
+            if current == old:
+                mastershipCheck = mastershipCheck and main.TRUE
+            else:
+                main.log.warn( "Mastership of switch %s changed" % switchDPID )
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
+            main.log.report( "Mastership of Switches was not changed" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=mastershipCheck,
+            onpass="Mastership of Switches was not changed",
+            onfail="Mastership of some switches changed" )
+        mastershipCheck = mastershipCheck and consistentMastership
+
+        main.step( "Get the intents and compare across all nodes" )
+        ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
+        ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
+        ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
+        ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
+        ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
+        ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
+        ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+        intentCheck = main.FALSE
+        if "Error" in ONOS1Intents or not ONOS1Intents\
+                or "Error" in ONOS2Intents or not ONOS2Intents\
+                or "Error" in ONOS3Intents or not ONOS3Intents\
+                or "Error" in ONOS4Intents or not ONOS4Intents\
+                or "Error" in ONOS5Intents or not ONOS5Intents\
+                or "Error" in ONOS6Intents or not ONOS6Intents\
+                or "Error" in ONOS7Intents or not ONOS7Intents:
+            main.log.report( "Error in getting ONOS intents" )
+            main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
+            main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
+            main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
+            main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
+            main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
+            main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
+            main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
+        elif ONOS1Intents == ONOS2Intents\
+                and ONOS1Intents == ONOS3Intents\
+                and ONOS1Intents == ONOS4Intents\
+                and ONOS1Intents == ONOS5Intents\
+                and ONOS1Intents == ONOS6Intents\
+                and ONOS1Intents == ONOS7Intents:
+            intentCheck = main.TRUE
+            main.log.report( "Intents are consistent across all ONOS nodes" )
+        else:
+            for i in range( 1, numControllers + 1 ):
+                intents = eval( "ONOS" + str( i ) + "Intents" )
+                main.log.warn( "ONOS" + str( i ) + " intents: " +
+                               json.dumps( json.loads( ONOS1Intents ),
+                                           sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=intentCheck,
+            onpass="Intents are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of intents" )
+        # Print the intent states
+        intents = []
+        intents.append( ONOS1Intents )
+        intents.append( ONOS2Intents )
+        intents.append( ONOS3Intents )
+        intents.append( ONOS4Intents )
+        intents.append( ONOS5Intents )
+        intents.append( ONOS6Intents )
+        intents.append( ONOS7Intents )
+        intentStates = []
+        for node in intents:  # Iter through ONOS nodes
+            nodeStates = []
+            for intent in json.loads( node ):  # Iter through intents of a node
+                nodeStates.append( intent[ 'state' ] )
+            intentStates.append( nodeStates )
+            out = [ (i, nodeStates.count( i ) ) for i in set( nodeStates ) ]
+            main.log.info( dict( out ) )
+        # NOTE: Hazelcast has no durability, so intents are lost across system
+        # restarts
+        main.step( "Compare current intents with intents before the failure" )
+        # NOTE: this requires case 5 to pass for intentState to be set.
+        #      maybe we should stop the test if that fails?
+        sameIntents = main.TRUE
+        if intentState and intentState == ONOS1Intents:
+            sameIntents = main.TRUE
+            main.log.report( "Intents are consistent with before failure" )
+        # TODO: possibly the states have changed? we may need to figure out
+        # what the aceptable states are
+        else:
+            try:
+                main.log.warn( "ONOS1 intents: " )
+                print json.dumps( json.loads( ONOS1Intents ),
+                                  sort_keys=True, indent=4,
+                                  separators=( ',', ': ' ) )
+            except:
+                pass
+            sameIntents = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=sameIntents,
+            onpass="Intents are consistent with before failure",
+            onfail="The Intents changed during failure" )
+        intentCheck = intentCheck and sameIntents
+
+        main.step( "Get the OF Table entries and compare to before " +
+                   "component failure" )
+        FlowTables = main.TRUE
+        flows2 = []
+        for i in range( 28 ):
+            main.log.info( "Checking flow table on s" + str( i + 1 ) )
+            tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
+            flows2.append( tmpFlows )
+            tempResult = main.Mininet2.flowComp(
+                flow1=flows[ i ],
+                flow2=tmpFlows )
+            FlowTables = FlowTables and tempResult
+            if FlowTables == main.FALSE:
+                main.log.info( "Differences in flow table for switch: s" +
+                               str( i + 1 ) )
+        if FlowTables == main.TRUE:
+            main.log.report( "No changes were found in the flow tables" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=FlowTables,
+            onpass="No changes were found in the flow tables",
+            onfail="Changes were found in the flow tables" )
+
+        main.step( "Check the continuous pings to ensure that no packets " +
+                   "were dropped during component failure" )
+        # FIXME: This check is always failing. Investigate cause
+        # NOTE:  this may be something to do with file permsissions
+        #       or slight change in format
+        main.Mininet2.pingKill(
+            main.params[ 'TESTONUSER' ],
+            main.params[ 'TESTONIP' ] )
+        LossInPings = main.FALSE
+        # NOTE: checkForLoss returns main.FALSE with 0% packet loss
+        for i in range( 8, 18 ):
+            main.log.info(
+                "Checking for a loss in pings along flow from s" +
+                str( i ) )
+            LossInPings = main.Mininet2.checkForLoss(
+                "/tmp/ping.h" +
+                str( i ) ) or LossInPings
+        if LossInPings == main.TRUE:
+            main.log.info( "Loss in ping detected" )
+        elif LossInPings == main.ERROR:
+            main.log.info( "There are multiple mininet process running" )
+        elif LossInPings == main.FALSE:
+            main.log.info( "No Loss in the pings" )
+            main.log.report( "No loss of dataplane connectivity" )
+        utilities.assert_equals(
+            expect=main.FALSE,
+            actual=LossInPings,
+            onpass="No Loss of connectivity",
+            onfail="Loss of dataplane connectivity detected" )
+
+        # Test of LeadershipElection
+        # FIXME Update this for network partition case
+        # NOTE: this only works for the sanity test. In case of failures,
+        # leader will likely change
+        leader = ONOS1Ip
+        leaderResult = main.TRUE
+        for controller in range( 1, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            leaderN = node.electionTestLeader()
+            # verify leader is ONOS1
+            if leaderN == leader:
+                # all is well
+                # NOTE: In failure scenario, this could be a new node, maybe
+                # check != ONOS1
+                pass
+            elif leaderN == main.FALSE:
+                # error in  response
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function," +
+                                 " check the error logs" )
+                leaderResult = main.FALSE
+            elif leader != leaderN:
+                leaderResult = main.FALSE
+                main.log.report( "ONOS" + str( controller ) + " sees " +
+                                 str( leaderN ) +
+                                 " as the leader of the election app. " +
+                                 "Leader should be " + str( leader ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a new " +
+                             "leader was re-elected if applicable )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
+
+        result = mastershipCheck and intentCheck and FlowTables and\
+            ( not LossInPings ) and rolesNotNull and leaderResult
+        result = int( result )
+        if result == main.TRUE:
+            main.log.report( "Constant State Tests Passed" )
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="Constant State Tests Passed",
+                                 onfail="Constant state tests failed" )
+
+    def CASE8( self, main ):
+        """
+        Compare topo
+        """
+        import sys
+        # FIXME add this path to params
+        sys.path.append( "/home/admin/sts" )
+        # assumes that sts is already in you PYTHONPATH
+        from sts.topology.teston_topology import TestONTopology
+        import json
+        import time
+
+        description = "Compare ONOS Topology view to Mininet topology"
+        main.case( description )
+        main.log.report( description )
+        main.step( "Create TestONTopology object" )
+        ctrls = []
+        count = 1
+        while True:
+            temp = ()
+            if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
+                temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
+                temp = temp + ( "ONOS" + str( count ), )
+                temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
+                temp = temp + \
+                    ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+                ctrls.append( temp )
+                count = count + 1
+            else:
+                break
+        MNTopo = TestONTopology(
+            main.Mininet1,
+            ctrls )  # can also add Intent API info for intent operations
+
+        main.step( "Comparing ONOS topology to MN" )
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = main.TRUE
+        topoResult = main.FALSE
+        elapsed = 0
+        count = 0
+        main.step( "Collecting topology information from ONOS" )
+        startTime = time.time()
+        # Give time for Gossip to work
+        while topoResult == main.FALSE and elapsed < 60:
+            count = count + 1
+            if count > 1:
+                # TODO: Depricate STS usage
+                MNTopo = TestONTopology(
+                    main.Mininet1,
+                    ctrls )
+            cliStart = time.time()
+            devices = []
+            devices.append( main.ONOScli1.devices() )
+            devices.append( main.ONOScli2.devices() )
+            devices.append( main.ONOScli3.devices() )
+            devices.append( main.ONOScli4.devices() )
+            devices.append( main.ONOScli5.devices() )
+            devices.append( main.ONOScli6.devices() )
+            devices.append( main.ONOScli7.devices() )
+            hosts = []
+            hosts.append( json.loads( main.ONOScli1.hosts() ) )
+            hosts.append( json.loads( main.ONOScli2.hosts() ) )
+            hosts.append( json.loads( main.ONOScli3.hosts() ) )
+            hosts.append( json.loads( main.ONOScli4.hosts() ) )
+            hosts.append( json.loads( main.ONOScli5.hosts() ) )
+            hosts.append( json.loads( main.ONOScli6.hosts() ) )
+            hosts.append( json.loads( main.ONOScli7.hosts() ) )
+            for controller in range( 0, len( hosts ) ):
+                controllerStr = str( controller + 1 )
+                for host in hosts[ controller ]:
+                    if host[ 'ips' ] == []:
+                        main.log.error(
+                            "DEBUG:Error with host ips on controller" +
+                            controllerStr + ": " + str( host ) )
+            ports = []
+            ports.append( main.ONOScli1.ports() )
+            ports.append( main.ONOScli2.ports() )
+            ports.append( main.ONOScli3.ports() )
+            ports.append( main.ONOScli4.ports() )
+            ports.append( main.ONOScli5.ports() )
+            ports.append( main.ONOScli6.ports() )
+            ports.append( main.ONOScli7.ports() )
+            links = []
+            links.append( main.ONOScli1.links() )
+            links.append( main.ONOScli2.links() )
+            links.append( main.ONOScli3.links() )
+            links.append( main.ONOScli4.links() )
+            links.append( main.ONOScli5.links() )
+            links.append( main.ONOScli6.links() )
+            links.append( main.ONOScli7.links() )
+            clusters = []
+            clusters.append( main.ONOScli1.clusters() )
+            clusters.append( main.ONOScli2.clusters() )
+            clusters.append( main.ONOScli3.clusters() )
+            clusters.append( main.ONOScli4.clusters() )
+            clusters.append( main.ONOScli5.clusters() )
+            clusters.append( main.ONOScli6.clusters() )
+            clusters.append( main.ONOScli7.clusters() )
+
+            elapsed = time.time() - startTime
+            cliTime = time.time() - cliStart
+            print "CLI time: " + str( cliTime )
+
+            for controller in range( numControllers ):
+                controllerStr = str( controller + 1 )
+                if devices[ controller ] or "Error" not in devices[
+                        controller ]:
+                    currentDevicesResult = main.Mininet1.compareSwitches(
+                        MNTopo,
+                        json.loads(
+                            devices[ controller ] ) )
+                else:
+                    currentDevicesResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentDevicesResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " Switches view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " Switches view is incorrect" )
+
+                if ports[ controller ] or "Error" not in ports[ controller ]:
+                    currentPortsResult = main.Mininet1.comparePorts(
+                        MNTopo,
+                        json.loads(
+                            ports[ controller ] ) )
+                else:
+                    currentPortsResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentPortsResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " ports view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " ports view is incorrect" )
+
+                if links[ controller ] or "Error" not in links[ controller ]:
+                    currentLinksResult = main.Mininet1.compareLinks(
+                        MNTopo,
+                        json.loads(
+                            links[ controller ] ) )
+                else:
+                    currentLinksResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentLinksResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " links view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " links view is incorrect" )
+            devicesResults = devicesResults and currentDevicesResult
+            portsResults = portsResults and currentPortsResult
+            linksResults = linksResults and currentLinksResult
+
+            # Compare json objects for hosts and dataplane clusters
+
+            # hosts
+            consistentHostsResult = main.TRUE
+            for controller in range( len( hosts ) ):
+                controllerStr = str( controller + 1 )
+                if "Error" not in hosts[ controller ]:
+                    if hosts[ controller ] == hosts[ 0 ]:
+                        continue
+                    else:  # hosts not consistent
+                        main.log.report( "hosts from ONOS" + controllerStr +
+                                         " is inconsistent with ONOS1" )
+                        main.log.warn( repr( hosts[ controller ] ) )
+                        consistentHostsResult = main.FALSE
+
+                else:
+                    main.log.report( "Error in getting ONOS hosts from ONOS" +
+                                     controllerStr )
+                    consistentHostsResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
+                                   " hosts response: " +
+                                   repr( hosts[ controller ] ) )
+            utilities.assert_equals(
+                expect=main.TRUE,
+                actual=consistentHostsResult,
+                onpass="Hosts view is consistent across all ONOS nodes",
+                onfail="ONOS nodes have different views of hosts" )
+
+            # Strongly connected clusters of devices
+            consistentClustersResult = main.TRUE
+            for controller in range( len( clusters ) ):
+                controllerStr = str( controller + 1 )
+                if "Error" not in clusters[ controller ]:
+                    if clusters[ controller ] == clusters[ 0 ]:
+                        continue
+                    else:  # clusters not consistent
+                        main.log.report( "clusters from ONOS" +
+                                         controllerStr +
+                                         " is inconsistent with ONOS1" )
+                        consistentClustersResult = main.FALSE
+
+                else:
+                    main.log.report( "Error in getting dataplane clusters " +
+                                     "from ONOS" + controllerStr )
+                    consistentClustersResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
+                                   " clusters response: " +
+                                   repr( clusters[ controller ] ) )
+            utilities.assert_equals(
+                expect=main.TRUE,
+                actual=consistentClustersResult,
+                onpass="Clusters view is consistent across all ONOS nodes",
+                onfail="ONOS nodes have different views of clusters" )
+            # there should always only be one cluster
+            numClusters = len( json.loads( clusters[ 0 ] ) )
+            utilities.assert_equals(
+                expect=1,
+                actual=numClusters,
+                onpass="ONOS shows 1 SCC",
+                onfail="ONOS shows " +
+                str( numClusters ) +
+                " SCCs" )
+
+            topoResult = ( devicesResults and portsResults and linksResults
+                           and consistentHostsResult
+                           and consistentClustersResult )
+
+        topoResult = topoResult and int( count <= 2 )
+        note = "note it takes about " + str( int( cliTime ) ) + \
+            " seconds for the test to make all the cli calls to fetch " +\
+            "the topology from each ONOS instance"
+        main.log.info(
+            "Very crass estimate for topology discovery/convergence( " +
+            str( note ) + " ): " + str( elapsed ) + " seconds, " +
+            str( count ) + " tries" )
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                 onpass="Topology Check Test successful",
+                                 onfail="Topology Check Test NOT successful" )
+        if topoResult == main.TRUE:
+            main.log.report( "ONOS topology view matches Mininet topology" )
+
+    def CASE9( self, main ):
+        """
+        Link s3-s28 down
+        """
+        import time
+        # NOTE: You should probably run a topology check after this
+
+        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
+
+        description = "Turn off a link to ensure that Link Discovery " +\
+            "is working properly"
+        main.log.report( description )
+        main.case( description )
+
+        main.step( "Kill Link between s3 and s28" )
+        LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
+        main.log.info(
+            "Waiting " +
+            str( linkSleep ) +
+            " seconds for link down to be discovered" )
+        time.sleep( linkSleep )
+        utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
+                                 onpass="Link down succesful",
+                                 onfail="Failed to bring link down" )
+        # TODO do some sort of check here
+
+    def CASE10( self, main ):
+        """
+        Link s3-s28 up
+        """
+        import time
+        # NOTE: You should probably run a topology check after this
+
+        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
+
+        description = "Restore a link to ensure that Link Discovery is " + \
+            "working properly"
+        main.log.report( description )
+        main.case( description )
+
+        main.step( "Bring link between s3 and s28 back up" )
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
+        main.log.info(
+            "Waiting " +
+            str( linkSleep ) +
+            " seconds for link up to be discovered" )
+        time.sleep( linkSleep )
+        utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
+                                 onpass="Link up succesful",
+                                 onfail="Failed to bring link up" )
+        # TODO do some sort of check here
+
+    def CASE11( self, main ):
+        """
+        Switch Down
+        """
+        # NOTE: You should probably run a topology check after this
+        import time
+
+        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
+
+        description = "Killing a switch to ensure it is discovered correctly"
+        main.log.report( description )
+        main.case( description )
+        switch = main.params[ 'kill' ][ 'switch' ]
+        switchDPID = main.params[ 'kill' ][ 'dpid' ]
+
+        # TODO: Make this switch parameterizable
+        main.step( "Kill " + switch )
+        main.log.report( "Deleting " + switch )
+        main.Mininet1.delSwitch( switch )
+        main.log.info( "Waiting " + str( switchSleep ) +
+                       " seconds for switch down to be discovered" )
+        time.sleep( switchSleep )
+        device = main.ONOScli1.getDevice( dpid=switchDPID )
+        # Peek at the deleted switch
+        main.log.warn( str( device ) )
+        result = main.FALSE
+        if device and device[ 'available' ] is False:
+            result = main.TRUE
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="Kill switch succesful",
+                                 onfail="Failed to kill switch?" )
+
+    def CASE12( self, main ):
+        """
+        Switch Up
+        """
+        # NOTE: You should probably run a topology check after this
+        import time
+
+        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
+        switch = main.params[ 'kill' ][ 'switch' ]
+        switchDPID = main.params[ 'kill' ][ 'dpid' ]
+        links = main.params[ 'kill' ][ 'links' ].split()
+        description = "Adding a switch to ensure it is discovered correctly"
+        main.log.report( description )
+        main.case( description )
+
+        main.step( "Add back " + switch )
+        main.log.report( "Adding back " + switch )
+        main.Mininet1.addSwitch( switch, dpid=switchDPID )
+        for peer in links:
+            main.Mininet1.addLink( switch, peer )
+        main.Mininet1.assignSwController(
+            sw=switch.split( 's' )[ 1 ],
+            count=numControllers,
+            ip1=ONOS1Ip,
+            port1=ONOS1Port,
+            ip2=ONOS2Ip,
+            port2=ONOS2Port,
+            ip3=ONOS3Ip,
+            port3=ONOS3Port,
+            ip4=ONOS4Ip,
+            port4=ONOS4Port,
+            ip5=ONOS5Ip,
+            port5=ONOS5Port,
+            ip6=ONOS6Ip,
+            port6=ONOS6Port,
+            ip7=ONOS7Ip,
+            port7=ONOS7Port )
+        main.log.info(
+            "Waiting " +
+            str( switchSleep ) +
+            " seconds for switch up to be discovered" )
+        time.sleep( switchSleep )
+        device = main.ONOScli1.getDevice( dpid=switchDPID )
+        # Peek at the deleted switch
+        main.log.warn( str( device ) )
+        result = main.FALSE
+        if device and device[ 'available' ]:
+            result = main.TRUE
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="add switch succesful",
+                                 onfail="Failed to add switch?" )
+
+    def CASE13( self, main ):
+        """
+        Clean up
+        """
+        import os
+        import time
+        # TODO: make use of this elsewhere
+        ips = []
+        ips.append( ONOS1Ip )
+        ips.append( ONOS2Ip )
+        ips.append( ONOS3Ip )
+        ips.append( ONOS4Ip )
+        ips.append( ONOS5Ip )
+        ips.append( ONOS6Ip )
+        ips.append( ONOS7Ip )
+
+        # printing colors to terminal
+        colors = {}
+        colors[ 'cyan' ] = '\033[96m'
+        colors[ 'purple' ] = '\033[95m'
+        colors[ 'blue' ] = '\033[94m'
+        colors[ 'green' ] = '\033[92m'
+        colors[ 'yellow' ] = '\033[93m'
+        colors[ 'red' ] = '\033[91m'
+        colors[ 'end' ] = '\033[0m'
+        description = "Test Cleanup"
+        main.log.report( description )
+        main.case( description )
+        main.step( "Killing tcpdumps" )
+        main.Mininet2.stopTcpdump()
+
+        main.step( "Checking ONOS Logs for errors" )
+        for i in range( 7 ):
+            print colors[ 'purple' ] + "Checking logs for errors on " + \
+                "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
+            print main.ONOSbench.checkLogs( ips[ i ] )
+
+        main.step( "Copying MN pcap and ONOS log files to test station" )
+        testname = main.TEST
+        teststationUser = main.params[ 'TESTONUSER' ]
+        teststationIP = main.params[ 'TESTONIP' ]
+        # NOTE: MN Pcap file is being saved to ~/packet_captures
+        #       scp this file as MN and TestON aren't necessarily the same vm
+        # FIXME: scp
+        # mn files
+        # TODO: Load these from params
+        # NOTE: must end in /
+        logFolder = "/opt/onos/log/"
+        logFiles = [ "karaf.log", "karaf.log.1" ]
+        # NOTE: must end in /
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            for i in range( 7 ):
+                main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
+                                                logFolder + f + " " +
+                                                teststationUser + "@" +
+                                                teststationIP + ":" +
+                                                dstDir + str( testname ) +
+                                                "-ONOS" + str( i + 1 ) + "-" +
+                                                f )
+        # std*.log's
+        # NOTE: must end in /
+        logFolder = "/opt/onos/var/"
+        logFiles = [ "stderr.log", "stdout.log" ]
+        # NOTE: must end in /
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            for i in range( 7 ):
+                main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
+                                                logFolder + f + " " +
+                                                teststationUser + "@" +
+                                                teststationIP + ":" +
+                                                dstDir + str( testname ) +
+                                                "-ONOS" + str( i + 1 ) + "-" +
+                                                f )
+        # sleep so scp can finish
+        time.sleep( 10 )
+        main.step( "Packing and rotating pcap archives" )
+        os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
+
+        # TODO: actually check something here
+        utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
+                                 onpass="Test cleanup successful",
+                                 onfail="Test cleanup NOT successful" )
+
+    def CASE14( self, main ):
+        """
+        start election app on all onos nodes
+        """
+        leaderResult = main.TRUE
+        # install app on onos 1
+        main.log.info( "Install leadership election app" )
+        main.ONOScli1.featureInstall( "onos-app-election" )
+        # wait for election
+        # check for leader
+        leader = main.ONOScli1.electionTestLeader()
+        # verify leader is ONOS1
+        if leader == ONOS1Ip:
+            # all is well
+            pass
+        elif leader is None:
+            # No leader elected
+            main.log.report( "No leader was elected" )
+            leaderResult = main.FALSE
+        elif leader == main.FALSE:
+            # error in  response
+            # TODO: add check for "Command not found:" in the driver, this
+            # means the app isn't loaded
+            main.log.report( "Something is wrong with electionTestLeader" +
+                             " function, check the error logs" )
+            leaderResult = main.FALSE
+        else:
+            # error in  response
+            main.log.report(
+                "Unexpected response from electionTestLeader function:'" +
+                str( leader ) +
+                "'" )
+            leaderResult = main.FALSE
+
+        # install on other nodes and check for leader.
+        # Should be onos1 and each app should show the same leader
+        for controller in range( 2, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            node.featureInstall( "onos-app-election" )
+            leaderN = node.electionTestLeader()
+            # verify leader is ONOS1
+            if leaderN == ONOS1Ip:
+                # all is well
+                pass
+            elif leaderN == main.FALSE:
+                # error in  response
+                # TODO: add check for "Command not found:" in the driver, this
+                # means the app isn't loaded
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, check the" +
+                                 " error logs" )
+                leaderResult = main.FALSE
+            elif leader != leaderN:
+                leaderResult = main.FALSE
+                main.log.report( "ONOS" + str( controller ) + " sees " +
+                                 str( leaderN ) +
+                                 " as the leader of the election app. Leader" +
+                                 " should be " +
+                                 str( leader ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a leader " +
+                             "was elected )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
+
+    def CASE15( self, main ):
+        """
+        Check that Leadership Election is still functional
+        """
+        leaderResult = main.TRUE
+        description = "Check that Leadership Election is still functional"
+        main.log.report( description )
+        main.case( description )
+        main.step( "Find current leader and withdraw" )
+        leader = main.ONOScli1.electionTestLeader()
+        withdrawResult = main.FALSE
+        if leader == ONOS1Ip:
+            oldLeader = getattr( main, "ONOScli1" )
+        elif leader == ONOS2Ip:
+            oldLeader = getattr( main, "ONOScli2" )
+        elif leader == ONOS3Ip:
+            oldLeader = getattr( main, "ONOScli3" )
+        elif leader == ONOS4Ip:
+            oldLeader = getattr( main, "ONOScli4" )
+        elif leader == ONOS5Ip:
+            oldLeader = getattr( main, "ONOScli5" )
+        elif leader == ONOS6Ip:
+            oldLeader = getattr( main, "ONOScli6" )
+        elif leader == ONOS7Ip:
+            oldLeader = getattr( main, "ONOScli7" )
+        elif leader is None or leader == main.FALSE:
+            main.log.report(
+                "Leader for the election app should be an ONOS node," +
+                "instead got '" +
+                str( leader ) +
+                "'" )
+            leaderResult = main.FALSE
+        withdrawResult = oldLeader.electionTestWithdraw()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=withdrawResult,
+            onpass="App was withdrawn from election",
+            onfail="App was not withdrawn from election" )
+
+        main.step( "Make sure new leader is elected" )
+        leaderList = []
+        for controller in range( 1, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            leaderList.append( node.electionTestLeader() )
+        for leaderN in leaderList:
+            if leaderN == leader:
+                main.log.report(
+                    "ONOS" +
+                    str( controller ) +
+                    " still sees " +
+                    str( leader ) +
+                    " as leader after they withdrew" )
+                leaderResult = main.FALSE
+            elif leaderN == main.FALSE:
+                # error in  response
+                # TODO: add check for "Command not found:" in the driver, this
+                # means the app isn't loaded
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, " +
+                                 "check the error logs" )
+                leaderResult = main.FALSE
+        consistentLeader = main.FALSE
+        if len( set( leaderList ) ) == 1:
+            main.log.info( "Each Election-app sees '" +
+                           str( leaderList[ 0 ] ) +
+                           "' as the leader" )
+            consistentLeader = main.TRUE
+        else:
+            main.log.report(
+                "Inconsistent responses for leader of Election-app:" )
+            for n in range( len( leaderList ) ):
+                main.log.report( "ONOS" + str( n + 1 ) + " response: " +
+                                 str( leaderList[ n ] ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a new " +
+                             "leader was elected when the old leader " +
+                             "resigned )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
+
+        main.step( "Run for election on old leader( just so everyone "
+                   "is in the hat )" )
+        runResult = oldLeader.electionTestRun()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=runResult,
+            onpass="App re-ran for election",
+            onfail="App failed to run for election" )
+        if consistentLeader == main.TRUE:
+            afterRun = main.ONOScli1.electionTestLeader()
+            # verify leader didn't just change
+            if afterRun == leaderList[ 0 ]:
+                leaderResult = main.TRUE
+            else:
+                leaderResult = main.FALSE
+        # TODO: assert on  run and withdraw results?
+
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election after " +
+                   "the old leader re-ran for election" )
+    def CASE16( self ):
+        """
+        """
+        main.ONOScli1.handle.sendline( "sudo iptables -F" )
+        main.ONOScli1.handle.expect( "\$" )
+        main.ONOScli2.handle.sendline( "sudo iptables -F" )
+        main.ONOScli2.handle.expect( "\$" )
+        main.ONOScli3.handle.sendline( "sudo iptables -F" )
+        main.ONOScli3.handle.expect( "\$" )
+        main.ONOScli4.handle.sendline( "sudo iptables -F" )
+        main.ONOScli4.handle.expect( "\$" )
+        main.ONOScli5.handle.sendline( "sudo iptables -F" )
+        main.ONOScli5.handle.expect( "\$" )
+        main.ONOScli6.handle.sendline( "sudo iptables -F" )
+        main.ONOScli6.handle.expect( "\$" )
+        main.ONOScli7.handle.sendline( "sudo iptables -F" )
+        main.ONOScli7.handle.expect( "\$" )
+
diff --git a/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.topo b/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.topo
new file mode 100644
index 0000000..7b32cc2
--- /dev/null
+++ b/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.topo
@@ -0,0 +1,170 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>10.128.30.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOSbench>
+
+        <ONOScli1>
+            <host>10.128.30.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli1>
+
+        <ONOScli2>
+            <host>10.128.30.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli2>
+
+        <ONOScli3>
+            <host>10.128.30.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli3>
+
+
+        <ONOScli4>
+            <host>10.128.30.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli4>
+
+
+        <ONOScli5>
+            <host>10.128.30.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli5>
+
+
+        <ONOScli6>
+            <host>10.128.30.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>7</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli6>
+
+
+        <ONOScli7>
+            <host>10.128.30.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>8</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli7>
+
+        <ONOS1>
+            <host>10.128.30.11</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>9</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOS2>
+            <host>10.128.30.12</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>10</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS2>
+
+        <ONOS3>
+            <host>10.128.30.13</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>11</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS3>
+
+        <ONOS4>
+            <host>10.128.30.14</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>12</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS4>
+
+        <ONOS5>
+            <host>10.128.30.15</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>13</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOS5>
+
+        <ONOS6>
+            <host>10.128.30.16</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>14</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS6>
+
+        <ONOS7>
+            <host>10.128.30.17</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>15</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS7>
+
+        <Mininet1>
+            <host>10.128.30.9</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>MininetCliDriver</type>
+            <connect_order>16</connect_order>
+            <COMPONENTS>
+                #Specify the Option for mininet
+                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
+                <arg2> --topo mytopo </arg2>
+                <arg3> </arg3>
+                <controller> none </controller>
+            </COMPONENTS>
+        </Mininet1>
+
+        <Mininet2>
+            <host>10.128.30.9</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>RemoteMininetDriver</type>
+            <connect_order>17</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </Mininet2>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/HATestNetworkPartition/__init__.py b/TestON/tests/HATestNetworkPartition/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/HATestNetworkPartition/__init__.py
diff --git a/TestON/tests/HATestSanity/HATestSanity.params b/TestON/tests/HATestSanity/HATestSanity.params
index 78e0c83..ee4374d 100644
--- a/TestON/tests/HATestSanity/HATestSanity.params
+++ b/TestON/tests/HATestSanity/HATestSanity.params
@@ -1,9 +1,10 @@
 <PARAMS>
     <testcases>1,2,8,3,4,5,14,[6],8,7,4,15,9,8,4,10,8,4,11,8,4,12,8,4,13</testcases>
     <ENV>
-    <cellName>HA</cellName>
+        <cellName>HA</cellName>
     </ENV>
-    <Git>False</Git>
+    <Git> True </Git>
+    <branch> master </branch>
     <num_controllers> 7 </num_controllers>
 
     <CTRL>
@@ -56,6 +57,11 @@
         <LinkDiscovery>.2</LinkDiscovery>
         <SwitchDiscovery>.2</SwitchDiscovery>
     </timers>
+    <kill>
+        <switch> s5 </switch>
+        <dpid> 0000000000005000 </dpid>
+        <links> h5 s2 s1 s6 </links>
+    </kill>
     <MNtcpdump>
         <intf>eth0</intf>
         <port> </port>
diff --git a/TestON/tests/HATestSanity/HATestSanity.py b/TestON/tests/HATestSanity/HATestSanity.py
index 2d56e90..9ba287d 100644
--- a/TestON/tests/HATestSanity/HATestSanity.py
+++ b/TestON/tests/HATestSanity/HATestSanity.py
@@ -1,4 +1,4 @@
-'''
+"""
 Description: This test is to determine if the HA test setup is
     working correctly. There are no failures so this test should
     have a 100% pass rate
@@ -19,794 +19,1090 @@
 CASE13: Clean up
 CASE14: start election app on all onos nodes
 CASE15: Check that Leadership Election is still functional
-'''
+"""
+
+
 class HATestSanity:
 
-    def __init__(self) :
+    def __init__( self ):
         self.default = ''
 
-    def CASE1(self,main) :
-        '''
+    def CASE1( self, main ):
+        """
         CASE1 is to compile ONOS and push it to the test machines
 
         Startup sequence:
-        git pull
-        mvn clean install
-        onos-package
         cell <name>
         onos-verify-cell
         NOTE: temporary - onos-remove-raft-logs
+        onos-uninstall
+        start mininet
+        git pull
+        mvn clean install
+        onos-package
         onos-install -f
         onos-wait-for-start
-        '''
-        import time
-        main.log.report("ONOS HA Sanity test - initialization")
-        main.case("Setting up test environment")
-        #TODO: save all the timers and output them for plotting
+        start cli sessions
+        start tcpdump
+        """
+        main.log.report( "ONOS HA Sanity test - initialization" )
+        main.case( "Setting up test environment" )
+        # TODO: save all the timers and output them for plotting
 
         # load some vairables from the params file
-        PULL_CODE = False
-        if main.params['Git'] == 'True':
-            PULL_CODE = True
-        cell_name = main.params['ENV']['cellName']
+        PULLCODE = False
+        if main.params[ 'Git' ] == 'True':
+            PULLCODE = True
+        gitBranch = main.params[ 'branch' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
 
-        #set global variables
-        global ONOS1_ip
-        global ONOS1_port
-        global ONOS2_ip
-        global ONOS2_port
-        global ONOS3_ip
-        global ONOS3_port
-        global ONOS4_ip
-        global ONOS4_port
-        global ONOS5_ip
-        global ONOS5_port
-        global ONOS6_ip
-        global ONOS6_port
-        global ONOS7_ip
-        global ONOS7_port
-        global num_controllers
+        # set global variables
+        global ONOS1Ip
+        global ONOS1Port
+        global ONOS2Ip
+        global ONOS2Port
+        global ONOS3Ip
+        global ONOS3Port
+        global ONOS4Ip
+        global ONOS4Port
+        global ONOS5Ip
+        global ONOS5Port
+        global ONOS6Ip
+        global ONOS6Port
+        global ONOS7Ip
+        global ONOS7Port
+        global numControllers
 
-        ONOS1_ip = main.params['CTRL']['ip1']
-        ONOS1_port = main.params['CTRL']['port1']
-        ONOS2_ip = main.params['CTRL']['ip2']
-        ONOS2_port = main.params['CTRL']['port2']
-        ONOS3_ip = main.params['CTRL']['ip3']
-        ONOS3_port = main.params['CTRL']['port3']
-        ONOS4_ip = main.params['CTRL']['ip4']
-        ONOS4_port = main.params['CTRL']['port4']
-        ONOS5_ip = main.params['CTRL']['ip5']
-        ONOS5_port = main.params['CTRL']['port5']
-        ONOS6_ip = main.params['CTRL']['ip6']
-        ONOS6_port = main.params['CTRL']['port6']
-        ONOS7_ip = main.params['CTRL']['ip7']
-        ONOS7_port = main.params['CTRL']['port7']
-        num_controllers = int(main.params['num_controllers'])
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
+        ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
+        ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
+        ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
+        ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
+        ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
+        numControllers = int( main.params[ 'num_controllers' ] )
 
+        main.step( "Applying cell variable to environment" )
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
-        main.step("Applying cell variable to environment")
-        cell_result = main.ONOSbench.set_cell(cell_name)
-        verify_result = main.ONOSbench.verify_cell()
+        # FIXME:this is short term fix
+        main.log.report( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftLogs()
+        main.log.report( "Uninstalling ONOS" )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+        main.ONOSbench.onosUninstall( ONOS2Ip )
+        main.ONOSbench.onosUninstall( ONOS3Ip )
+        main.ONOSbench.onosUninstall( ONOS4Ip )
+        main.ONOSbench.onosUninstall( ONOS5Ip )
+        main.ONOSbench.onosUninstall( ONOS6Ip )
+        main.ONOSbench.onosUninstall( ONOS7Ip )
 
-        #FIXME:this is short term fix
-        main.log.report("Removing raft logs")
-        main.ONOSbench.onos_remove_raft_logs()
-        main.log.report("Uninstalling ONOS")
-        main.ONOSbench.onos_uninstall(ONOS1_ip)
-        main.ONOSbench.onos_uninstall(ONOS2_ip)
-        main.ONOSbench.onos_uninstall(ONOS3_ip)
-        main.ONOSbench.onos_uninstall(ONOS4_ip)
-        main.ONOSbench.onos_uninstall(ONOS5_ip)
-        main.ONOSbench.onos_uninstall(ONOS6_ip)
-        main.ONOSbench.onos_uninstall(ONOS7_ip)
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
 
-        clean_install_result = main.TRUE
-        git_pull_result = main.TRUE
+        main.step( "Starting Mininet" )
+        main.Mininet1.startNet( )
 
-        main.step("Compiling the latest version of ONOS")
-        if PULL_CODE:
-            # Configure branch in params
-            main.step("Git checkout and pull master")
-            main.ONOSbench.git_checkout("master")
-            git_pull_result = main.ONOSbench.git_pull()
+        main.step( "Compiling the latest version of ONOS" )
+        if PULLCODE:
+            main.step( "Git checkout and pull " + gitBranch )
+            main.ONOSbench.gitCheckout( gitBranch )
+            gitPullResult = main.ONOSbench.gitPull()
 
-            main.step("Using mvn clean & install")
-            clean_install_result = main.TRUE
-            if git_pull_result == main.TRUE:
-                clean_install_result = main.ONOSbench.clean_install()
-            else:
-                main.log.warn("Did not pull new code so skipping mvn "+ \
-                        "clean install")
-        main.ONOSbench.get_version(report=True)
+            main.step( "Using mvn clean & install" )
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
 
-        main.step("Creating ONOS package")
-        package_result = main.ONOSbench.onos_package()
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
 
-        main.step("Installing ONOS package")
-        onos1_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS1_ip)
-        onos2_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS2_ip)
-        onos3_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS3_ip)
-        onos4_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS4_ip)
-        onos5_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS5_ip)
-        onos6_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS6_ip)
-        onos7_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS7_ip)
-        onos_install_result = onos1_install_result and onos2_install_result\
-                and onos3_install_result and onos4_install_result\
-                and onos5_install_result and onos6_install_result\
-                and onos7_install_result
-        '''
-        #FIXME: work around until onos is less fragile
-        main.ONOSbench.handle.sendline("onos-cluster-install")
-        print main.ONOSbench.handle.expect("\$")
-        onos_install_result = main.TRUE
-        '''
+        main.step( "Installing ONOS package" )
+        onos1InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS1Ip )
+        onos2InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS2Ip )
+        onos3InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS3Ip )
+        onos4InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS4Ip )
+        onos5InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS5Ip )
+        onos6InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS6Ip )
+        onos7InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS7Ip )
+        onosInstallResult = onos1InstallResult and onos2InstallResult\
+            and onos3InstallResult and onos4InstallResult\
+            and onos5InstallResult and onos6InstallResult\
+            and onos7InstallResult
 
-
-        main.step("Checking if ONOS is up yet")
-        #TODO check bundle:list?
-        for i in range(2):
-            onos1_isup = main.ONOSbench.isup(ONOS1_ip)
-            if not onos1_isup:
-                main.log.report("ONOS1 didn't start!")
-            onos2_isup = main.ONOSbench.isup(ONOS2_ip)
-            if not onos2_isup:
-                main.log.report("ONOS2 didn't start!")
-            onos3_isup = main.ONOSbench.isup(ONOS3_ip)
-            if not onos3_isup:
-                main.log.report("ONOS3 didn't start!")
-            onos4_isup = main.ONOSbench.isup(ONOS4_ip)
-            if not onos4_isup:
-                main.log.report("ONOS4 didn't start!")
-            onos5_isup = main.ONOSbench.isup(ONOS5_ip)
-            if not onos5_isup:
-                main.log.report("ONOS5 didn't start!")
-            onos6_isup = main.ONOSbench.isup(ONOS6_ip)
-            if not onos6_isup:
-                main.log.report("ONOS6 didn't start!")
-            onos7_isup = main.ONOSbench.isup(ONOS7_ip)
-            if not onos7_isup:
-                main.log.report("ONOS7 didn't start!")
-            onos_isup_result = onos1_isup and onos2_isup and onos3_isup\
-                    and onos4_isup and onos5_isup and onos6_isup and onos7_isup
-            if onos_isup_result == main.TRUE:
+        main.step( "Checking if ONOS is up yet" )
+        for i in range( 2 ):
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            if not onos1Isup:
+                main.log.report( "ONOS1 didn't start!" )
+                main.ONOSbench.onosStop( ONOS1Ip )
+                main.ONOSbench.onosStart( ONOS1Ip )
+            onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+            if not onos2Isup:
+                main.log.report( "ONOS2 didn't start!" )
+                main.ONOSbench.onosStop( ONOS2Ip )
+                main.ONOSbench.onosStart( ONOS2Ip )
+            onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+            if not onos3Isup:
+                main.log.report( "ONOS3 didn't start!" )
+                main.ONOSbench.onosStop( ONOS3Ip )
+                main.ONOSbench.onosStart( ONOS3Ip )
+            onos4Isup = main.ONOSbench.isup( ONOS4Ip )
+            if not onos4Isup:
+                main.log.report( "ONOS4 didn't start!" )
+                main.ONOSbench.onosStop( ONOS4Ip )
+                main.ONOSbench.onosStart( ONOS4Ip )
+            onos5Isup = main.ONOSbench.isup( ONOS5Ip )
+            if not onos5Isup:
+                main.log.report( "ONOS5 didn't start!" )
+                main.ONOSbench.onosStop( ONOS5Ip )
+                main.ONOSbench.onosStart( ONOS5Ip )
+            onos6Isup = main.ONOSbench.isup( ONOS6Ip )
+            if not onos6Isup:
+                main.log.report( "ONOS6 didn't start!" )
+                main.ONOSbench.onosStop( ONOS6Ip )
+                main.ONOSbench.onosStart( ONOS6Ip )
+            onos7Isup = main.ONOSbench.isup( ONOS7Ip )
+            if not onos7Isup:
+                main.log.report( "ONOS7 didn't start!" )
+                main.ONOSbench.onosStop( ONOS7Ip )
+                main.ONOSbench.onosStart( ONOS7Ip )
+            onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
+                and onos4Isup and onos5Isup and onos6Isup and onos7Isup
+            if onosIsupResult == main.TRUE:
                 break
 
+        cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
+        cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
+        cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
+        cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
+        cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
+        cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
+        cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
+        cliResults = cliResult1 and cliResult2 and cliResult3 and\
+            cliResult4 and cliResult5 and cliResult6 and cliResult7
 
-        cli_result1 = main.ONOScli1.start_onos_cli(ONOS1_ip)
-        cli_result2 = main.ONOScli2.start_onos_cli(ONOS2_ip)
-        cli_result3 = main.ONOScli3.start_onos_cli(ONOS3_ip)
-        cli_result4 = main.ONOScli4.start_onos_cli(ONOS4_ip)
-        cli_result5 = main.ONOScli5.start_onos_cli(ONOS5_ip)
-        cli_result6 = main.ONOScli6.start_onos_cli(ONOS6_ip)
-        cli_result7 = main.ONOScli7.start_onos_cli(ONOS7_ip)
-        cli_results = cli_result1 and cli_result2 and cli_result3 and\
-                cli_result4 and cli_result5 and cli_result6 and cli_result7
+        main.step( "Start Packet Capture MN" )
+        main.Mininet2.startTcpdump(
+            str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
+            + "-MN.pcap",
+            intf=main.params[ 'MNtcpdump' ][ 'intf' ],
+            port=main.params[ 'MNtcpdump' ][ 'port' ] )
 
-        main.step("Start Packet Capture MN")
-        main.Mininet2.start_tcpdump(
-                str(main.params['MNtcpdump']['folder'])+str(main.TEST)+"-MN.pcap",
-                intf = main.params['MNtcpdump']['intf'],
-                port = main.params['MNtcpdump']['port'])
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and onosInstallResult
+                        and onosIsupResult and cliResults )
 
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+                                 onpass="Test startup successful",
+                                 onfail="Test startup NOT successful" )
 
-        case1_result = (clean_install_result and package_result and
-                cell_result and verify_result and onos_install_result and
-                onos_isup_result and cli_results)
-
-        utilities.assert_equals(expect=main.TRUE, actual=case1_result,
-                onpass="Test startup successful",
-                onfail="Test startup NOT successful")
-
-
-        if case1_result==main.FALSE:
+        if case1Result == main.FALSE:
             main.cleanup()
             main.exit()
 
-    def CASE2(self,main) :
-        '''
+    def CASE2( self, main ):
+        """
         Assign mastership to controllers
-        '''
-        import time
-        import json
+        """
         import re
 
-        main.log.report("Assigning switches to controllers")
-        main.case("Assigning Controllers")
-        main.step("Assign switches to controllers")
+        main.log.report( "Assigning switches to controllers" )
+        main.case( "Assigning Controllers" )
+        main.step( "Assign switches to controllers" )
 
-        for i in range (1,29):
-           main.Mininet1.assign_sw_controller(sw=str(i),count=num_controllers,
-                    ip1=ONOS1_ip,port1=ONOS1_port,
-                    ip2=ONOS2_ip,port2=ONOS2_port,
-                    ip3=ONOS3_ip,port3=ONOS3_port,
-                    ip4=ONOS4_ip,port4=ONOS4_port,
-                    ip5=ONOS5_ip,port5=ONOS5_port,
-                    ip6=ONOS6_ip,port6=ONOS6_port,
-                    ip7=ONOS7_ip,port7=ONOS7_port)
+        for i in range( 1, 29 ):
+            main.Mininet1.assignSwController(
+                sw=str( i ),
+                count=numControllers,
+                ip1=ONOS1Ip, port1=ONOS1Port,
+                ip2=ONOS2Ip, port2=ONOS2Port,
+                ip3=ONOS3Ip, port3=ONOS3Port,
+                ip4=ONOS4Ip, port4=ONOS4Port,
+                ip5=ONOS5Ip, port5=ONOS5Port,
+                ip6=ONOS6Ip, port6=ONOS6Port,
+                ip7=ONOS7Ip, port7=ONOS7Port )
 
-        mastership_check = main.TRUE
-        for i in range (1,29):
-            response = main.Mininet1.get_sw_controller("s"+str(i))
+        mastershipCheck = main.TRUE
+        for i in range( 1, 29 ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
             try:
-                main.log.info(str(response))
-            except:
-                main.log.info(repr(response))
-            if re.search("tcp:"+ONOS1_ip,response)\
-                    and re.search("tcp:"+ONOS2_ip,response)\
-                    and re.search("tcp:"+ONOS3_ip,response)\
-                    and re.search("tcp:"+ONOS4_ip,response)\
-                    and re.search("tcp:"+ONOS5_ip,response)\
-                    and re.search("tcp:"+ONOS6_ip,response)\
-                    and re.search("tcp:"+ONOS7_ip,response):
-                mastership_check = mastership_check and main.TRUE
+                main.log.info( str( response ) )
+            except Exception:
+                main.log.info( repr( response ) )
+            if re.search( "tcp:" + ONOS1Ip, response )\
+                    and re.search( "tcp:" + ONOS2Ip, response )\
+                    and re.search( "tcp:" + ONOS3Ip, response )\
+                    and re.search( "tcp:" + ONOS4Ip, response )\
+                    and re.search( "tcp:" + ONOS5Ip, response )\
+                    and re.search( "tcp:" + ONOS6Ip, response )\
+                    and re.search( "tcp:" + ONOS7Ip, response ):
+                mastershipCheck = mastershipCheck and main.TRUE
             else:
-                mastership_check = main.FALSE
-        if mastership_check == main.TRUE:
-            main.log.report("Switch mastership assigned correctly")
-        utilities.assert_equals(expect = main.TRUE,actual=mastership_check,
-                onpass="Switch mastership assigned correctly",
-                onfail="Switches not assigned correctly to controllers")
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
+            main.log.report( "Switch mastership assigned correctly" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=mastershipCheck,
+            onpass="Switch mastership assigned correctly",
+            onfail="Switches not assigned correctly to controllers" )
 
-        #Manually assign mastership to the controller we want
-        role_call = main.TRUE
-        role_check = main.TRUE
+        # Manually assign mastership to the controller we want
+        roleCall = main.TRUE
+        roleCheck = main.TRUE
+        try:
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+            assert deviceId, "No device id for s1 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS1Ip )
+            # Check assignment
+            if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("1000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS1_ip)
-        if ONOS1_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+            assert deviceId, "No device id for s28 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS1Ip )
+            # Check assignment
+            if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("2800")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS1_ip)
-        if ONOS1_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+            assert deviceId, "No device id for s2 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS2Ip )
+            # Check assignment
+            if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("2000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS2_ip)
-        if ONOS2_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+            assert deviceId, "No device id for s3 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS2Ip )
+            # Check assignment
+            if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("3000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS2_ip)
-        if ONOS2_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+            assert deviceId, "No device id for s5 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS3Ip )
+            # Check assignment
+            if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("5000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS3_ip)
-        if ONOS3_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+            assert deviceId, "No device id for s6 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS3Ip )
+            # Check assignment
+            if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("6000")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS3_ip)
-        if ONOS3_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            # Assign switch
+            deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+            assert deviceId, "No device id for s4 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS4Ip )
+            # Check assignment
+            if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id =  main.ONOScli1.get_device("3004")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS4_ip)
-        if ONOS4_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            for i in range( 8, 18 ):
+                dpid = '3' + str( i ).zfill( 3 )
+                deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+                assert deviceId, "No device id for s%i in ONOS" % i
+                roleCall = roleCall and main.ONOScli1.deviceRole(
+                    deviceId,
+                    ONOS5Ip )
+                # Check assignment
+                if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                    roleCheck = roleCheck and main.TRUE
+                else:
+                    roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("3008")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+            assert deviceId, "No device id for s7 in ONOS"
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS6Ip )
+            # Check assignment
+            if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
+            else:
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device("3009")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+            for i in range( 18, 28 ):
+                dpid = '6' + str( i ).zfill( 3 )
+                deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+                assert deviceId, "No device id for s%i in ONOS" % i
+                roleCall = roleCall and main.ONOScli1.deviceRole(
+                    deviceId,
+                    ONOS7Ip )
+                # Check assignment
+                if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                    roleCheck = roleCheck and main.TRUE
+                else:
+                    roleCheck = roleCheck and main.FALSE
+        except ( AttributeError, AssertionError ):
+            main.log.exception( "Something is wrong with ONOS device view" )
+            main.log.info( main.ONOScli1.devices() )
 
-        device_id = main.ONOScli1.get_device("3010")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=roleCall,
+            onpass="Re-assigned switch mastership to designated controller",
+            onfail="Something wrong with deviceRole calls" )
 
-        device_id = main.ONOScli1.get_device("3011")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=roleCheck,
+            onpass="Switches were successfully reassigned to designated " +
+                   "controller",
+            onfail="Switches were not successfully reassigned" )
+        mastershipCheck = mastershipCheck and roleCall and roleCheck
+        utilities.assert_equals( expect=main.TRUE, actual=mastershipCheck,
+                                 onpass="Switch mastership correctly assigned",
+                                 onfail="Error in (re)assigning switch" +
+                                 " mastership" )
 
-        device_id = main.ONOScli1.get_device("3012")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3013")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3014")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3015")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3016")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("3017")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS5_ip)
-        if ONOS5_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6007")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS6_ip)
-        if ONOS6_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6018")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6019")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6020")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6021")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6022")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6023")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6024")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6025")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6026")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        device_id = main.ONOScli1.get_device("6027")['id']
-        role_call = role_call and main.ONOScli1.device_role(device_id, ONOS7_ip)
-        if ONOS7_ip in main.ONOScli1.get_role(device_id)['master']:
-            role_check = role_check and main.TRUE
-        else:
-            role_check = role_check and main.FALSE
-
-        utilities.assert_equals(expect = main.TRUE,actual=role_call,
-                onpass="Re-assigned switch mastership to designated controller",
-                onfail="Something wrong with device_role calls")
-
-        utilities.assert_equals(expect = main.TRUE,actual=role_check,
-                onpass="Switches were successfully reassigned to designated controller",
-                onfail="Switches were not successfully reassigned")
-        mastership_check = mastership_check and role_call and role_check
-        utilities.assert_equals(expect = main.TRUE,actual=mastership_check,
-                onpass="Switch mastership correctly assigned",
-                onfail="Error in (re)assigning switch mastership")
-
-
-    def CASE3(self,main) :
+    def CASE3( self, main ):
         """
         Assign intents
-
         """
         import time
         import json
-        import re
-        main.log.report("Adding host intents")
-        main.case("Adding host Intents")
+        main.log.report( "Adding host intents" )
+        main.case( "Adding host Intents" )
 
-        main.step("Discovering  Hosts( Via pingall for now)")
-        #FIXME: Once we have a host discovery mechanism, use that instead
+        main.step( "Discovering  Hosts( Via pingall for now )" )
+        # FIXME: Once we have a host discovery mechanism, use that instead
 
-        #install onos-app-fwd
-        main.log.info("Install reactive forwarding app")
-        main.ONOScli1.feature_install("onos-app-fwd")
-        main.ONOScli2.feature_install("onos-app-fwd")
-        main.ONOScli3.feature_install("onos-app-fwd")
-        main.ONOScli4.feature_install("onos-app-fwd")
-        main.ONOScli5.feature_install("onos-app-fwd")
-        main.ONOScli6.feature_install("onos-app-fwd")
-        main.ONOScli7.feature_install("onos-app-fwd")
+        # install onos-app-fwd
+        main.log.info( "Install reactive forwarding app" )
+        main.ONOScli1.featureInstall( "onos-app-fwd" )
+        main.ONOScli2.featureInstall( "onos-app-fwd" )
+        main.ONOScli3.featureInstall( "onos-app-fwd" )
+        main.ONOScli4.featureInstall( "onos-app-fwd" )
+        main.ONOScli5.featureInstall( "onos-app-fwd" )
+        main.ONOScli6.featureInstall( "onos-app-fwd" )
+        main.ONOScli7.featureInstall( "onos-app-fwd" )
 
-        #REACTIVE FWD test
-        ping_result = main.FALSE
+        # REACTIVE FWD test
+        pingResult = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=pingResult,
+            onpass="Reactive Pingall test passed",
+            onfail="Reactive Pingall failed, one or more ping pairs failed" )
         time2 = time.time()
-        main.log.info("Time for pingall: %2f seconds" % (time2 - time1))
+        main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
 
-        #uninstall onos-app-fwd
-        main.log.info("Uninstall reactive forwarding app")
-        main.ONOScli1.feature_uninstall("onos-app-fwd")
-        main.ONOScli2.feature_uninstall("onos-app-fwd")
-        main.ONOScli3.feature_uninstall("onos-app-fwd")
-        main.ONOScli4.feature_uninstall("onos-app-fwd")
-        main.ONOScli5.feature_uninstall("onos-app-fwd")
-        main.ONOScli6.feature_uninstall("onos-app-fwd")
-        main.ONOScli7.feature_uninstall("onos-app-fwd")
-        #timeout for fwd flows
-        time.sleep(10)
+        # uninstall onos-app-fwd
+        main.log.info( "Uninstall reactive forwarding app" )
+        main.ONOScli1.featureUninstall( "onos-app-fwd" )
+        main.ONOScli2.featureUninstall( "onos-app-fwd" )
+        main.ONOScli3.featureUninstall( "onos-app-fwd" )
+        main.ONOScli4.featureUninstall( "onos-app-fwd" )
+        main.ONOScli5.featureUninstall( "onos-app-fwd" )
+        main.ONOScli6.featureUninstall( "onos-app-fwd" )
+        main.ONOScli7.featureUninstall( "onos-app-fwd" )
+        # timeout for fwd flows
+        time.sleep( 10 )
 
-        main.step("Add  host intents")
-        #TODO:  move the host numbers to params
-        import json
-        intents_json= json.loads(main.ONOScli1.hosts())
-        intent_add_result = True
-        for i in range(8,18):
-            main.log.info("Adding host intent between h"+str(i)+" and h"+str(i+10))
-            host1 =  "00:00:00:00:00:" + str(hex(i)[2:]).zfill(2).upper()
-            host2 =  "00:00:00:00:00:" + str(hex(i+10)[2:]).zfill(2).upper()
-            host1_id = main.ONOScli1.get_host(host1)['id']
-            host2_id = main.ONOScli1.get_host(host2)['id']
-            #NOTE: get host can return None
-            if host1_id and host2_id:
-                tmp_result = main.ONOScli1.add_host_intent(host1_id, host2_id )
+        main.step( "Add  host intents" )
+        intentIds = []
+        # TODO:  move the host numbers to params
+        #        Maybe look at all the paths we ping?
+        intentAddResult = True
+        hostResult = main.TRUE
+        for i in range( 8, 18 ):
+            main.log.info( "Adding host intent between h" + str( i ) +
+                           " and h" + str( i + 10 ) )
+            host1 = "00:00:00:00:00:" + \
+                str( hex( i )[ 2: ] ).zfill( 2 ).upper()
+            host2 = "00:00:00:00:00:" + \
+                str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
+            # NOTE: getHost can return None
+            host1Dict = main.ONOScli1.getHost( host1 )
+            host2Dict = main.ONOScli1.getHost( host2 )
+            host1Id = None
+            host2Id = None
+            if host1Dict and host2Dict:
+                host1Id = host1Dict.get( 'id', None )
+                host2Id = host2Dict.get( 'id', None )
+            if host1Id and host2Id:
+                nodeNum = ( i % 7 ) + 1
+                node = getattr( main, ( 'ONOScli' + str( nodeNum ) ) )
+                tmpId = node.addHostIntent(
+                    host1Id,
+                    host2Id )
+                if tmpId:
+                    main.log.info( "Added intent with id: " + tmpId )
+                    intentIds.append( tmpId )
+                else:
+                    main.log.error( "addHostIntent reutrned None" )
             else:
-                main.log.error("Error, get_host() failed")
-                tmp_result = main.FALSE
-            intent_add_result = bool(intent_add_result and tmp_result)
-        utilities.assert_equals(expect=True, actual=intent_add_result,
-                onpass="Switch mastership correctly assigned",
-                onfail="Error in (re)assigning switch mastership")
-        #TODO Check if intents all exist in datastore
-        #NOTE: Do we need to print this once the test is working?
-        #main.log.info(json.dumps(json.loads(main.ONOScli1.intents(json_format=True)),
-        #    sort_keys=True, indent=4, separators=(',', ': ') ) )
+                main.log.error( "Error, getHost() failed" )
+                main.log.warn( json.dumps( json.loads( main.ONOScli1.hosts() ),
+                                           sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                hostResult = main.FALSE
+        onosIds = main.ONOScli1.getAllIntentsId()
+        main.log.info( "Submitted intents: " + str( intentIds ) )
+        main.log.info( "Intents in ONOS: " + str( onosIds ) )
+        for intent in intentIds:
+            if intent in onosIds:
+                pass  # intent submitted is still in onos
+            else:
+                intentAddResult = False
+        # Print the intent states
+        intents = main.ONOScli1.intents()
+        intentStates = []
+        installedCheck = True 
+        main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+        count = 0
+        for intent in json.loads( intents ):  # Iter through intents of a node
+            state = intent.get( 'state', None )
+            if "INSTALLED" not in state:
+                installedCheck = False
+            intentId = intent.get( 'id', None )
+            intentStates.append( ( intentId, state ) )
+        # add submitted intents not in the store
+        tmplist = [ i for i, s in intentStates ]
+        missingIntents = False
+        for i in intentIds:
+            if i not in tmplist:
+                intentStates.append( ( i, " - " ) )
+                missingIntents = True
+        intentStates.sort()
+        for i, s in intentStates:
+            count += 1
+            main.log.info( "%-6s%-15s%-15s" %
+                           ( str( count ), str( i ), str( s ) ) )
+        main.ONOScli1.leaders()
+        main.ONOScli1.partitions()
+        # for node in nodes:
+        #     node.pendingMap()
+        pendingMap = main.ONOScli1.pendingMap()
+        main.ONOScli2.pendingMap()
+        main.ONOScli3.pendingMap()
+        main.ONOScli4.pendingMap()
+        main.ONOScli5.pendingMap()
+        main.ONOScli6.pendingMap()
+        main.ONOScli7.pendingMap()
+        intentAddResult = bool( pingResult and hostResult and intentAddResult
+                                and not missingIntents and installedCheck )
+        utilities.assert_equals(
+            expect=True,
+            actual=intentAddResult,
+            onpass="Pushed host intents to ONOS",
+            onfail="Error in pushing host intents to ONOS" )
 
-    def CASE4(self,main) :
+        if not intentAddResult or "key" in pendingMap:
+            import time
+            installedCheck = True
+            main.log.info( "Sleeping 60 seconds to see if intents are found" )
+            time.sleep( 60 )
+            onosIds = main.ONOScli1.getAllIntentsId()
+            main.log.info( "Submitted intents: " + str( intentIds ) )
+            main.log.info( "Intents in ONOS: " + str( onosIds ) )
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            for intent in json.loads( intents ):
+                # Iter through intents of a node
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            # add submitted intents not in the store
+            tmplist = [ i for i, s in intentStates ]
+            for i in intentIds:
+                if i not in tmplist:
+                    intentStates.append( ( i, " - " ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.pendingMap()
+            main.ONOScli2.pendingMap()
+            main.ONOScli3.pendingMap()
+            main.ONOScli4.pendingMap()
+            main.ONOScli5.pendingMap()
+            main.ONOScli6.pendingMap()
+            main.ONOScli7.pendingMap()
+
+    def CASE4( self, main ):
         """
         Ping across added host intents
         """
-        description = " Ping across added host intents"
-        main.log.report(description)
-        main.case(description)
-        Ping_Result = main.TRUE
-        for i in range(8,18):
-            ping = main.Mininet1.pingHost(src="h"+str(i),target="h"+str(i+10))
-            Ping_Result = Ping_Result and ping
-            if ping==main.FALSE:
-                main.log.warn("Ping failed between h"+str(i)+" and h" + str(i+10))
-            elif ping==main.TRUE:
-                main.log.info("Ping test passed!")
-                Ping_Result = main.TRUE
-        if Ping_Result==main.FALSE:
-            main.log.report("Intents have not been installed correctly, pings failed.")
-        if Ping_Result==main.TRUE:
-            main.log.report("Intents have been installed correctly and verified by pings")
-        utilities.assert_equals(expect = main.TRUE,actual=Ping_Result,
-                onpass="Intents have been installed correctly and pings work",
-                onfail ="Intents have not been installed correctly, pings failed." )
-
-    def CASE5(self,main) :
-        '''
-        Reading state of ONOS
-        '''
-        import time
         import json
-        from subprocess import Popen, PIPE
-        from sts.topology.teston_topology import TestONTopology # assumes that sts is already in you PYTHONPATH
+        description = " Ping across added host intents"
+        main.log.report( description )
+        main.case( description )
+        PingResult = main.TRUE
+        for i in range( 8, 18 ):
+            ping = main.Mininet1.pingHost( src="h" + str( i ),
+                                           target="h" + str( i + 10 ) )
+            PingResult = PingResult and ping
+            if ping == main.FALSE:
+                main.log.warn( "Ping failed between h" + str( i ) +
+                               " and h" + str( i + 10 ) )
+            elif ping == main.TRUE:
+                main.log.info( "Ping test passed!" )
+                # Don't set PingResult or you'd override failures
+        if PingResult == main.FALSE:
+            main.log.report(
+                "Intents have not been installed correctly, pings failed." )
+            # TODO: pretty print
+            main.log.warn( "ONSO1 intents: " )
+            main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
+                                       sort_keys=True,
+                                       indent=4,
+                                       separators=( ',', ': ' ) ) )
+        if PingResult == main.TRUE:
+            main.log.report(
+                "Intents have been installed correctly and verified by pings" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=PingResult,
+            onpass="Intents have been installed correctly and pings work",
+            onfail="Intents have not been installed correctly, pings failed." )
 
-        main.log.report("Setting up and gathering data for current state")
-        main.case("Setting up and gathering data for current state")
-        #The general idea for this test case is to pull the state of (intents,flows, topology,...) from each ONOS node
-        #We can then compare them with eachother and also with past states
+        installedCheck = True
+        if PingResult is not main.TRUE:
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            # Iter through intents of a node
+            for intent in json.loads( intents ):
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.partitions()
+            main.ONOScli1.pendingMap()
+            main.ONOScli2.pendingMap()
+            main.ONOScli3.pendingMap()
+            main.ONOScli4.pendingMap()
+            main.ONOScli5.pendingMap()
+            main.ONOScli6.pendingMap()
+            main.ONOScli7.pendingMap()
+        if not installedCheck:
+            main.log.info( "Waiting 60 seconds to see if intent states change" )
+            time.sleep( 60 )
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            # Iter through intents of a node
+            for intent in json.loads( intents ):
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.partitions()
+            main.ONOScli1.pendingMap()
+            main.ONOScli2.pendingMap()
+            main.ONOScli3.pendingMap()
+            main.ONOScli4.pendingMap()
+            main.ONOScli5.pendingMap()
+            main.ONOScli6.pendingMap()
+            main.ONOScli7.pendingMap()
 
-        main.step("Get the Mastership of each switch from each controller")
-        global mastership_state
-        mastership_state = []
+    def CASE5( self, main ):
+        """
+        Reading state of ONOS
+        """
+        import json
+        # assumes that sts is already in you PYTHONPATH
+        from sts.topology.teston_topology import TestONTopology
 
-        #Assert that each device has a master
-        ONOS1_master_not_null = main.ONOScli1.roles_not_null()
-        ONOS2_master_not_null = main.ONOScli2.roles_not_null()
-        ONOS3_master_not_null = main.ONOScli3.roles_not_null()
-        ONOS4_master_not_null = main.ONOScli4.roles_not_null()
-        ONOS5_master_not_null = main.ONOScli5.roles_not_null()
-        ONOS6_master_not_null = main.ONOScli6.roles_not_null()
-        ONOS7_master_not_null = main.ONOScli7.roles_not_null()
-        roles_not_null = ONOS1_master_not_null and ONOS2_master_not_null and\
-                ONOS3_master_not_null and ONOS4_master_not_null and\
-                ONOS5_master_not_null and ONOS6_master_not_null and\
-                ONOS7_master_not_null
-        utilities.assert_equals(expect = main.TRUE,actual=roles_not_null,
-                onpass="Each device has a master",
-                onfail="Some devices don't have a master assigned")
+        main.log.report( "Setting up and gathering data for current state" )
+        main.case( "Setting up and gathering data for current state" )
+        # The general idea for this test case is to pull the state of
+        # ( intents,flows, topology,... ) from each ONOS node
+        # We can then compare them with eachother and also with past states
 
+        main.step( "Get the Mastership of each switch from each controller" )
+        global mastershipState
+        mastershipState = []
 
-        ONOS1_mastership = main.ONOScli1.roles()
-        ONOS2_mastership = main.ONOScli2.roles()
-        ONOS3_mastership = main.ONOScli3.roles()
-        ONOS4_mastership = main.ONOScli4.roles()
-        ONOS5_mastership = main.ONOScli5.roles()
-        ONOS6_mastership = main.ONOScli6.roles()
-        ONOS7_mastership = main.ONOScli7.roles()
-        #print json.dumps(json.loads(ONOS1_mastership), sort_keys=True, indent=4, separators=(',', ': '))
-        if "Error" in ONOS1_mastership or not ONOS1_mastership\
-                or "Error" in ONOS2_mastership or not ONOS2_mastership\
-                or "Error" in ONOS3_mastership or not ONOS3_mastership\
-                or "Error" in ONOS4_mastership or not ONOS4_mastership\
-                or "Error" in ONOS5_mastership or not ONOS5_mastership\
-                or "Error" in ONOS6_mastership or not ONOS6_mastership\
-                or "Error" in ONOS7_mastership or not ONOS7_mastership:
-                    main.log.report("Error in getting ONOS roles")
-                    main.log.warn("ONOS1 mastership response: " + repr(ONOS1_mastership))
-                    main.log.warn("ONOS2 mastership response: " + repr(ONOS2_mastership))
-                    main.log.warn("ONOS3 mastership response: " + repr(ONOS3_mastership))
-                    main.log.warn("ONOS4 mastership response: " + repr(ONOS4_mastership))
-                    main.log.warn("ONOS5 mastership response: " + repr(ONOS5_mastership))
-                    main.log.warn("ONOS6 mastership response: " + repr(ONOS6_mastership))
-                    main.log.warn("ONOS7 mastership response: " + repr(ONOS7_mastership))
-                    consistent_mastership = main.FALSE
-        elif ONOS1_mastership == ONOS2_mastership\
-                and ONOS1_mastership == ONOS3_mastership\
-                and ONOS1_mastership == ONOS4_mastership\
-                and ONOS1_mastership == ONOS5_mastership\
-                and ONOS1_mastership == ONOS6_mastership\
-                and ONOS1_mastership == ONOS7_mastership:
-                    mastership_state = ONOS1_mastership
-                    consistent_mastership = main.TRUE
-                    main.log.report("Switch roles are consistent across all ONOS nodes")
+        # Assert that each device has a master
+        ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
+        ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
+        ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
+        ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
+        ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
+        ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
+        ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
+        rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
+            ONOS3MasterNotNull and ONOS4MasterNotNull and\
+            ONOS5MasterNotNull and ONOS6MasterNotNull and\
+            ONOS7MasterNotNull
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=rolesNotNull,
+            onpass="Each device has a master",
+            onfail="Some devices don't have a master assigned" )
+
+        ONOS1Mastership = main.ONOScli1.roles()
+        ONOS2Mastership = main.ONOScli2.roles()
+        ONOS3Mastership = main.ONOScli3.roles()
+        ONOS4Mastership = main.ONOScli4.roles()
+        ONOS5Mastership = main.ONOScli5.roles()
+        ONOS6Mastership = main.ONOScli6.roles()
+        ONOS7Mastership = main.ONOScli7.roles()
+        if "Error" in ONOS1Mastership or not ONOS1Mastership\
+                or "Error" in ONOS2Mastership or not ONOS2Mastership\
+                or "Error" in ONOS3Mastership or not ONOS3Mastership\
+                or "Error" in ONOS4Mastership or not ONOS4Mastership\
+                or "Error" in ONOS5Mastership or not ONOS5Mastership\
+                or "Error" in ONOS6Mastership or not ONOS6Mastership\
+                or "Error" in ONOS7Mastership or not ONOS7Mastership:
+            main.log.report( "Error in getting ONOS roles" )
+            main.log.warn(
+                "ONOS1 mastership response: " +
+                repr( ONOS1Mastership ) )
+            main.log.warn(
+                "ONOS2 mastership response: " +
+                repr( ONOS2Mastership ) )
+            main.log.warn(
+                "ONOS3 mastership response: " +
+                repr( ONOS3Mastership ) )
+            main.log.warn(
+                "ONOS4 mastership response: " +
+                repr( ONOS4Mastership ) )
+            main.log.warn(
+                "ONOS5 mastership response: " +
+                repr( ONOS5Mastership ) )
+            main.log.warn(
+                "ONOS6 mastership response: " +
+                repr( ONOS6Mastership ) )
+            main.log.warn(
+                "ONOS7 mastership response: " +
+                repr( ONOS7Mastership ) )
+            consistentMastership = main.FALSE
+        elif ONOS1Mastership == ONOS2Mastership\
+                and ONOS1Mastership == ONOS3Mastership\
+                and ONOS1Mastership == ONOS4Mastership\
+                and ONOS1Mastership == ONOS5Mastership\
+                and ONOS1Mastership == ONOS6Mastership\
+                and ONOS1Mastership == ONOS7Mastership:
+            mastershipState = ONOS1Mastership
+            consistentMastership = main.TRUE
+            main.log.report(
+                "Switch roles are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 roles: ", json.dumps(json.loads(ONOS1_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 roles: ", json.dumps(json.loads(ONOS2_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 roles: ", json.dumps(json.loads(ONOS3_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 roles: ", json.dumps(json.loads(ONOS4_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 roles: ", json.dumps(json.loads(ONOS5_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 roles: ", json.dumps(json.loads(ONOS6_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 roles: ", json.dumps(json.loads(ONOS7_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            consistent_mastership = main.FALSE
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_mastership,
-                onpass="Switch roles are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of switch roles")
+            main.log.warn(
+                "ONOS1 roles: ",
+                json.dumps(
+                    json.loads( ONOS1Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS2 roles: ",
+                json.dumps(
+                    json.loads( ONOS2Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS3 roles: ",
+                json.dumps(
+                    json.loads( ONOS3Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS4 roles: ",
+                json.dumps(
+                    json.loads( ONOS4Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS5 roles: ",
+                json.dumps(
+                    json.loads( ONOS5Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS6 roles: ",
+                json.dumps(
+                    json.loads( ONOS6Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS7 roles: ",
+                json.dumps(
+                    json.loads( ONOS7Mastership ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            consistentMastership = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentMastership,
+            onpass="Switch roles are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of switch roles" )
 
-
-        main.step("Get the intents from each controller")
-        global intent_state
-        intent_state = []
-        ONOS1_intents = main.ONOScli1.intents( json_format=True )
-        ONOS2_intents = main.ONOScli2.intents( json_format=True )
-        ONOS3_intents = main.ONOScli3.intents( json_format=True )
-        ONOS4_intents = main.ONOScli4.intents( json_format=True )
-        ONOS5_intents = main.ONOScli5.intents( json_format=True )
-        ONOS6_intents = main.ONOScli6.intents( json_format=True )
-        ONOS7_intents = main.ONOScli7.intents( json_format=True )
-        intent_check = main.FALSE
-        if "Error" in ONOS1_intents or not ONOS1_intents\
-                or "Error" in ONOS2_intents or not ONOS2_intents\
-                or "Error" in ONOS3_intents or not ONOS3_intents\
-                or "Error" in ONOS4_intents or not ONOS4_intents\
-                or "Error" in ONOS5_intents or not ONOS5_intents\
-                or "Error" in ONOS6_intents or not ONOS6_intents\
-                or "Error" in ONOS7_intents or not ONOS7_intents:
-                    main.log.report("Error in getting ONOS intents")
-                    main.log.warn("ONOS1 intents response: " + repr(ONOS1_intents))
-                    main.log.warn("ONOS2 intents response: " + repr(ONOS2_intents))
-                    main.log.warn("ONOS3 intents response: " + repr(ONOS3_intents))
-                    main.log.warn("ONOS4 intents response: " + repr(ONOS4_intents))
-                    main.log.warn("ONOS5 intents response: " + repr(ONOS5_intents))
-                    main.log.warn("ONOS6 intents response: " + repr(ONOS6_intents))
-                    main.log.warn("ONOS7 intents response: " + repr(ONOS7_intents))
-        elif ONOS1_intents == ONOS2_intents\
-                and ONOS1_intents == ONOS3_intents\
-                and ONOS1_intents == ONOS4_intents\
-                and ONOS1_intents == ONOS5_intents\
-                and ONOS1_intents == ONOS6_intents\
-                and ONOS1_intents == ONOS7_intents:
-                    intent_state = ONOS1_intents
-                    intent_check = main.TRUE
-                    main.log.report("Intents are consistent across all ONOS nodes")
+        main.step( "Get the intents from each controller" )
+        global intentState
+        intentState = []
+        ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
+        ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
+        ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
+        ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
+        ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
+        ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
+        ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+        intentCheck = main.FALSE
+        if "Error" in ONOS1Intents or not ONOS1Intents\
+                or "Error" in ONOS2Intents or not ONOS2Intents\
+                or "Error" in ONOS3Intents or not ONOS3Intents\
+                or "Error" in ONOS4Intents or not ONOS4Intents\
+                or "Error" in ONOS5Intents or not ONOS5Intents\
+                or "Error" in ONOS6Intents or not ONOS6Intents\
+                or "Error" in ONOS7Intents or not ONOS7Intents:
+            main.log.report( "Error in getting ONOS intents" )
+            main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
+            main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
+            main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
+            main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
+            main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
+            main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
+            main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
+        elif ONOS1Intents == ONOS2Intents\
+                and ONOS1Intents == ONOS3Intents\
+                and ONOS1Intents == ONOS4Intents\
+                and ONOS1Intents == ONOS5Intents\
+                and ONOS1Intents == ONOS6Intents\
+                and ONOS1Intents == ONOS7Intents:
+            intentState = ONOS1Intents
+            intentCheck = main.TRUE
+            main.log.report( "Intents are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 intents: ", json.dumps(json.loads(ONOS1_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 intents: ", json.dumps(json.loads(ONOS2_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 intents: ", json.dumps(json.loads(ONOS3_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 intents: ", json.dumps(json.loads(ONOS4_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 intents: ", json.dumps(json.loads(ONOS5_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 intents: ", json.dumps(json.loads(ONOS6_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 intents: ", json.dumps(json.loads(ONOS7_intents),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-        utilities.assert_equals(expect = main.TRUE,actual=intent_check,
-                onpass="Intents are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of intents")
+            main.log.warn(
+                "ONOS1 intents: ",
+                json.dumps(
+                    json.loads( ONOS1Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS2 intents: ",
+                json.dumps(
+                    json.loads( ONOS2Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS3 intents: ",
+                json.dumps(
+                    json.loads( ONOS3Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS4 intents: ",
+                json.dumps(
+                    json.loads( ONOS4Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS5 intents: ",
+                json.dumps(
+                    json.loads( ONOS5Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS6 intents: ",
+                json.dumps(
+                    json.loads( ONOS6Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+            main.log.warn(
+                "ONOS7 intents: ",
+                json.dumps(
+                    json.loads( ONOS7Intents ),
+                    sort_keys=True,
+                    indent=4,
+                    separators=(
+                        ',',
+                        ': ' ) ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=intentCheck,
+            onpass="Intents are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of intents" )
 
+        main.step( "Get the flows from each controller" )
+        global flowState
+        flowState = []
+        flowCheck = main.FALSE
+        try:
+            ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
+            ONOS2Flows = main.ONOScli2.flows( jsonFormat=True )
+            ONOS3Flows = main.ONOScli3.flows( jsonFormat=True )
+            ONOS4Flows = main.ONOScli4.flows( jsonFormat=True )
+            ONOS5Flows = main.ONOScli5.flows( jsonFormat=True )
+            ONOS6Flows = main.ONOScli6.flows( jsonFormat=True )
+            ONOS7Flows = main.ONOScli7.flows( jsonFormat=True )
+            assert ONOS1Flows, "ONOS1 Flows should not be empty"
+            assert ONOS2Flows, "ONOS2 Flows should not be empty"
+            assert ONOS3Flows, "ONOS3 Flows should not be empty"
+            assert ONOS4Flows, "ONOS4 Flows should not be empty"
+            assert ONOS5Flows, "ONOS5 Flows should not be empty"
+            assert ONOS6Flows, "ONOS6 Flows should not be empty"
+            assert ONOS7Flows, "ONOS7 Flows should not be empty"
+            assert "Error" not in ONOS1Flows, "ONOS1 Flows contains 'Error'"
+            assert "Error" not in ONOS2Flows, "ONOS2 Flows contains 'Error'"
+            assert "Error" not in ONOS3Flows, "ONOS3 Flows contains 'Error'"
+            assert "Error" not in ONOS4Flows, "ONOS4 Flows contains 'Error'"
+            assert "Error" not in ONOS5Flows, "ONOS5 Flows contains 'Error'"
+            assert "Error" not in ONOS6Flows, "ONOS6 Flows contains 'Error'"
+            assert "Error" not in ONOS7Flows, "ONOS7 Flows contains 'Error'"
+            ONOS1FlowsJson = json.loads( ONOS1Flows )
+            ONOS2FlowsJson = json.loads( ONOS2Flows )
+            ONOS3FlowsJson = json.loads( ONOS3Flows )
+            ONOS4FlowsJson = json.loads( ONOS4Flows )
+            ONOS5FlowsJson = json.loads( ONOS5Flows )
+            ONOS6FlowsJson = json.loads( ONOS6Flows )
+            ONOS7FlowsJson = json.loads( ONOS7Flows )
+        except ( ValueError, AssertionError ):  # From json.loads, or asserts
+            main.log.exception( "One or more 'flows' responses from " +
+                                "ONOS couldn't be decoded." )
+            main.log.warn( "ONOS1 flows repsponse: " + ONOS1Flows )
+            main.log.warn( "ONOS2 flows repsponse: " + ONOS2Flows )
+            main.log.warn( "ONOS3 flows repsponse: " + ONOS3Flows )
+            main.log.warn( "ONOS4 flows repsponse: " + ONOS4Flows )
+            main.log.warn( "ONOS5 flows repsponse: " + ONOS5Flows )
+            main.log.warn( "ONOS6 flows repsponse: " + ONOS6Flows )
+            main.log.warn( "ONOS7 flows repsponse: " + ONOS7Flows )
+        else:  # No exceptions
+            if len( ONOS1FlowsJson ) == len( ONOS2FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS3FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS4FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS5FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS6FlowsJson )\
+                    and len( ONOS1FlowsJson ) == len( ONOS7FlowsJson ):
+                # TODO: Do a better check, maybe compare flows on switches?
+                # NOTE Possible issue with this not always being set?
+                flowState = ONOS1Flows
+                flowCheck = main.TRUE
+                main.log.report( "Flow count is consistent across all" +
+                                 " ONOS nodes" )
+            else:
+                main.log.warn( "ONOS1 flows: " +
+                               json.dumps( ONOS1FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS2 flows: " +
+                               json.dumps( ONOS2FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS3 flows: " +
+                               json.dumps( ONOS3FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS4 flows: " +
+                               json.dumps( ONOS4FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS5 flows: " +
+                               json.dumps( ONOS5FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS6 flows: " +
+                               json.dumps( ONOS6FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                main.log.warn( "ONOS7 flows: " +
+                               json.dumps( ONOS7FlowsJson, sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=flowCheck,
+            onpass="The flow count is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different flow counts" )
 
-        main.step("Get the flows from each controller")
-        global flow_state
-        flow_state = []
-        ONOS1_flows = main.ONOScli1.flows( json_format=True )
-        ONOS2_flows = main.ONOScli2.flows( json_format=True )
-        ONOS3_flows = main.ONOScli3.flows( json_format=True )
-        ONOS4_flows = main.ONOScli4.flows( json_format=True )
-        ONOS5_flows = main.ONOScli5.flows( json_format=True )
-        ONOS6_flows = main.ONOScli6.flows( json_format=True )
-        ONOS7_flows = main.ONOScli7.flows( json_format=True )
-        flow_check = main.FALSE
-        if "Error" in ONOS1_flows or not ONOS1_flows\
-                or "Error" in ONOS2_flows or not ONOS2_flows\
-                or "Error" in ONOS3_flows or not ONOS3_flows\
-                or "Error" in ONOS4_flows or not ONOS4_flows\
-                or "Error" in ONOS5_flows or not ONOS5_flows\
-                or "Error" in ONOS6_flows or not ONOS6_flows\
-                or "Error" in ONOS7_flows or not ONOS7_flows:
-                    main.log.report("Error in getting ONOS intents")
-                    main.log.warn("ONOS1 flows repsponse: "+ ONOS1_flows)
-                    main.log.warn("ONOS2 flows repsponse: "+ ONOS2_flows)
-                    main.log.warn("ONOS3 flows repsponse: "+ ONOS3_flows)
-                    main.log.warn("ONOS4 flows repsponse: "+ ONOS4_flows)
-                    main.log.warn("ONOS5 flows repsponse: "+ ONOS5_flows)
-                    main.log.warn("ONOS6 flows repsponse: "+ ONOS6_flows)
-                    main.log.warn("ONOS7 flows repsponse: "+ ONOS7_flows)
-        elif len(json.loads(ONOS1_flows)) == len(json.loads(ONOS2_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS3_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS4_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS5_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS6_flows))\
-                and len(json.loads(ONOS1_flows)) == len(json.loads(ONOS7_flows)):
-                #TODO: Do a better check, maybe compare flows on switches?
-                    flow_state = ONOS1_flows
-                    flow_check = main.TRUE
-                    main.log.report("Flow count is consistent across all ONOS nodes")
-        else:
-            main.log.warn("ONOS1 flows: "+ json.dumps(json.loads(ONOS1_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 flows: "+ json.dumps(json.loads(ONOS2_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 flows: "+ json.dumps(json.loads(ONOS3_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 flows: "+ json.dumps(json.loads(ONOS4_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 flows: "+ json.dumps(json.loads(ONOS5_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 flows: "+ json.dumps(json.loads(ONOS6_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 flows: "+ json.dumps(json.loads(ONOS7_flows),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-        utilities.assert_equals(expect = main.TRUE,actual=flow_check,
-                onpass="The flow count is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different flow counts")
-
-
-        main.step("Get the OF Table entries")
+        main.step( "Get the OF Table entries" )
         global flows
-        flows=[]
-        for i in range(1,29):
-            flows.append(main.Mininet2.get_flowTable(1.3, "s"+str(i)))
+        flows = []
+        for i in range( 1, 29 ):
+            flows.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
+        if flowCheck == main.FALSE:
+            for table in flows:
+                main.log.warn( table )
+        # TODO: Compare switch flow tables with ONOS flow tables
 
-        #TODO: Compare switch flow tables with ONOS flow tables
+        main.step( "Start continuous pings" )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source1' ],
+            target=main.params[ 'PING' ][ 'target1' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source2' ],
+            target=main.params[ 'PING' ][ 'target2' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source3' ],
+            target=main.params[ 'PING' ][ 'target3' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source4' ],
+            target=main.params[ 'PING' ][ 'target4' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source5' ],
+            target=main.params[ 'PING' ][ 'target5' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source6' ],
+            target=main.params[ 'PING' ][ 'target6' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source7' ],
+            target=main.params[ 'PING' ][ 'target7' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source8' ],
+            target=main.params[ 'PING' ][ 'target8' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source9' ],
+            target=main.params[ 'PING' ][ 'target9' ],
+            pingTime=500 )
+        main.Mininet2.pingLong(
+            src=main.params[ 'PING' ][ 'source10' ],
+            target=main.params[ 'PING' ][ 'target10' ],
+            pingTime=500 )
 
-        main.step("Start continuous pings")
-        main.Mininet2.pingLong(src=main.params['PING']['source1'],
-                            target=main.params['PING']['target1'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source2'],
-                            target=main.params['PING']['target2'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source3'],
-                            target=main.params['PING']['target3'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source4'],
-                            target=main.params['PING']['target4'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source5'],
-                            target=main.params['PING']['target5'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source6'],
-                            target=main.params['PING']['target6'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source7'],
-                            target=main.params['PING']['target7'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source8'],
-                            target=main.params['PING']['target8'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source9'],
-                            target=main.params['PING']['target9'],pingTime=500)
-        main.Mininet2.pingLong(src=main.params['PING']['source10'],
-                            target=main.params['PING']['target10'],pingTime=500)
-
-        main.step("Create TestONTopology object")
+        main.step( "Create TestONTopology object" )
         ctrls = []
         count = 1
         while True:
             temp = ()
-            if ('ip' + str(count)) in main.params['CTRL']:
-                temp = temp + (getattr(main,('ONOS' + str(count))),)
-                temp = temp + ("ONOS"+str(count),)
-                temp = temp + (main.params['CTRL']['ip'+str(count)],)
-                temp = temp + (eval(main.params['CTRL']['port'+str(count)]),)
-                ctrls.append(temp)
+            if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
+                temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
+                temp = temp + ( "ONOS" + str( count ), )
+                temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
+                temp = temp + \
+                    ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+                ctrls.append( temp )
                 count = count + 1
             else:
                 break
-        MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        MNTopo = TestONTopology(
+            main.Mininet1,
+            ctrls )  # can also add Intent API info for intent operations
 
-        main.step("Collecting topology information from ONOS")
+        main.step( "Collecting topology information from ONOS" )
         devices = []
         devices.append( main.ONOScli1.devices() )
         devices.append( main.ONOScli2.devices() )
@@ -816,13 +1112,13 @@
         devices.append( main.ONOScli6.devices() )
         devices.append( main.ONOScli7.devices() )
         hosts = []
-        hosts.append( main.ONOScli1.hosts() )
-        hosts.append( main.ONOScli2.hosts() )
-        hosts.append( main.ONOScli3.hosts() )
-        hosts.append( main.ONOScli4.hosts() )
-        hosts.append( main.ONOScli5.hosts() )
-        hosts.append( main.ONOScli6.hosts() )
-        hosts.append( main.ONOScli7.hosts() )
+        hosts.append( json.loads( main.ONOScli1.hosts() ) )
+        hosts.append( json.loads( main.ONOScli2.hosts() ) )
+        hosts.append( json.loads( main.ONOScli3.hosts() ) )
+        hosts.append( json.loads( main.ONOScli4.hosts() ) )
+        hosts.append( json.loads( main.ONOScli5.hosts() ) )
+        hosts.append( json.loads( main.ONOScli6.hosts() ) )
+        hosts.append( json.loads( main.ONOScli7.hosts() ) )
         ports = []
         ports.append( main.ONOScli1.ports() )
         ports.append( main.ONOScli2.ports() )
@@ -847,441 +1143,543 @@
         clusters.append( main.ONOScli5.clusters() )
         clusters.append( main.ONOScli6.clusters() )
         clusters.append( main.ONOScli7.clusters() )
-        paths = []
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli1.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli2.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli3.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli4.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli5.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli6.topology() )
-        paths.append( temp_topo.get('paths', False) )
-        temp_topo = main.ONOSbench.get_topology( main.ONOScli7.topology() )
-        paths.append( temp_topo.get('paths', False) )
+        # Compare json objects for hosts and dataplane clusters
 
-        #Compare json objects for hosts, dataplane clusters and paths
-
-        #hosts
-        consistent_hosts_result = main.TRUE
+        # hosts
+        consistentHostsResult = main.TRUE
         for controller in range( len( hosts ) ):
-            if not "Error" in hosts[controller]:
-                if hosts[controller] == hosts[0]:
+            controllerStr = str( controller + 1 )
+            if "Error" not in hosts[ controller ]:
+                if hosts[ controller ] == hosts[ 0 ]:
                     continue
-                else:#hosts not consistent
-                    main.log.report("hosts from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                    main.log.warn( repr( hosts[controller] ) )
-                    consistent_hosts_result = main.FALSE
+                else:  # hosts not consistent
+                    main.log.report( "hosts from ONOS" +
+                                     controllerStr +
+                                     " is inconsistent with ONOS1" )
+                    main.log.warn( repr( hosts[ controller ] ) )
+                    consistentHostsResult = main.FALSE
 
             else:
-                main.log.report("Error in getting ONOS hosts from ONOS" + str(controller + 1) )
-                consistent_hosts_result = main.FALSE
-                main.log.warn("ONOS" + str(controller + 1) + " hosts response: " + repr(hosts[controller]) )
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_hosts_result,
-                onpass="Hosts view is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of hosts")
+                main.log.report( "Error in getting ONOS hosts from ONOS" +
+                                 controllerStr )
+                consistentHostsResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
+                               " hosts response: " +
+                               repr( hosts[ controller ] ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentHostsResult,
+            onpass="Hosts view is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of hosts" )
 
-        #Strongly connected clusters of devices
-        consistent_clusters_result = main.TRUE
+        ipResult = main.TRUE
+        for controller in range( 0, len( hosts ) ):
+            controllerStr = str( controller + 1 )
+            for host in hosts[ controller ]:
+                if host.get( 'ips', [] ) == []:
+                    main.log.error(
+                        "DEBUG:Error with host ips on controller" +
+                        controllerStr + ": " + str( host ) )
+                    ipResult = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=ipResult,
+            onpass="The ips of the hosts aren't empty",
+            onfail="The ip of at least one host is missing" )
+
+        # Strongly connected clusters of devices
+        consistentClustersResult = main.TRUE
         for controller in range( len( clusters ) ):
-            if not "Error" in clusters[controller]:
-                if clusters[controller] == clusters[0]:
+            if "Error" not in clusters[ controller ]:
+                if clusters[ controller ] == clusters[ 0 ]:
                     continue
-                else:#clusters not consistent
-                    main.log.report("clusters from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                    consistent_clusters_result = main.FALSE
+                else:  # clusters not consistent
+                    main.log.report( "clusters from ONOS" +
+                                     controllerStr +
+                                     " is inconsistent with ONOS1" )
+                    consistentClustersResult = main.FALSE
 
             else:
-                main.log.report("Error in getting dataplane clusters from ONOS" + str(controller + 1) )
-                consistent_clusters_result = main.FALSE
-                main.log.warn("ONOS" + str(controller + 1) + " clusters response: " + repr(clusters[controller]) )
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_clusters_result,
-                onpass="Clusters view is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of clusters")
-        num_clusters =  len(json.loads(clusters[0])) #there should always only be one cluster
-        utilities.assert_equals(expect = 1, actual = num_clusters,
-                onpass="ONOS shows 1 SCC",
-                onfail="ONOS shows "+str(num_clusters) +" SCCs")
+                main.log.report( "Error in getting dataplane clusters " +
+                                 "from ONOS" + controllerStr )
+                consistentClustersResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
+                               " clusters response: " +
+                               repr( clusters[ controller ] ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentClustersResult,
+            onpass="Clusters view is consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of clusters" )
+        # there should always only be one cluster
+        numClusters = len( json.loads( clusters[ 0 ] ) )
+        clusterResults = main.FALSE
+        if numClusters == 1:
+            clusterResults = main.TRUE
+        utilities.assert_equals(
+            expect=1,
+            actual=numClusters,
+            onpass="ONOS shows 1 SCC",
+            onfail="ONOS shows " + str( numClusters ) + " SCCs" )
 
-
-        #paths
-        consistent_paths_result = main.TRUE
-        for controller in range( len( paths ) ):
-            if not "Error" in paths[controller]:
-                if paths[controller] == paths[0]:
-                    continue
-                else:#paths not consistent
-                    main.log.report("paths from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                    consistent_paths_result = main.FALSE
-
+        main.step( "Comparing ONOS topology to MN" )
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = main.TRUE
+        for controller in range( numControllers ):
+            controllerStr = str( controller + 1 )
+            if devices[ controller ] or "Error" not in devices[ controller ]:
+                currentDevicesResult = main.Mininet1.compareSwitches(
+                    MNTopo,
+                    json.loads(
+                        devices[ controller ] ) )
             else:
-                main.log.report("Error in getting paths from ONOS" + str(controller + 1) )
-                consistent_paths_result = main.FALSE
-                main.log.warn("ONOS" + str(controller + 1) + " paths response: " + repr(paths[controller]) )
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_paths_result,
-                onpass="Paths count is consistent across all ONOS nodes",
-                onfail="ONOS nodes have different counts of paths")
+                currentDevicesResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentDevicesResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " Switches view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " Switches view is incorrect" )
 
-
-        main.step("Comparing ONOS topology to MN")
-        devices_results = main.TRUE
-        ports_results = main.TRUE
-        links_results = main.TRUE
-        for controller in range(num_controllers):
-            if devices[controller] or not "Error" in devices[controller]:
-                current_devices_result =  main.Mininet1.compare_switches(MNTopo, json.loads(devices[controller]))
+            if ports[ controller ] or "Error" not in ports[ controller ]:
+                currentPortsResult = main.Mininet1.comparePorts(
+                    MNTopo,
+                    json.loads(
+                        ports[ controller ] ) )
             else:
-                current_devices_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_devices_result,
-                    onpass="ONOS"+str(int(controller+1))+" Switches view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" Switches view is incorrect")
+                currentPortsResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentPortsResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " ports view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " ports view is incorrect" )
 
-            if ports[controller] or not "Error" in ports[controller]:
-                current_ports_result =  main.Mininet1.compare_ports(MNTopo, json.loads(ports[controller]))
+            if links[ controller ] or "Error" not in links[ controller ]:
+                currentLinksResult = main.Mininet1.compareLinks(
+                    MNTopo,
+                    json.loads(
+                        links[ controller ] ) )
             else:
-                current_ports_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_ports_result,
-                    onpass="ONOS"+str(int(controller+1))+" ports view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" ports view is incorrect")
+                currentLinksResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentLinksResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " links view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " links view is incorrect" )
 
-            if links[controller] or not "Error" in links[controller]:
-                current_links_result =  main.Mininet1.compare_links(MNTopo, json.loads(links[controller]))
-            else:
-                current_links_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_links_result,
-                    onpass="ONOS"+str(int(controller+1))+" links view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" links view is incorrect")
+            devicesResults = devicesResults and currentDevicesResult
+            portsResults = portsResults and currentPortsResult
+            linksResults = linksResults and currentLinksResult
 
-            devices_results = devices_results and current_devices_result
-            ports_results = ports_results and current_ports_result
-            links_results = links_results and current_links_result
+        topoResult = devicesResults and portsResults and linksResults\
+                     and consistentHostsResult and consistentClustersResult\
+                     and clusterResults and ipResult
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                 onpass="Topology Check Test successful",
+                                 onfail="Topology Check Test NOT successful" )
 
-        topo_result = devices_results and ports_results and links_results\
-                and consistent_hosts_result and consistent_clusters_result\
-                and consistent_paths_result
-        utilities.assert_equals(expect=main.TRUE, actual=topo_result,
-                onpass="Topology Check Test successful",
-                onfail="Topology Check Test NOT successful")
+        finalAssert = main.TRUE
+        finalAssert = finalAssert and topoResult and flowCheck \
+                      and intentCheck and consistentMastership and rolesNotNull
+        utilities.assert_equals( expect=main.TRUE, actual=finalAssert,
+                                 onpass="State check successful",
+                                 onfail="State check NOT successful" )
 
-        final_assert = main.TRUE
-        final_assert = final_assert and topo_result and flow_check \
-                and intent_check and consistent_mastership and roles_not_null
-        utilities.assert_equals(expect=main.TRUE, actual=final_assert,
-                onpass="State check successful",
-                onfail="State check NOT successful")
-
-
-    def CASE6(self,main) :
-        '''
+    def CASE6( self, main ):
+        """
         The Failure case. Since this is the Sanity test, we do nothing.
-        '''
+        """
         import time
-        main.log.report("Wait 60 seconds instead of inducing a failure")
-        time.sleep(60)
-        utilities.assert_equals(expect=main.TRUE, actual=main.TRUE,
-                onpass="Sleeping 60 seconds",
-                onfail="Something is terribly wrong with my math")
+        main.log.report( "Wait 60 seconds instead of inducing a failure" )
+        time.sleep( 60 )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=main.TRUE,
+            onpass="Sleeping 60 seconds",
+            onfail="Something is terribly wrong with my math" )
 
-    def CASE7(self,main) :
-        '''
+    def CASE7( self, main ):
+        """
         Check state after ONOS failure
-        '''
-        import os
+        """
         import json
-        main.case("Running ONOS Constant State Tests")
+        main.case( "Running ONOS Constant State Tests" )
 
-        #Assert that each device has a master
-        ONOS1_master_not_null = main.ONOScli1.roles_not_null()
-        ONOS2_master_not_null = main.ONOScli2.roles_not_null()
-        ONOS3_master_not_null = main.ONOScli3.roles_not_null()
-        ONOS4_master_not_null = main.ONOScli4.roles_not_null()
-        ONOS5_master_not_null = main.ONOScli5.roles_not_null()
-        ONOS6_master_not_null = main.ONOScli6.roles_not_null()
-        ONOS7_master_not_null = main.ONOScli7.roles_not_null()
-        roles_not_null = ONOS1_master_not_null and ONOS2_master_not_null and\
-                ONOS3_master_not_null and ONOS4_master_not_null and\
-                ONOS5_master_not_null and ONOS6_master_not_null and\
-                ONOS7_master_not_null
-        utilities.assert_equals(expect = main.TRUE,actual=roles_not_null,
-                onpass="Each device has a master",
-                onfail="Some devices don't have a master assigned")
+        # Assert that each device has a master
+        ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
+        ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
+        ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
+        ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
+        ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
+        ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
+        ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
+        rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
+            ONOS3MasterNotNull and ONOS4MasterNotNull and\
+            ONOS5MasterNotNull and ONOS6MasterNotNull and\
+            ONOS7MasterNotNull
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=rolesNotNull,
+            onpass="Each device has a master",
+            onfail="Some devices don't have a master assigned" )
 
-
-
-        main.step("Check if switch roles are consistent across all nodes")
-        ONOS1_mastership = main.ONOScli1.roles()
-        ONOS2_mastership = main.ONOScli2.roles()
-        ONOS3_mastership = main.ONOScli3.roles()
-        ONOS4_mastership = main.ONOScli4.roles()
-        ONOS5_mastership = main.ONOScli5.roles()
-        ONOS6_mastership = main.ONOScli6.roles()
-        ONOS7_mastership = main.ONOScli7.roles()
-        #print json.dumps(json.loads(ONOS1_mastership), sort_keys=True, indent=4, separators=(',', ': '))
-        if "Error" in ONOS1_mastership or not ONOS1_mastership\
-                or "Error" in ONOS2_mastership or not ONOS2_mastership\
-                or "Error" in ONOS3_mastership or not ONOS3_mastership\
-                or "Error" in ONOS4_mastership or not ONOS4_mastership\
-                or "Error" in ONOS5_mastership or not ONOS5_mastership\
-                or "Error" in ONOS6_mastership or not ONOS6_mastership\
-                or "Error" in ONOS7_mastership or not ONOS7_mastership:
-                    main.log.error("Error in getting ONOS mastership")
-                    main.log.warn("ONOS1 mastership response: " + repr(ONOS1_mastership))
-                    main.log.warn("ONOS2 mastership response: " + repr(ONOS2_mastership))
-                    main.log.warn("ONOS3 mastership response: " + repr(ONOS3_mastership))
-                    main.log.warn("ONOS4 mastership response: " + repr(ONOS4_mastership))
-                    main.log.warn("ONOS5 mastership response: " + repr(ONOS5_mastership))
-                    main.log.warn("ONOS6 mastership response: " + repr(ONOS6_mastership))
-                    main.log.warn("ONOS7 mastership response: " + repr(ONOS7_mastership))
-                    consistent_mastership = main.FALSE
-        elif ONOS1_mastership == ONOS2_mastership\
-                and ONOS1_mastership == ONOS3_mastership\
-                and ONOS1_mastership == ONOS4_mastership\
-                and ONOS1_mastership == ONOS5_mastership\
-                and ONOS1_mastership == ONOS6_mastership\
-                and ONOS1_mastership == ONOS7_mastership:
-                    consistent_mastership = main.TRUE
-                    main.log.report("Switch roles are consistent across all ONOS nodes")
+        main.step( "Check if switch roles are consistent across all nodes" )
+        ONOS1Mastership = main.ONOScli1.roles()
+        ONOS2Mastership = main.ONOScli2.roles()
+        ONOS3Mastership = main.ONOScli3.roles()
+        ONOS4Mastership = main.ONOScli4.roles()
+        ONOS5Mastership = main.ONOScli5.roles()
+        ONOS6Mastership = main.ONOScli6.roles()
+        ONOS7Mastership = main.ONOScli7.roles()
+        if "Error" in ONOS1Mastership or not ONOS1Mastership\
+                or "Error" in ONOS2Mastership or not ONOS2Mastership\
+                or "Error" in ONOS3Mastership or not ONOS3Mastership\
+                or "Error" in ONOS4Mastership or not ONOS4Mastership\
+                or "Error" in ONOS5Mastership or not ONOS5Mastership\
+                or "Error" in ONOS6Mastership or not ONOS6Mastership\
+                or "Error" in ONOS7Mastership or not ONOS7Mastership:
+            main.log.error( "Error in getting ONOS mastership" )
+            main.log.warn( "ONOS1 mastership response: " +
+                           repr( ONOS1Mastership ) )
+            main.log.warn( "ONOS2 mastership response: " +
+                           repr( ONOS2Mastership ) )
+            main.log.warn( "ONOS3 mastership response: " +
+                           repr( ONOS3Mastership ) )
+            main.log.warn( "ONOS4 mastership response: " +
+                           repr( ONOS4Mastership ) )
+            main.log.warn( "ONOS5 mastership response: " +
+                           repr( ONOS5Mastership ) )
+            main.log.warn( "ONOS6 mastership response: " +
+                           repr( ONOS6Mastership ) )
+            main.log.warn( "ONOS7 mastership response: " +
+                           repr( ONOS7Mastership ) )
+            consistentMastership = main.FALSE
+        elif ONOS1Mastership == ONOS2Mastership\
+                and ONOS1Mastership == ONOS3Mastership\
+                and ONOS1Mastership == ONOS4Mastership\
+                and ONOS1Mastership == ONOS5Mastership\
+                and ONOS1Mastership == ONOS6Mastership\
+                and ONOS1Mastership == ONOS7Mastership:
+            consistentMastership = main.TRUE
+            main.log.report(
+                "Switch roles are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 roles: ", json.dumps(json.loads(ONOS1_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS2 roles: ", json.dumps(json.loads(ONOS2_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS3 roles: ", json.dumps(json.loads(ONOS3_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS4 roles: ", json.dumps(json.loads(ONOS4_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS5 roles: ", json.dumps(json.loads(ONOS5_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS6 roles: ", json.dumps(json.loads(ONOS6_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            main.log.warn("ONOS7 roles: ", json.dumps(json.loads(ONOS7_mastership),
-                sort_keys=True, indent=4, separators=(',', ': ')))
-            consistent_mastership = main.FALSE
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_mastership,
-                onpass="Switch roles are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of switch roles")
-
+            main.log.warn( "ONOS1 roles: ", json.dumps(
+                json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS2 roles: ", json.dumps(
+                json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS3 roles: ", json.dumps(
+                json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS4 roles: ", json.dumps(
+                json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS5 roles: ", json.dumps(
+                json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS6 roles: ", json.dumps(
+                json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            main.log.warn( "ONOS7 roles: ", json.dumps(
+                json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
+                separators=( ',', ': ' ) ) )
+            consistentMastership = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentMastership,
+            onpass="Switch roles are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of switch roles" )
 
         description2 = "Compare switch roles from before failure"
-        main.step(description2)
+        main.step( description2 )
 
-        current_json = json.loads(ONOS1_mastership)
-        old_json = json.loads(mastership_state)
-        mastership_check = main.TRUE
-        for i in range(1,29):
-            switchDPID = str(main.Mininet1.getSwitchDPID(switch="s"+str(i)))
+        currentJson = json.loads( ONOS1Mastership )
+        oldJson = json.loads( mastershipState )
+        mastershipCheck = main.TRUE
+        for i in range( 1, 29 ):
+            switchDPID = str(
+                main.Mininet1.getSwitchDPID(
+                    switch="s" +
+                    str( i ) ) )
 
-            current = [switch['master'] for switch in current_json if switchDPID in switch['id']]
-            old = [switch['master'] for switch in old_json if switchDPID in switch['id']]
+            current = [ switch[ 'master' ] for switch in currentJson
+                        if switchDPID in switch[ 'id' ] ]
+            old = [ switch[ 'master' ] for switch in oldJson
+                    if switchDPID in switch[ 'id' ] ]
             if current == old:
-                mastership_check = mastership_check and main.TRUE
+                mastershipCheck = mastershipCheck and main.TRUE
             else:
-                main.log.warn("Mastership of switch %s changed" % switchDPID)
-                mastership_check = main.FALSE
-        if mastership_check == main.TRUE:
-            main.log.report("Mastership of Switches was not changed")
-        utilities.assert_equals(expect=main.TRUE,actual=mastership_check,
-                onpass="Mastership of Switches was not changed",
-                onfail="Mastership of some switches changed")
-        mastership_check = mastership_check and consistent_mastership
+                main.log.warn( "Mastership of switch %s changed" % switchDPID )
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
+            main.log.report( "Mastership of Switches was not changed" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=mastershipCheck,
+            onpass="Mastership of Switches was not changed",
+            onfail="Mastership of some switches changed" )
+        mastershipCheck = mastershipCheck and consistentMastership
 
-
-
-        main.step("Get the intents and compare across all nodes")
-        ONOS1_intents = main.ONOScli1.intents( json_format=True )
-        ONOS2_intents = main.ONOScli2.intents( json_format=True )
-        ONOS3_intents = main.ONOScli3.intents( json_format=True )
-        ONOS4_intents = main.ONOScli4.intents( json_format=True )
-        ONOS5_intents = main.ONOScli5.intents( json_format=True )
-        ONOS6_intents = main.ONOScli6.intents( json_format=True )
-        ONOS7_intents = main.ONOScli7.intents( json_format=True )
-        intent_check = main.FALSE
-        if "Error" in ONOS1_intents or not ONOS1_intents\
-                or "Error" in ONOS2_intents or not ONOS2_intents\
-                or "Error" in ONOS3_intents or not ONOS3_intents\
-                or "Error" in ONOS4_intents or not ONOS4_intents\
-                or "Error" in ONOS5_intents or not ONOS5_intents\
-                or "Error" in ONOS6_intents or not ONOS6_intents\
-                or "Error" in ONOS7_intents or not ONOS7_intents:
-                    main.log.report("Error in getting ONOS intents")
-                    main.log.warn("ONOS1 intents response: " + repr(ONOS1_intents))
-                    main.log.warn("ONOS2 intents response: " + repr(ONOS2_intents))
-                    main.log.warn("ONOS3 intents response: " + repr(ONOS3_intents))
-                    main.log.warn("ONOS4 intents response: " + repr(ONOS4_intents))
-                    main.log.warn("ONOS5 intents response: " + repr(ONOS5_intents))
-                    main.log.warn("ONOS6 intents response: " + repr(ONOS6_intents))
-                    main.log.warn("ONOS7 intents response: " + repr(ONOS7_intents))
-        elif ONOS1_intents == ONOS2_intents\
-                and ONOS1_intents == ONOS3_intents\
-                and ONOS1_intents == ONOS4_intents\
-                and ONOS1_intents == ONOS5_intents\
-                and ONOS1_intents == ONOS6_intents\
-                and ONOS1_intents == ONOS7_intents:
-                    intent_check = main.TRUE
-                    main.log.report("Intents are consistent across all ONOS nodes")
+        main.step( "Get the intents and compare across all nodes" )
+        ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
+        ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
+        ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
+        ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
+        ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
+        ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
+        ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+        intentCheck = main.FALSE
+        if "Error" in ONOS1Intents or not ONOS1Intents\
+                or "Error" in ONOS2Intents or not ONOS2Intents\
+                or "Error" in ONOS3Intents or not ONOS3Intents\
+                or "Error" in ONOS4Intents or not ONOS4Intents\
+                or "Error" in ONOS5Intents or not ONOS5Intents\
+                or "Error" in ONOS6Intents or not ONOS6Intents\
+                or "Error" in ONOS7Intents or not ONOS7Intents:
+            main.log.report( "Error in getting ONOS intents" )
+            main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
+            main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
+            main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
+            main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
+            main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
+            main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
+            main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
+        elif ONOS1Intents == ONOS2Intents\
+                and ONOS1Intents == ONOS3Intents\
+                and ONOS1Intents == ONOS4Intents\
+                and ONOS1Intents == ONOS5Intents\
+                and ONOS1Intents == ONOS6Intents\
+                and ONOS1Intents == ONOS7Intents:
+            intentCheck = main.TRUE
+            main.log.report( "Intents are consistent across all ONOS nodes" )
         else:
-            main.log.warn("ONOS1 intents: ") 
-            print json.dumps(json.loads(ONOS1_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS2 intents: ")
-            print json.dumps(json.loads(ONOS2_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS3 intents: ")
-            print json.dumps(json.loads(ONOS3_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS4 intents: ")
-            print json.dumps(json.loads(ONOS4_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS5 intents: ")
-            print json.dumps(json.loads(ONOS5_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS6 intents: ")
-            print json.dumps(json.loads(ONOS6_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-            main.log.warn("ONOS7 intents: ")
-            print json.dumps(json.loads(ONOS7_intents),
-                sort_keys=True, indent=4, separators=(',', ': '))
-        utilities.assert_equals(expect = main.TRUE,actual=intent_check,
-                onpass="Intents are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of intents")
+            main.log.warn( "ONOS1 intents: " )
+            print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS2 intents: " )
+            print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS3 intents: " )
+            print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS4 intents: " )
+            print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS5 intents: " )
+            print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS6 intents: " )
+            print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+            main.log.warn( "ONOS7 intents: " )
+            print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
+                              indent=4, separators=( ',', ': ' ) )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=intentCheck,
+            onpass="Intents are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of intents" )
+        # Print the intent states
+        intents = []
+        intents.append( ONOS1Intents )
+        intents.append( ONOS2Intents )
+        intents.append( ONOS3Intents )
+        intents.append( ONOS4Intents )
+        intents.append( ONOS5Intents )
+        intents.append( ONOS6Intents )
+        intents.append( ONOS7Intents )
+        intentStates = []
+        for node in intents:  # Iter through ONOS nodes
+            nodeStates = []
+            # Iter through intents of a node
+            for intent in json.loads( node ):
+                nodeStates.append( intent[ 'state' ] )
+            intentStates.append( nodeStates )
+            out = [ (i, nodeStates.count( i ) ) for i in set( nodeStates ) ]
+            main.log.info( dict( out ) )
 
-        #NOTE: Hazelcast has no durability, so intents are lost
-        main.step("Compare current intents with intents before the failure")
-        #NOTE: this requires case 5 to pass for intent_state to be set.
+        # NOTE: Store has no durability, so intents are lost across system
+        #       restarts
+        main.step( "Compare current intents with intents before the failure" )
+        # NOTE: this requires case 5 to pass for intentState to be set.
         #      maybe we should stop the test if that fails?
-        if intent_state == ONOS1_intents:
-            same_intents = main.TRUE
-            main.log.report("Intents are consistent with before failure")
-        #TODO: possibly the states have changed? we may need to figure out what the aceptable states are
+        sameIntents = main.TRUE
+        if intentState and intentState == ONOS1Intents:
+            sameIntents = main.TRUE
+            main.log.report( "Intents are consistent with before failure" )
+        # TODO: possibly the states have changed? we may need to figure out
+        # what the aceptable states are
         else:
-            same_intents = main.FALSE
-        utilities.assert_equals(expect = main.TRUE,actual=same_intents,
-                onpass="Intents are consistent with before failure",
-                onfail="The Intents changed during failure")
-        intent_check = intent_check and same_intents
+            try:
+                main.log.warn( "ONOS1 intents: " )
+                print json.dumps( json.loads( ONOS1Intents ),
+                                  sort_keys=True, indent=4,
+                                  separators=( ',', ': ' ) )
+            except Exception:
+                pass
+            sameIntents = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=sameIntents,
+            onpass="Intents are consistent with before failure",
+            onfail="The Intents changed during failure" )
+        intentCheck = intentCheck and sameIntents
 
+        main.step( "Get the OF Table entries and compare to before " +
+                   "component failure" )
+        FlowTables = main.TRUE
+        flows2 = []
+        for i in range( 28 ):
+            main.log.info( "Checking flow table on s" + str( i + 1 ) )
+            tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
+            flows2.append( tmpFlows )
+            tempResult = main.Mininet2.flowComp(
+                flow1=flows[ i ],
+                flow2=tmpFlows )
+            FlowTables = FlowTables and tempResult
+            if FlowTables == main.FALSE:
+                main.log.info( "Differences in flow table for switch: s" +
+                               str( i + 1 ) )
+        if FlowTables == main.TRUE:
+            main.log.report( "No changes were found in the flow tables" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=FlowTables,
+            onpass="No changes were found in the flow tables",
+            onfail="Changes were found in the flow tables" )
 
-
-        main.step("Get the OF Table entries and compare to before component failure")
-        Flow_Tables = main.TRUE
-        flows2=[]
-        for i in range(28):
-            main.log.info("Checking flow table on s" + str(i+1))
-            tmp_flows = main.Mininet2.get_flowTable(1.3, "s"+str(i+1))
-            flows2.append(tmp_flows)
-            temp_result = main.Mininet2.flow_comp(flow1=flows[i],flow2=tmp_flows)
-            Flow_Tables = Flow_Tables and temp_result
-            if Flow_Tables == main.FALSE:
-                main.log.info("Differences in flow table for switch: "+str(i+1))
-        if Flow_Tables == main.TRUE:
-            main.log.report("No changes were found in the flow tables")
-        utilities.assert_equals(expect=main.TRUE,actual=Flow_Tables,
-                onpass="No changes were found in the flow tables",
-                onfail="Changes were found in the flow tables")
-
-        main.step("Check the continuous pings to ensure that no packets were dropped during component failure")
-        #FIXME: This check is always failing. Investigate cause
-        #NOTE:  this may be something to do with file permsissions
+        main.step( "Check the continuous pings to ensure that no packets " +
+                   "were dropped during component failure" )
+        # FIXME: This check is always failing. Investigate cause
+        # NOTE:  this may be something to do with file permsissions
         #       or slight change in format
-        main.Mininet2.pingKill(main.params['TESTONUSER'], main.params['TESTONIP'])
-        Loss_In_Pings = main.FALSE 
-        #NOTE: checkForLoss returns main.FALSE with 0% packet loss
-        for i in range(8,18):
-            main.log.info("Checking for a loss in pings along flow from s" + str(i))
-            Loss_In_Pings = main.Mininet2.checkForLoss("/tmp/ping.h"+str(i)) or Loss_In_Pings
-        if Loss_In_Pings == main.TRUE:
-            main.log.info("Loss in ping detected")
-        elif Loss_In_Pings == main.ERROR:
-            main.log.info("There are multiple mininet process running")
-        elif Loss_In_Pings == main.FALSE:
-            main.log.info("No Loss in the pings")
-            main.log.report("No loss of dataplane connectivity")
-        utilities.assert_equals(expect=main.FALSE,actual=Loss_In_Pings,
-                onpass="No Loss of connectivity",
-                onfail="Loss of dataplane connectivity detected")
+        main.Mininet2.pingKill(
+            main.params[ 'TESTONUSER' ],
+            main.params[ 'TESTONIP' ] )
+        LossInPings = main.FALSE
+        # NOTE: checkForLoss returns main.FALSE with 0% packet loss
+        for i in range( 8, 18 ):
+            main.log.info(
+                "Checking for a loss in pings along flow from s" +
+                str( i ) )
+            LossInPings = main.Mininet2.checkForLoss(
+                "/tmp/ping.h" +
+                str( i ) ) or LossInPings
+        if LossInPings == main.TRUE:
+            main.log.info( "Loss in ping detected" )
+        elif LossInPings == main.ERROR:
+            main.log.info( "There are multiple mininet process running" )
+        elif LossInPings == main.FALSE:
+            main.log.info( "No Loss in the pings" )
+            main.log.report( "No loss of dataplane connectivity" )
+        utilities.assert_equals(
+            expect=main.FALSE,
+            actual=LossInPings,
+            onpass="No Loss of connectivity",
+            onfail="Loss of dataplane connectivity detected" )
 
-        #Test of LeadershipElection
-        #NOTE: this only works for the sanity test. In case of failures, leader will likely change
-        leader = ONOS1_ip
-        leader_result = main.TRUE
-        for controller in range(1,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            leaderN = node.election_test_leader()
-            #verify leader is ONOS1
+        # Test of LeadershipElection
+        # NOTE: this only works for the sanity test. In case of failures,
+        #       leader will likely change
+        leader = ONOS1Ip
+        leaderResult = main.TRUE
+        for controller in range( 1, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            leaderN = node.electionTestLeader()
+            # verify leader is ONOS1
             if leaderN == leader:
-                #all is well
-                #NOTE: In failure scenario, this could be a new node, maybe check != ONOS1
+                # all is well
+                # NOTE: In failure scenario, this could be a new node, maybe
+                # check != ONOS1
                 pass
             elif leaderN == main.FALSE:
-                #error in  response
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
+                # error in  response
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, check the" +
+                                 " error logs" )
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
-                main.log.report("ONOS" + str(controller) + " sees "+str(leaderN) +
-                        " as the leader of the election app. Leader should be "+str(leader) )
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a new leader was re-elected if applicable)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+                leaderResult = main.FALSE
+                main.log.report( "ONOS" + str( controller ) + " sees " +
+                                 str( leaderN ) +
+                                 " as the leader of the election app. " +
+                                 "Leader should be " + str( leader ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a new " +
+                             "leader was re-elected if applicable )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-
-        result = mastership_check and intent_check and Flow_Tables and (not Loss_In_Pings) and roles_not_null\
-                and leader_result
-        result = int(result)
+        result = ( mastershipCheck and intentCheck and FlowTables and
+                   ( not LossInPings ) and rolesNotNull and leaderResult )
+        result = int( result )
         if result == main.TRUE:
-            main.log.report("Constant State Tests Passed")
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="Constant State Tests Passed",
-                onfail="Constant state tests failed")
+            main.log.report( "Constant State Tests Passed" )
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="Constant State Tests Passed",
+                                 onfail="Constant state tests failed" )
 
-    def CASE8 (self,main):
-        '''
+    def CASE8( self, main ):
+        """
         Compare topo
-        '''
+        """
         import sys
-        sys.path.append("/home/admin/sts") # Trying to remove some dependancies, #FIXME add this path to params
-        from sts.topology.teston_topology import TestONTopology # assumes that sts is already in you PYTHONPATH
+        # FIXME add this path to params
+        sys.path.append( "/home/admin/sts" )
+        # assumes that sts is already in you PYTHONPATH
+        from sts.topology.teston_topology import TestONTopology
         import json
         import time
 
-        description ="Compare ONOS Topology view to Mininet topology"
-        main.case(description)
-        main.log.report(description)
-        main.step("Create TestONTopology object")
+        description = "Compare ONOS Topology view to Mininet topology"
+        main.case( description )
+        main.log.report( description )
+        main.step( "Create TestONTopology object" )
         ctrls = []
         count = 1
         while True:
             temp = ()
-            if ('ip' + str(count)) in main.params['CTRL']:
-                temp = temp + (getattr(main,('ONOS' + str(count))),)
-                temp = temp + ("ONOS"+str(count),)
-                temp = temp + (main.params['CTRL']['ip'+str(count)],)
-                temp = temp + (eval(main.params['CTRL']['port'+str(count)]),)
-                ctrls.append(temp)
+            if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
+                temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
+                temp = temp + ( "ONOS" + str( count ), )
+                temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
+                temp = temp + \
+                    ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+                ctrls.append( temp )
                 count = count + 1
             else:
                 break
-        MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        MNTopo = TestONTopology(
+            main.Mininet1,
+            ctrls )  # can also add Intent API info for intent operations
 
-        main.step("Comparing ONOS topology to MN")
-        devices_results = main.TRUE
-        ports_results = main.TRUE
-        links_results = main.TRUE
-        topo_result = main.FALSE
+        main.step( "Comparing ONOS topology to MN" )
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = main.TRUE
+        hostsResults = main.TRUE
+        topoResult = main.FALSE
         elapsed = 0
         count = 0
-        main.step("Collecting topology information from ONOS")
-        start_time = time.time()
-        while topo_result == main.FALSE and elapsed < 60:
+        main.step( "Collecting topology information from ONOS" )
+        startTime = time.time()
+        # Give time for Gossip to work
+        while topoResult == main.FALSE and elapsed < 60:
             count = count + 1
             if count > 1:
-                MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
-            cli_start = time.time()
+                # TODO: Depricate STS usage
+                MNTopo = TestONTopology( main.Mininet1, ctrls )
+            cliStart = time.time()
             devices = []
             devices.append( main.ONOScli1.devices() )
             devices.append( main.ONOScli2.devices() )
@@ -1291,13 +1689,22 @@
             devices.append( main.ONOScli6.devices() )
             devices.append( main.ONOScli7.devices() )
             hosts = []
-            hosts.append( main.ONOScli1.hosts() )
-            hosts.append( main.ONOScli2.hosts() )
-            hosts.append( main.ONOScli3.hosts() )
-            hosts.append( main.ONOScli4.hosts() )
-            hosts.append( main.ONOScli5.hosts() )
-            hosts.append( main.ONOScli6.hosts() )
-            hosts.append( main.ONOScli7.hosts() )
+            hosts.append( json.loads( main.ONOScli1.hosts() ) )
+            hosts.append( json.loads( main.ONOScli2.hosts() ) )
+            hosts.append( json.loads( main.ONOScli3.hosts() ) )
+            hosts.append( json.loads( main.ONOScli4.hosts() ) )
+            hosts.append( json.loads( main.ONOScli5.hosts() ) )
+            hosts.append( json.loads( main.ONOScli6.hosts() ) )
+            hosts.append( json.loads( main.ONOScli7.hosts() ) )
+            ipResult = main.TRUE
+            for controller in range( 0, len( hosts ) ):
+                controllerStr = str( controller + 1 )
+                for host in hosts[ controller ]:
+                    if host is None or host.get( 'ips', [] ) == []:
+                        main.log.error(
+                            "DEBUG:Error with host ips on controller" +
+                            controllerStr + ": " + str( host ) )
+                        ipResult = main.FALSE
             ports = []
             ports.append( main.ONOScli1.ports() )
             ports.append( main.ONOScli2.ports() )
@@ -1322,491 +1729,551 @@
             clusters.append( main.ONOScli5.clusters() )
             clusters.append( main.ONOScli6.clusters() )
             clusters.append( main.ONOScli7.clusters() )
-            paths = []
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli1.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli2.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli3.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli4.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli5.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli6.topology() )
-            paths.append( temp_topo.get('paths', False) )
-            temp_topo = main.ONOSbench.get_topology( main.ONOScli7.topology() )
-            paths.append( temp_topo.get('paths', False) )
 
+            elapsed = time.time() - startTime
+            cliTime = time.time() - cliStart
+            print "CLI time: " + str( cliTime )
 
-            elapsed = time.time() - start_time
-            cli_time = time.time() - cli_start
-            print "CLI time: " + str(cli_time)
-
-            for controller in range(num_controllers):
-                if devices[controller] or not "Error" in devices[controller]:
-                    current_devices_result =  main.Mininet1.compare_switches(MNTopo, json.loads(devices[controller]))
+            for controller in range( numControllers ):
+                controllerStr = str( controller + 1 )
+                if devices[ controller ] or "Error" not in devices[
+                        controller ]:
+                    currentDevicesResult = main.Mininet1.compareSwitches(
+                        MNTopo,
+                        json.loads( devices[ controller ] ) )
                 else:
-                    current_devices_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_devices_result,
-                        onpass="ONOS"+str(int(controller+1))+" Switches view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" Switches view is incorrect")
+                    currentDevicesResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentDevicesResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " Switches view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " Switches view is incorrect" )
 
-                if ports[controller] or not "Error" in ports[controller]:
-                    current_ports_result =  main.Mininet1.compare_ports(MNTopo, json.loads(ports[controller]))
+                if ports[ controller ] or "Error" not in ports[ controller ]:
+                    currentPortsResult = main.Mininet1.comparePorts(
+                        MNTopo,
+                        json.loads( ports[ controller ] ) )
                 else:
-                    current_ports_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_ports_result,
-                        onpass="ONOS"+str(int(controller+1))+" ports view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" ports view is incorrect")
+                    currentPortsResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentPortsResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " ports view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " ports view is incorrect" )
 
-                if links[controller] or not "Error" in links[controller]:
-                    current_links_result =  main.Mininet1.compare_links(MNTopo, json.loads(links[controller]))
+                if links[ controller ] or "Error" not in links[ controller ]:
+                    currentLinksResult = main.Mininet1.compareLinks(
+                        MNTopo,
+                        json.loads( links[ controller ] ) )
                 else:
-                    current_links_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_links_result,
-                        onpass="ONOS"+str(int(controller+1))+" links view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" links view is incorrect")
-            devices_results = devices_results and current_devices_result
-            ports_results = ports_results and current_ports_result
-            links_results = links_results and current_links_result
+                    currentLinksResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentLinksResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " links view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " links view is incorrect" )
 
-            #Compare json objects for hosts, dataplane clusters and paths
+                if hosts[ controller ] or "Error" not in hosts[ controller ]:
+                    currentHostsResult = main.Mininet1.compareHosts(
+                        MNTopo, hosts[ controller ] )
+                else:
+                    currentHostsResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentHostsResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " hosts exist in Mininet",
+                                         onfail="ONOS" + controllerStr +
+                                         " hosts don't match Mininet" )
 
-            #hosts
-            consistent_hosts_result = main.TRUE
+                devicesResults = devicesResults and currentDevicesResult
+                portsResults = portsResults and currentPortsResult
+                linksResults = linksResults and currentLinksResult
+                hostsResults = hostsResults and currentHostsResult
+
+            # Compare json objects for hosts and dataplane clusters
+
+            # hosts
+            consistentHostsResult = main.TRUE
             for controller in range( len( hosts ) ):
-                if not "Error" in hosts[controller]:
-                    if hosts[controller] == hosts[0]:
+                controllerStr = str( controller + 1 )
+                if "Error" not in hosts[ controller ]:
+                    if hosts[ controller ] == hosts[ 0 ]:
                         continue
-                    else:#hosts not consistent
-                        main.log.report("hosts from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                        main.log.warn( repr( hosts[controller] ) )
-                        consistent_hosts_result = main.FALSE
+                    else:  # hosts not consistent
+                        main.log.report( "hosts from ONOS" + controllerStr +
+                                         " is inconsistent with ONOS1" )
+                        main.log.warn( repr( hosts[ controller ] ) )
+                        consistentHostsResult = main.FALSE
 
                 else:
-                    main.log.report("Error in getting ONOS hosts from ONOS" + str(controller + 1) )
-                    consistent_hosts_result = main.FALSE
-                    main.log.warn("ONOS" + str(controller + 1) + " hosts response: " + repr(hosts[controller]) )
-            utilities.assert_equals(expect = main.TRUE,actual=consistent_hosts_result,
-                    onpass="Hosts view is consistent across all ONOS nodes",
-                    onfail="ONOS nodes have different views of hosts")
+                    main.log.report( "Error in getting ONOS hosts from ONOS" +
+                                     controllerStr )
+                    consistentHostsResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
+                                   " hosts response: " +
+                                   repr( hosts[ controller ] ) )
+            utilities.assert_equals(
+                expect=main.TRUE,
+                actual=consistentHostsResult,
+                onpass="Hosts view is consistent across all ONOS nodes",
+                onfail="ONOS nodes have different views of hosts" )
 
-            #Strongly connected clusters of devices
-            consistent_clusters_result = main.TRUE
+            # Strongly connected clusters of devices
+            consistentClustersResult = main.TRUE
             for controller in range( len( clusters ) ):
-                if not "Error" in clusters[controller]:
-                    if clusters[controller] == clusters[0]:
+                controllerStr = str( controller + 1 )
+                if "Error" not in clusters[ controller ]:
+                    if clusters[ controller ] == clusters[ 0 ]:
                         continue
-                    else:#clusters not consistent
-                        main.log.report("clusters from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                        consistent_clusters_result = main.FALSE
+                    else:  # clusters not consistent
+                        main.log.report( "clusters from ONOS" +
+                                         controllerStr +
+                                         " is inconsistent with ONOS1" )
+                        consistentClustersResult = main.FALSE
 
                 else:
-                    main.log.report("Error in getting dataplane clusters from ONOS" + str(controller + 1) )
-                    consistent_clusters_result = main.FALSE
-                    main.log.warn("ONOS" + str(controller + 1) + " clusters response: " + repr(clusters[controller]) )
-            utilities.assert_equals(expect = main.TRUE,actual=consistent_clusters_result,
-                    onpass="Clusters view is consistent across all ONOS nodes",
-                    onfail="ONOS nodes have different views of clusters")
-            num_clusters =  len(json.loads(clusters[0])) #there should always only be one cluster
-            utilities.assert_equals(expect = 1, actual = num_clusters,
-                    onpass="ONOS shows 1 SCC",
-                    onfail="ONOS shows "+str(num_clusters) +" SCCs")
+                    main.log.report( "Error in getting dataplane clusters " +
+                                     "from ONOS" + controllerStr )
+                    consistentClustersResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
+                                   " clusters response: " +
+                                   repr( clusters[ controller ] ) )
+            utilities.assert_equals(
+                expect=main.TRUE,
+                actual=consistentClustersResult,
+                onpass="Clusters view is consistent across all ONOS nodes",
+                onfail="ONOS nodes have different views of clusters" )
+            # there should always only be one cluster
+            numClusters = len( json.loads( clusters[ 0 ] ) )
+            clusterResults = main.FALSE
+            if numClusters == 1:
+                clusterResults = main.TRUE
+            utilities.assert_equals(
+                expect=1,
+                actual=numClusters,
+                onpass="ONOS shows 1 SCC",
+                onfail="ONOS shows " + str( numClusters ) + " SCCs" )
 
+            topoResult = ( devicesResults and portsResults and linksResults
+                           and hostsResults and consistentHostsResult
+                           and consistentClustersResult and clusterResults
+                           and ipResult )
 
-            #paths
-            consistent_paths_result = main.TRUE
-            for controller in range( len( paths ) ):
-                if not "Error" in paths[controller]:
-                    if paths[controller] == paths[0]:
-                        continue
-                    else:#paths not consistent
-                        main.log.report("paths from ONOS" + str(controller + 1) + " is inconsistent with ONOS1")
-                        consistent_paths_result = main.FALSE
+        topoResult = topoResult and int( count <= 2 )
+        note = "note it takes about " + str( int( cliTime ) ) + \
+            " seconds for the test to make all the cli calls to fetch " +\
+            "the topology from each ONOS instance"
+        main.log.info(
+            "Very crass estimate for topology discovery/convergence( " +
+            str( note ) + " ): " + str( elapsed ) + " seconds, " +
+            str( count ) + " tries" )
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                 onpass="Topology Check Test successful",
+                                 onfail="Topology Check Test NOT successful" )
+        if topoResult == main.TRUE:
+            main.log.report( "ONOS topology view matches Mininet topology" )
 
-                else:
-                    main.log.report("Error in getting paths from ONOS" + str(controller + 1) )
-                    consistent_paths_result = main.FALSE
-                    main.log.warn("ONOS" + str(controller + 1) + " paths response: " + repr(paths[controller]) )
-            utilities.assert_equals(expect = main.TRUE,actual=consistent_paths_result,
-                    onpass="Paths count is consistent across all ONOS nodes",
-                    onfail="ONOS nodes have different counts of paths")
-
-
-            topo_result = devices_results and ports_results and links_results\
-                    and consistent_hosts_result and consistent_clusters_result and consistent_paths_result
-
-        topo_result = topo_result and int(count <= 2)
-        note = "note it takes about "+str( int(cli_time) )+" seconds for the test to make all the cli calls to fetch the topology from each ONOS instance"
-        main.log.report("Very crass estimate for topology discovery/convergence("+ str(note) + "): " +\
-                str(elapsed) + " seconds, " + str(count) +" tries" )
-        utilities.assert_equals(expect=main.TRUE, actual=topo_result,
-                onpass="Topology Check Test successful",
-                onfail="Topology Check Test NOT successful")
-        if topo_result == main.TRUE:
-            main.log.report("ONOS topology view matches Mininet topology")
-
-
-    def CASE9 (self,main):
-        '''
+    def CASE9( self, main ):
+        """
         Link s3-s28 down
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        import time
+        # NOTE: You should probably run a topology check after this
 
-        link_sleep = float(main.params['timers']['LinkDiscovery'])
+        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        description = "Turn off a link to ensure that Link Discovery is working properly"
-        main.log.report(description)
-        main.case(description)
+        description = "Turn off a link to ensure that Link Discovery " +\
+                      "is working properly"
+        main.log.report( description )
+        main.case( description )
 
+        main.step( "Kill Link between s3 and s28" )
+        LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
+        main.log.info( "Waiting " + str( linkSleep ) +
+                       " seconds for link down to be discovered" )
+        time.sleep( linkSleep )
+        utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
+                                 onpass="Link down succesful",
+                                 onfail="Failed to bring link down" )
+        # TODO do some sort of check here
 
-        main.step("Kill Link between s3 and s28")
-        Link_Down = main.Mininet1.link(END1="s3",END2="s28",OPTION="down")
-        main.log.info("Waiting " + str(link_sleep) + " seconds for link down to be discovered")
-        time.sleep(link_sleep)
-        utilities.assert_equals(expect=main.TRUE,actual=Link_Down,
-                onpass="Link down succesful",
-                onfail="Failed to bring link down")
-        #TODO do some sort of check here
-
-    def CASE10 (self,main):
-        '''
+    def CASE10( self, main ):
+        """
         Link s3-s28 up
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        import time
+        # NOTE: You should probably run a topology check after this
 
-        link_sleep = float(main.params['timers']['LinkDiscovery'])
+        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        description = "Restore a link to ensure that Link Discovery is working properly"
-        main.log.report(description)
-        main.case(description)
+        description = "Restore a link to ensure that Link Discovery is " + \
+                      "working properly"
+        main.log.report( description )
+        main.case( description )
 
-        main.step("Bring link between s3 and s28 back up")
-        Link_Up = main.Mininet1.link(END1="s3",END2="s28",OPTION="up")
-        main.log.info("Waiting " + str(link_sleep) + " seconds for link up to be discovered")
-        time.sleep(link_sleep)
-        utilities.assert_equals(expect=main.TRUE,actual=Link_Up,
-                onpass="Link up succesful",
-                onfail="Failed to bring link up")
-        #TODO do some sort of check here
+        main.step( "Bring link between s3 and s28 back up" )
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
+        main.log.info( "Waiting " + str( linkSleep ) +
+                       " seconds for link up to be discovered" )
+        time.sleep( linkSleep )
+        utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
+                                 onpass="Link up succesful",
+                                 onfail="Failed to bring link up" )
+        # TODO do some sort of check here
 
-
-    def CASE11 (self, main) :
-        '''
+    def CASE11( self, main ):
+        """
         Switch Down
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        # NOTE: You should probably run a topology check after this
         import time
 
-        switch_sleep = float(main.params['timers']['SwitchDiscovery'])
+        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
 
         description = "Killing a switch to ensure it is discovered correctly"
-        main.log.report(description)
-        main.case(description)
+        main.log.report( description )
+        main.case( description )
+        switch = main.params[ 'kill' ][ 'switch' ]
+        switchDPID = main.params[ 'kill' ][ 'dpid' ]
 
-        #TODO: Make this switch parameterizable
-        main.step("Kill s28 ")
-        main.log.report("Deleting s28")
-        main.Mininet1.del_switch("s28")
-        main.log.info("Waiting " + str(switch_sleep) + " seconds for switch down to be discovered")
-        time.sleep(switch_sleep)
-        device = main.ONOScli1.get_device(dpid="0028")
-        #Peek at the deleted switch
-        main.log.warn( str(device) )
+        # TODO: Make this switch parameterizable
+        main.step( "Kill " + switch )
+        main.log.report( "Deleting " + switch )
+        main.Mininet1.delSwitch( switch )
+        main.log.info( "Waiting " + str( switchSleep ) +
+                       " seconds for switch down to be discovered" )
+        time.sleep( switchSleep )
+        device = main.ONOScli1.getDevice( dpid=switchDPID )
+        # Peek at the deleted switch
+        main.log.warn( str( device ) )
         result = main.FALSE
-        if device and device['available'] == False:
+        if device and device[ 'available' ] is False:
             result = main.TRUE
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="Kill switch succesful",
-                onfail="Failed to kill switch?")
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="Kill switch succesful",
+                                 onfail="Failed to kill switch?" )
 
-    def CASE12 (self, main) :
-        '''
+    def CASE12( self, main ):
+        """
         Switch Up
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        # NOTE: You should probably run a topology check after this
         import time
 
-        switch_sleep = float(main.params['timers']['SwitchDiscovery'])
+        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
+        switch = main.params[ 'kill' ][ 'switch' ]
+        switchDPID = main.params[ 'kill' ][ 'dpid' ]
+        links = main.params[ 'kill' ][ 'links' ].split()
         description = "Adding a switch to ensure it is discovered correctly"
-        main.log.report(description)
-        main.case(description)
+        main.log.report( description )
+        main.case( description )
 
-        main.step("Add back s28")
-        main.log.report("Adding back s28")
-        main.Mininet1.add_switch("s28", dpid = '0000000000002800')
-        #TODO: New dpid or same? Ask Thomas?
-        main.Mininet1.add_link('s28', 's3')
-        main.Mininet1.add_link('s28', 's6')
-        main.Mininet1.add_link('s28', 'h28')
-        main.Mininet1.assign_sw_controller(sw="28",count=num_controllers,
-                ip1=ONOS1_ip,port1=ONOS1_port,
-                ip2=ONOS2_ip,port2=ONOS2_port,
-                ip3=ONOS3_ip,port3=ONOS3_port,
-                ip4=ONOS4_ip,port4=ONOS4_port,
-                ip5=ONOS5_ip,port5=ONOS5_port,
-                ip6=ONOS6_ip,port6=ONOS6_port,
-                ip7=ONOS7_ip,port7=ONOS7_port)
-        main.log.info("Waiting " + str(switch_sleep) + " seconds for switch up to be discovered")
-        time.sleep(switch_sleep)
-        device = main.ONOScli1.get_device(dpid="0028")
-        #Peek at the deleted switch
-        main.log.warn( str(device) )
+        main.step( "Add back " + switch )
+        main.log.report( "Adding back " + switch )
+        main.Mininet1.addSwitch( switch, dpid=switchDPID )
+        # TODO: New dpid or same? Ask Thomas?
+        for peer in links:
+            main.Mininet1.addLink( switch, peer )
+        main.Mininet1.assignSwController( sw=switch.split( 's' )[ 1 ],
+                                          count=numControllers,
+                                          ip1=ONOS1Ip,
+                                          port1=ONOS1Port,
+                                          ip2=ONOS2Ip,
+                                          port2=ONOS2Port,
+                                          ip3=ONOS3Ip,
+                                          port3=ONOS3Port,
+                                          ip4=ONOS4Ip,
+                                          port4=ONOS4Port,
+                                          ip5=ONOS5Ip,
+                                          port5=ONOS5Port,
+                                          ip6=ONOS6Ip,
+                                          port6=ONOS6Port,
+                                          ip7=ONOS7Ip,
+                                          port7=ONOS7Port )
+        main.log.info( "Waiting " + str( switchSleep ) +
+                       " seconds for switch up to be discovered" )
+        time.sleep( switchSleep )
+        device = main.ONOScli1.getDevice( dpid=switchDPID )
+        # Peek at the deleted switch
+        main.log.warn( str( device ) )
         result = main.FALSE
-        if device and device['available'] == True:
+        if device and device[ 'available' ]:
             result = main.TRUE
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="add switch succesful",
-                onfail="Failed to add switch?")
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="add switch succesful",
+                                 onfail="Failed to add switch?" )
 
-    def CASE13 (self, main) :
-        '''
+    def CASE13( self, main ):
+        """
         Clean up
-        '''
+        """
         import os
         import time
-        #printing colors to terminal
+        # TODO: make use of this elsewhere
+        ips = []
+        ips.append( ONOS1Ip )
+        ips.append( ONOS2Ip )
+        ips.append( ONOS3Ip )
+        ips.append( ONOS4Ip )
+        ips.append( ONOS5Ip )
+        ips.append( ONOS6Ip )
+        ips.append( ONOS7Ip )
+
+        # printing colors to terminal
         colors = {}
-        colors['cyan']   = '\033[96m'
-        colors['purple'] = '\033[95m'
-        colors['blue']   = '\033[94m'
-        colors['green']  = '\033[92m'
-        colors['yellow'] = '\033[93m'
-        colors['red']    = '\033[91m'
-        colors['end']    = '\033[0m'
+        colors[ 'cyan' ] = '\033[96m'
+        colors[ 'purple' ] = '\033[95m'
+        colors[ 'blue' ] = '\033[94m'
+        colors[ 'green' ] = '\033[92m'
+        colors[ 'yellow' ] = '\033[93m'
+        colors[ 'red' ] = '\033[91m'
+        colors[ 'end' ] = '\033[0m'
         description = "Test Cleanup"
-        main.log.report(description)
-        main.case(description)
-        main.step("Killing tcpdumps")
-        main.Mininet2.stop_tcpdump()
+        main.log.report( description )
+        main.case( description )
+        main.step( "Killing tcpdumps" )
+        main.Mininet2.stopTcpdump()
 
-        main.step("Checking ONOS Logs for errors")
-        print colors['purple'] + "Checking logs for errors on ONOS1:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS1_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS2:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS2_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS3:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS3_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS4:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS4_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS5:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS5_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS6:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS6_ip)
-        print colors['purple'] + "Checking logs for errors on ONOS7:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS7_ip)
+        main.step( "Checking ONOS Logs for errors" )
+        for i in range( 7 ):
+            print colors[ 'purple' ] + "Checking logs for errors on " + \
+                "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
+            print main.ONOSbench.checkLogs( ips[ i ] )
 
-        main.step("Copying MN pcap and ONOS log files to test station")
+        main.step( "Copying MN pcap and ONOS log files to test station" )
         testname = main.TEST
-        teststation_user = main.params['TESTONUSER']
-        teststation_IP = main.params['TESTONIP']
-        #NOTE: MN Pcap file is being saved to ~/packet_captures
+        teststationUser = main.params[ 'TESTONUSER' ]
+        teststationIP = main.params[ 'TESTONIP' ]
+        # NOTE: MN Pcap file is being saved to ~/packet_captures
         #       scp this file as MN and TestON aren't necessarily the same vm
-        #FIXME: scp
-        #####mn files
-        #TODO: Load these from params
-        #NOTE: must end in /
-        log_folder = "/opt/onos/log/"
-        log_files = ["karaf.log", "karaf.log.1"]
-        #NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS1_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS1-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS2_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS2-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS3_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS3-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS4_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS4-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS5_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS5-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS6_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS6-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS7_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS7-"+f )
+        # FIXME: scp
+        # mn files
+        # TODO: Load these from params
+        # NOTE: must end in /
+        logFolder = "/opt/onos/log/"
+        logFiles = [ "karaf.log", "karaf.log.1" ]
+        # NOTE: must end in /
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            for i in range( 7 ):
+                main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
+                                                logFolder + f + " " +
+                                                teststationUser + "@" +
+                                                teststationIP + ":" +
+                                                dstDir + str( testname ) +
+                                                "-ONOS" + str( i + 1 ) + "-" +
+                                                f )
+                main.ONOSbench.handle.expect( "\$" )
 
-        #std*.log's
-        #NOTE: must end in /
-        log_folder = "/opt/onos/var/"
-        log_files = ["stderr.log", "stdout.log"]
-        #NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS1_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS1-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS2_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS2-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS3_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS3-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS4_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS4-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS5_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS5-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS6_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS6-"+f )
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS7_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS7-"+f )
+        # std*.log's
+        # NOTE: must end in /
+        logFolder = "/opt/onos/var/"
+        logFiles = [ "stderr.log", "stdout.log" ]
+        # NOTE: must end in /
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            for i in range( 7 ):
+                main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
+                                                logFolder + f + " " +
+                                                teststationUser + "@" +
+                                                teststationIP + ":" +
+                                                dstDir + str( testname ) +
+                                                "-ONOS" + str( i + 1 ) + "-" +
+                                                f )
+                main.ONOSbench.handle.expect( "\$" )
+        # sleep so scp can finish
+        time.sleep( 10 )
+        main.Mininet1.stopNet()
+        main.step( "Packing and rotating pcap archives" )
+        os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
 
+        # TODO: actually check something here
+        utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
+                                 onpass="Test cleanup successful",
+                                 onfail="Test cleanup NOT successful" )
 
-        #sleep so scp can finish
-        time.sleep(10)
-        main.step("Packing and rotating pcap archives")
-        os.system("~/TestON/dependencies/rotate.sh "+ str(testname))
-
-
-        #TODO: actually check something here
-        utilities.assert_equals(expect=main.TRUE, actual=main.TRUE,
-                onpass="Test cleanup successful",
-                onfail="Test cleanup NOT successful")
-
-    def CASE14 ( self, main ) :
-        '''
+    def CASE14( self, main ):
+        """
         start election app on all onos nodes
-        '''
-        leader_result = main.TRUE
-        #install app on onos 1
-        main.log.info("Install leadership election app")
-        main.ONOScli1.feature_install("onos-app-election")
-        #wait for election
-        #check for leader
-        leader = main.ONOScli1.election_test_leader()
-        #verify leader is ONOS1
-        if leader == ONOS1_ip:
-            #all is well
+        """
+        leaderResult = main.TRUE
+        # install app on onos 1
+        main.log.info( "Install leadership election app" )
+        main.ONOScli1.featureInstall( "onos-app-election" )
+        # wait for election
+        # check for leader
+        leader = main.ONOScli1.electionTestLeader()
+        # verify leader is ONOS1
+        if leader == ONOS1Ip:
+            # all is well
             pass
-        elif leader == None:
-            #No leader elected
-            main.log.report("No leader was elected")
-            leader_result = main.FALSE
+        elif leader is None:
+            # No leader elected
+            main.log.report( "No leader was elected" )
+            leaderResult = main.FALSE
         elif leader == main.FALSE:
-            #error in  response
-            #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-            main.log.report("Something is wrong with election_test_leader function, check the error logs")
-            leader_result = main.FALSE
+            # error in  response
+            # TODO: add check for "Command not found:" in the driver, this
+            # means the app isn't loaded
+            main.log.report( "Something is wrong with electionTestLeader" +
+                             " function, check the error logs" )
+            leaderResult = main.FALSE
         else:
-            #error in  response
-            main.log.report("Unexpected response from election_test_leader function:'"+str(leader)+"'")
-            leader_result = main.FALSE
+            # error in  response
+            main.log.report(
+                "Unexpected response from electionTestLeader function:'" +
+                str( leader ) +
+                "'" )
+            leaderResult = main.FALSE
 
-
-
-
-        #install on other nodes and check for leader.
-        #Should be onos1 and each app should show the same leader
-        for controller in range(2,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            node.feature_install("onos-app-election")
-            leaderN = node.election_test_leader()
-            #verify leader is ONOS1
-            if leaderN == ONOS1_ip:
-                #all is well
+        # install on other nodes and check for leader.
+        # Should be onos1 and each app should show the same leader
+        for controller in range( 2, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            node.featureInstall( "onos-app-election" )
+            leaderN = node.electionTestLeader()
+            # verify leader is ONOS1
+            if leaderN == ONOS1Ip:
+                # all is well
                 pass
             elif leaderN == main.FALSE:
-                #error in  response
-                #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
+                # error in  response
+                # TODO: add check for "Command not found:" in the driver, this
+                # means the app isn't loaded
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, check the" +
+                                 " error logs" )
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
-                main.log.report("ONOS" + str(controller) + " sees "+str(leaderN) +
-                        " as the leader of the election app. Leader should be "+str(leader) )
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a leader was elected)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+                leaderResult = main.FALSE
+                main.log.report( "ONOS" + str( controller ) + " sees " +
+                                 str( leaderN ) +
+                                 " as the leader of the election app. Leader" +
+                                 " should be " +
+                                 str( leader ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a leader " +
+                             "was elected )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-    def CASE15 ( self, main ) :
-        '''
+    def CASE15( self, main ):
+        """
         Check that Leadership Election is still functional
-        '''
-        leader_result = main.TRUE
+        """
+        leaderResult = main.TRUE
         description = "Check that Leadership Election is still functional"
-        main.log.report(description)
-        main.case(description)
-        main.step("Find current leader and withdraw")
-        leader = main.ONOScli1.election_test_leader()
-        #TODO: do some sanity checking on leader before using it
-        withdraw_result = main.FALSE
-        if leader == ONOS1_ip:
-            old_leader = getattr( main, "ONOScli1" )
-        elif leader == ONOS2_ip:
-            old_leader = getattr( main, "ONOScli2" )
-        elif leader == ONOS3_ip:
-            old_leader = getattr( main, "ONOScli3" )
-        elif leader == ONOS4_ip:
-            old_leader = getattr( main, "ONOScli4" )
-        elif leader == ONOS5_ip:
-            old_leader = getattr( main, "ONOScli5" )
-        elif leader == ONOS6_ip:
-            old_leader = getattr( main, "ONOScli6" )
-        elif leader == ONOS7_ip:
-            old_leader = getattr( main, "ONOScli7" )
-        elif leader == None or leader == main.FALSE:
-            main.log.report("Leader for the election app should be an ONOS node,"\
-                    +"instead got '"+str(leader)+"'")
-            leader_result = main.FALSE
-        withdraw_result = old_leader.election_test_withdraw()
-
-
-        main.step("Make sure new leader is elected")
-        leader_list = []
-        for controller in range(1,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            leader_list.append( node.election_test_leader() )
-        for leaderN in leader_list:
-            if leaderN == leader:
-                main.log.report("ONOS"+str(controller)+" still sees " + str(leader) +\
-                        " as leader after they withdrew")
-                leader_result = main.FALSE
-            elif leaderN == main.FALSE:
-                #error in  response
-                #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
-        consistent_leader = main.FALSE
-        if len( set( leader_list ) ) == 1:
-            main.log.info("Each Election-app sees '"+str(leader_list[0])+"' as the leader")
-            consistent_leader = main.TRUE
+        main.log.report( description )
+        main.case( description )
+        main.step( "Find current leader and withdraw" )
+        leader = main.ONOScli1.electionTestLeader()
+        # TODO: do some sanity checking on leader before using it
+        withdrawResult = main.FALSE
+        if leader == ONOS1Ip:
+            oldLeader = getattr( main, "ONOScli1" )
+        elif leader == ONOS2Ip:
+            oldLeader = getattr( main, "ONOScli2" )
+        elif leader == ONOS3Ip:
+            oldLeader = getattr( main, "ONOScli3" )
+        elif leader == ONOS4Ip:
+            oldLeader = getattr( main, "ONOScli4" )
+        elif leader == ONOS5Ip:
+            oldLeader = getattr( main, "ONOScli5" )
+        elif leader == ONOS6Ip:
+            oldLeader = getattr( main, "ONOScli6" )
+        elif leader == ONOS7Ip:
+            oldLeader = getattr( main, "ONOScli7" )
+        elif leader is None or leader == main.FALSE:
+            main.log.report(
+                "Leader for the election app should be an ONOS node," +
+                "instead got '" + str( leader ) + "'" )
+            leaderResult = main.FALSE
+            oldLeader = None
         else:
-            main.log.report("Inconsistent responses for leader of Election-app:")
-            for n in range(len(leader_list)):
-                main.log.report("ONOS" + str(n+1) + " response: " + str(leader_list[n]) )
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a new leader was elected when the old leader resigned)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+            main.log.error( "Leader election --- why am I HERE?!?")
+        if oldLeader:
+            withdrawResult = oldLeader.electionTestWithdraw()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=withdrawResult,
+            onpass="App was withdrawn from election",
+            onfail="App was not withdrawn from election" )
 
+        main.step( "Make sure new leader is elected" )
+        leaderList = []
+        for controller in range( 1, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            leaderList.append( node.electionTestLeader() )
+        for leaderN in leaderList:
+            if leaderN == leader:
+                main.log.report(
+                    "ONOS" + str( controller ) +
+                    " still sees " + str( leader ) +
+                    " as leader after they withdrew" )
+                leaderResult = main.FALSE
+            elif leaderN == main.FALSE:
+                # error in  response
+                # TODO: add check for "Command not found:" in the driver, this
+                # means the app isn't loaded
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, " +
+                                 "check the error logs" )
+                leaderResult = main.FALSE
+        consistentLeader = main.FALSE
+        if len( set( leaderList ) ) == 1:
+            main.log.info( "Each Election-app sees '" +
+                           str( leaderList[ 0 ] ) +
+                           "' as the leader" )
+            consistentLeader = main.TRUE
+        else:
+            main.log.report(
+                "Inconsistent responses for leader of Election-app:" )
+            for n in range( len( leaderList ) ):
+                main.log.report( "ONOS" + str( n + 1 ) + " response: " +
+                                 str( leaderList[ n ] ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a new " +
+                             "leader was elected when the old leader " +
+                             "resigned )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-        main.step("Run for election on old leader(just so everyone is in the hat)")
-        run_result = old_leader.election_test_run()
-        if consistent_leader == main.TRUE:
-            after_run = main.ONOScli1.election_test_leader()
-            #verify leader didn't just change
-            if after_run == leader_list[0]:
-                leader_result = main.TRUE
+        main.step( "Run for election on old leader( just so everyone " +
+                   "is in the hat )" )
+        if oldLeader:
+            runResult = oldLeader.electionTestRun()
+        else:
+            runResult = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=runResult,
+            onpass="App re-ran for election",
+            onfail="App failed to run for election" )
+        if consistentLeader == main.TRUE:
+            afterRun = main.ONOScli1.electionTestLeader()
+            # verify leader didn't just change
+            if afterRun == leaderList[ 0 ]:
+                leaderResult = main.TRUE
             else:
-                leader_result = main.FALSE
-        #TODO: assert on  run and withdraw results?
+                leaderResult = main.FALSE
+        # TODO: assert on  run and withdraw results?
 
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election after the old leader re-ran for election")
-
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election after " +
+                   "the old leader re-ran for election" )
diff --git a/TestON/tests/HATestSanity/HATestSanity.topo b/TestON/tests/HATestSanity/HATestSanity.topo
index 4d4156c..9305025 100644
--- a/TestON/tests/HATestSanity/HATestSanity.topo
+++ b/TestON/tests/HATestSanity/HATestSanity.topo
@@ -151,7 +151,7 @@
                 <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
                 <arg2> --topo mytopo </arg2>
                 <arg3> </arg3>
-                <controller> remote </controller>
+                <controller> none </controller>
             </COMPONENTS>
         </Mininet1>
 
@@ -162,11 +162,7 @@
             <type>RemoteMininetDriver</type>
             <connect_order>17</connect_order>
             <COMPONENTS>
-                # Specify the Option for mininet
-                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
-                <arg2> --topo mytopo --arp</arg2>
-                <controller> remote </controller>
-             </COMPONENTS>
+            </COMPONENTS>
         </Mininet2>
 
     </COMPONENT>
diff --git a/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.params b/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.params
index 95a75d7..d3eb8dd 100644
--- a/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.params
+++ b/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.params
@@ -1,9 +1,27 @@
 <PARAMS>
+    #CASE1: Compile ONOS and push it to the test machines
+    #CASE2: Assign mastership to controllers
+    #CASE3: Assign intents
+    #CASE4: Ping across added host intents
+    #CASE5: Reading state of ONOS
+    #CASE6: The Failure case. Since this is the Sanity test, we do nothing.
+    #CASE7: Check state after control plane failure
+    #CASE8: Compare topo
+    #CASE9: Link s3-s28 down
+    #CASE10: Link s3-s28 up
+    #CASE11: Switch down
+    #CASE12: Switch up
+    #CASE13: Clean up
+    #CASE14: start election app on all onos nodes
+    #CASE15: Check that Leadership Election is still functional
+    #1,2,8,3,4,5,14,[6],8,3,7,4,15,9,8,4,10,8,4,11,8,4,12,8,4,13
+    #extra hosts test 1,2,8,11,8,12,8
     <testcases>1,2,8,3,4,5,14,[6],8,3,7,4,15,9,8,4,10,8,4,11,8,4,12,8,4,13</testcases>
     <ENV>
-    <cellName>HA</cellName>
+        <cellName>HA</cellName>
     </ENV>
     <Git>False</Git>
+    <branch> master </branch>
     <num_controllers> 1 </num_controllers>
 
     <CTRL>
@@ -56,6 +74,11 @@
         <LinkDiscovery>.2</LinkDiscovery>
         <SwitchDiscovery>.2</SwitchDiscovery>
     </timers>
+    <kill>
+        <switch> s5 </switch>
+        <dpid> 0000000000005000 </dpid>
+        <links> h5 s2 s1 s6 </links>
+    </kill>
     <MNtcpdump>
         <intf>eth0</intf>
         <port> </port>
diff --git a/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py b/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py
index 51ac0f6..9d9a3fa 100644
--- a/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py
+++ b/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py
@@ -1,4 +1,4 @@
-'''
+"""
 Description: This test is to determine if a single
     instance ONOS 'cluster' can handle a restart
 
@@ -18,953 +18,1321 @@
 CASE13: Clean up
 CASE14: start election app on all onos nodes
 CASE15: Check that Leadership Election is still functional
-'''
+"""
+
+
 class HATestSingleInstanceRestart:
 
-    def __init__(self) :
+    def __init__( self ):
         self.default = ''
 
-    def CASE1(self,main) :
-        '''
+    def CASE1( self, main ):
+        """
         CASE1 is to compile ONOS and push it to the test machines
 
         Startup sequence:
-        git pull
-        mvn clean install
-        onos-package
         cell <name>
         onos-verify-cell
         NOTE: temporary - onos-remove-raft-logs
+        onos-uninstall
+        start mininet
+        git pull
+        mvn clean install
+        onos-package
         onos-install -f
         onos-wait-for-start
-        '''
-        import time
-        main.log.report("ONOS Single node cluster restart HA test - initialization")
-        main.case("Setting up test environment")
+        start cli sessions
+        start tcpdump
+        """
+        main.log.report( "ONOS Single node cluster restart " +
+                         "HA test - initialization" )
+        main.case( "Setting up test environment" )
+        # TODO: save all the timers and output them for plotting
 
         # load some vairables from the params file
-        PULL_CODE = False
-        if main.params['Git'] == 'True':
-            PULL_CODE = True
-        cell_name = main.params['ENV']['cellName']
+        PULLCODE = False
+        if main.params[ 'Git' ] == 'True':
+            PULLCODE = True
+        gitBranch = main.params[ 'branch' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
 
-        #set global variables
-        global ONOS1_ip
-        global ONOS1_port
-        global ONOS2_ip
-        global ONOS2_port
-        global ONOS3_ip
-        global ONOS3_port
-        global ONOS4_ip
-        global ONOS4_port
-        global ONOS5_ip
-        global ONOS5_port
-        global ONOS6_ip
-        global ONOS6_port
-        global ONOS7_ip
-        global ONOS7_port
-        global num_controllers
+        # set global variables
+        global ONOS1Ip
+        global ONOS1Port
+        global ONOS2Ip
+        global ONOS2Port
+        global ONOS3Ip
+        global ONOS3Port
+        global ONOS4Ip
+        global ONOS4Port
+        global ONOS5Ip
+        global ONOS5Port
+        global ONOS6Ip
+        global ONOS6Port
+        global ONOS7Ip
+        global ONOS7Port
+        global numControllers
 
-        ONOS1_ip = main.params['CTRL']['ip1']
-        ONOS1_port = main.params['CTRL']['port1']
-        ONOS2_ip = main.params['CTRL']['ip2']
-        ONOS2_port = main.params['CTRL']['port2']
-        ONOS3_ip = main.params['CTRL']['ip3']
-        ONOS3_port = main.params['CTRL']['port3']
-        ONOS4_ip = main.params['CTRL']['ip4']
-        ONOS4_port = main.params['CTRL']['port4']
-        ONOS5_ip = main.params['CTRL']['ip5']
-        ONOS5_port = main.params['CTRL']['port5']
-        ONOS6_ip = main.params['CTRL']['ip6']
-        ONOS6_port = main.params['CTRL']['port6']
-        ONOS7_ip = main.params['CTRL']['ip7']
-        ONOS7_port = main.params['CTRL']['port7']
-        num_controllers = int(main.params['num_controllers'])
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
+        ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
+        ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
+        ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
+        ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
+        ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
+        numControllers = int( main.params[ 'num_controllers' ] )
 
+        main.step( "Applying cell variable to environment" )
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
-        main.step("Applying cell variable to environment")
-        cell_result = main.ONOSbench.set_cell(cell_name)
-        verify_result = main.ONOSbench.verify_cell()
+        # FIXME:this is short term fix
+        main.log.report( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftLogs()
+        main.log.report( "Uninstalling ONOS" )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+        main.ONOSbench.onosUninstall( ONOS2Ip )
+        main.ONOSbench.onosUninstall( ONOS3Ip )
+        main.ONOSbench.onosUninstall( ONOS4Ip )
+        main.ONOSbench.onosUninstall( ONOS5Ip )
+        main.ONOSbench.onosUninstall( ONOS6Ip )
+        main.ONOSbench.onosUninstall( ONOS7Ip )
 
-        #FIXME:this is short term fix
-        main.log.report("Removing raft logs")
-        main.ONOSbench.onos_remove_raft_logs()
-        main.log.report("Uninstalling ONOS")
-        main.ONOSbench.onos_uninstall(ONOS1_ip)
-        main.ONOSbench.onos_uninstall(ONOS2_ip)
-        main.ONOSbench.onos_uninstall(ONOS3_ip)
-        main.ONOSbench.onos_uninstall(ONOS4_ip)
-        main.ONOSbench.onos_uninstall(ONOS5_ip)
-        main.ONOSbench.onos_uninstall(ONOS6_ip)
-        main.ONOSbench.onos_uninstall(ONOS7_ip)
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
 
-        clean_install_result = main.TRUE
-        git_pull_result = main.TRUE
+        main.step( "Starting Mininet" )
+        main.Mininet1.startNet( )
 
-        main.step("Compiling the latest version of ONOS")
-        if PULL_CODE:
-            main.step("Git checkout and pull master")
-            main.ONOSbench.git_checkout("master")
-            git_pull_result = main.ONOSbench.git_pull()
+        main.step( "Compiling the latest version of ONOS" )
+        if PULLCODE:
+            main.step( "Git checkout and pull " + gitBranch )
+            main.ONOSbench.gitCheckout( gitBranch )
+            gitPullResult = main.ONOSbench.gitPull()
 
-            main.step("Using mvn clean & install")
-            clean_install_result = main.TRUE
-            if git_pull_result == main.TRUE:
-                clean_install_result = main.ONOSbench.clean_install()
-            else:
-                main.log.warn("Did not pull new code so skipping mvn "+ \
-                        "clean install")
-        main.ONOSbench.get_version(report=True)
+            main.step( "Using mvn clean & install" )
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+        else:
+            main.log.warn( "Did not pull new code so skipping mvn " +
+                           "clean install" )
+        main.ONOSbench.getVersion( report=True )
 
-        cell_result = main.ONOSbench.set_cell("SingleHA")
-        verify_result = main.ONOSbench.verify_cell()
-        main.step("Creating ONOS package")
-        package_result = main.ONOSbench.onos_package()
+        cellResult = main.ONOSbench.setCell( "SingleHA" )
+        verifyResult = main.ONOSbench.verifyCell()
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
 
-        main.step("Installing ONOS package")
-        onos1_install_result = main.ONOSbench.onos_install(options="-f",
-                node=ONOS1_ip)
+        main.step( "Installing ONOS package" )
+        onos1InstallResult = main.ONOSbench.onosInstall( options="-f",
+                                                           node=ONOS1Ip )
 
-
-        main.step("Checking if ONOS is up yet")
-        #TODO check bundle:list?
-        for i in range(2):
-            onos1_isup = main.ONOSbench.isup(ONOS1_ip)
-            if onos1_isup:
+        main.step( "Checking if ONOS is up yet" )
+        for i in range( 2 ):
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            if onos1Isup:
                 break
-        if not onos1_isup:
-            main.log.report("ONOS1 didn't start!")
+        if not onos1Isup:
+            main.log.report( "ONOS1 didn't start!" )
 
-        # TODO: if it becomes an issue, we can retry this step  a few times
+        cliResult = main.ONOScli1.startOnosCli( ONOS1Ip )
 
+        main.step( "Start Packet Capture MN" )
+        main.Mininet2.startTcpdump(
+            str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
+            + "-MN.pcap",
+            intf=main.params[ 'MNtcpdump' ][ 'intf' ],
+            port=main.params[ 'MNtcpdump' ][ 'port' ] )
 
-        cli_result = main.ONOScli1.start_onos_cli(ONOS1_ip)
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and onos1InstallResult
+                        and onos1Isup and cliResult )
 
-        main.step("Start Packet Capture MN")
-        main.Mininet2.start_tcpdump(
-                str(main.params['MNtcpdump']['folder'])+str(main.TEST)+"-MN.pcap",
-                intf = main.params['MNtcpdump']['intf'],
-                port = main.params['MNtcpdump']['port'])
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+                                 onpass="Test startup successful",
+                                 onfail="Test startup NOT successful" )
 
-
-        case1_result = (clean_install_result and package_result and
-                cell_result and verify_result and onos1_install_result and
-                onos1_isup and cli_result)
-
-        utilities.assert_equals(expect=main.TRUE, actual=case1_result,
-                onpass="Test startup successful",
-                onfail="Test startup NOT successful")
-
-
-        if case1_result==main.FALSE:
+        if case1Result == main.FALSE:
             main.cleanup()
             main.exit()
 
-    def CASE2(self,main) :
-        '''
+    def CASE2( self, main ):
+        """
         Assign mastership to controllers
-        '''
-        import time
-        import json
+        """
         import re
 
-        main.log.report("Assigning switches to controllers")
-        main.case("Assigning Controllers")
-        main.step("Assign switches to controllers")
+        main.log.report( "Assigning switches to controllers" )
+        main.case( "Assigning Controllers" )
+        main.step( "Assign switches to controllers" )
 
-        for i in range (1,29):
-           main.Mininet1.assign_sw_controller(sw=str(i),
-                    ip1=ONOS1_ip,port1=ONOS1_port)
+        for i in range( 1, 29 ):
+            main.Mininet1.assignSwController(
+                sw=str( i ),
+                ip1=ONOS1Ip, port1=ONOS1Port )
 
-        mastership_check = main.TRUE
-        for i in range (1,29):
-            response = main.Mininet1.get_sw_controller("s"+str(i))
+        mastershipCheck = main.TRUE
+        for i in range( 1, 29 ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
             try:
-                main.log.info(str(response))
-            except:
-                main.log.info(repr(response))
-            if re.search("tcp:"+ONOS1_ip,response):
-                mastership_check = mastership_check and main.TRUE
+                main.log.info( str( response ) )
+            except Exception:
+                main.log.info( repr( response ) )
+            if re.search( "tcp:" + ONOS1Ip, response ):
+                mastershipCheck = mastershipCheck and main.TRUE
             else:
-                mastership_check = main.FALSE
-        if mastership_check == main.TRUE:
-            main.log.report("Switch mastership assigned correctly")
-        utilities.assert_equals(expect = main.TRUE,actual=mastership_check,
-                onpass="Switch mastership assigned correctly",
-                onfail="Switches not assigned correctly to controllers")
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
+            main.log.report( "Switch mastership assigned correctly" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=mastershipCheck,
+            onpass="Switch mastership assigned correctly",
+            onfail="Switches not assigned correctly to controllers" )
 
-
-
-    def CASE3(self,main) :
+    def CASE3( self, main ):
         """
         Assign intents
-
         """
-        #FIXME: we must reinstall intents until we have a persistant datastore!
         import time
         import json
-        import re
-        main.log.report("Adding host intents")
-        main.case("Adding host Intents")
+        # FIXME: we must reinstall intents until we have a persistant
+        # datastore!
+        main.log.report( "Adding host intents" )
+        main.case( "Adding host Intents" )
 
-        main.step("Discovering  Hosts( Via pingall for now)")
-        #FIXME: Once we have a host discovery mechanism, use that instead
+        main.step( "Discovering  Hosts( Via pingall for now )" )
+        # FIXME: Once we have a host discovery mechanism, use that instead
 
-        #install onos-app-fwd
-        main.log.info("Install reactive forwarding app")
-        main.ONOScli1.feature_install("onos-app-fwd")
+        # install onos-app-fwd
+        main.log.info( "Install reactive forwarding app" )
+        main.ONOScli1.featureInstall( "onos-app-fwd" )
 
-        #REACTIVE FWD test
-        ping_result = main.FALSE
+        # REACTIVE FWD test
+        pingResult = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=pingResult,
+            onpass="Reactive Pingall test passed",
+            onfail="Reactive Pingall failed, one or more ping pairs failed" )
         time2 = time.time()
-        main.log.info("Time for pingall: %2f seconds" % (time2 - time1))
+        main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
 
-        #uninstall onos-app-fwd
-        main.log.info("Uninstall reactive forwarding app")
-        main.ONOScli1.feature_uninstall("onos-app-fwd")
-        #timeout for fwd flows
-        time.sleep(10)
+        # uninstall onos-app-fwd
+        main.log.info( "Uninstall reactive forwarding app" )
+        main.ONOScli1.featureUninstall( "onos-app-fwd" )
+        # timeout for fwd flows
+        time.sleep( 10 )
 
-        main.step("Add  host intents")
-        #TODO:  move the host numbers to params
-        import json
-        intents_json= json.loads(main.ONOScli1.hosts())
-        intent_add_result = True
-        for i in range(8,18):
-            main.log.info("Adding host intent between h"+str(i)+" and h"+str(i+10))
-            host1 =  "00:00:00:00:00:" + str(hex(i)[2:]).zfill(2).upper()
-            host2 =  "00:00:00:00:00:" + str(hex(i+10)[2:]).zfill(2).upper()
-            host1_id = main.ONOScli1.get_host(host1)['id']
-            host2_id = main.ONOScli1.get_host(host2)['id']
-            #NOTE: get host can return None
-            if host1_id and host2_id:
-                tmp_result = main.ONOScli1.add_host_intent(host1_id, host2_id )
+        main.step( "Add  host intents" )
+        intentIds = []
+        # TODO:  move the host numbers to params
+        #        Maybe look at all the paths we ping?
+        intentAddResult = True
+        hostResult = main.TRUE
+        for i in range( 8, 18 ):
+            main.log.info( "Adding host intent between h" + str( i ) +
+                           " and h" + str( i + 10 ) )
+            host1 = "00:00:00:00:00:" + \
+                str( hex( i )[ 2: ] ).zfill( 2 ).upper()
+            host2 = "00:00:00:00:00:" + \
+                str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
+            # NOTE: getHost can return None
+            host1Dict = main.ONOScli1.getHost( host1 )
+            host2Dict = main.ONOScli1.getHost( host2 )
+            host1Id = None
+            host2Id = None
+            if host1Dict and host2Dict:
+                host1Id = host1Dict.get( 'id', None )
+                host2Id = host2Dict.get( 'id', None )
+            if host1Id and host2Id:
+                tmpId = main.ONOScli1.addHostIntent(
+                    host1Id,
+                    host2Id )
+                if tmpId:
+                    main.log.info( "Added intent with id: " + tmpId )
+                    intentIds.append( tmpId )
+                else:
+                    main.log.error( "addHostIntent reutrned None" )
             else:
-                main.log.error("Error, get_host() failed")
-                tmp_result = main.FALSE
-            intent_add_result = bool(intent_add_result and tmp_result)
-        utilities.assert_equals(expect=True, actual=intent_add_result,
-                onpass="Switch mastership correctly assigned",
-                onfail="Error in (re)assigning switch mastership")
-        #TODO Check if intents all exist in datastore
-        #NOTE: Do we need to print this once the test is working?
-        #main.log.info(json.dumps(json.loads(main.ONOScli1.intents(json_format=True)),
-        #    sort_keys=True, indent=4, separators=(',', ': ') ) )
+                main.log.error( "Error, getHost() failed" )
+                main.log.warn( json.dumps( json.loads( main.ONOScli1.hosts() ),
+                                           sort_keys=True,
+                                           indent=4,
+                                           separators=( ',', ': ' ) ) )
+                hostResult = main.FALSE
+        onosIds = main.ONOScli1.getAllIntentsId()
+        main.log.info( "Submitted intents: " + str( intentIds ) )
+        main.log.info( "Intents in ONOS: " + str( onosIds ) )
+        for intent in intentIds:
+            if intent in onosIds:
+                pass  # intent submitted is still in onos
+            else:
+                intentAddResult = False
+        # Print the intent states
+        intents = main.ONOScli1.intents()
+        intentStates = []
+        installedCheck = True 
+        main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+        count = 0
+        for intent in json.loads( intents ):  # Iter through intents of a node
+            state = intent.get( 'state', None )
+            if "INSTALLED" not in state:
+                installedCheck = False
+            intentId = intent.get( 'id', None )
+            intentStates.append( ( intentId, state ) )
+        # add submitted intents not in the store
+        tmplist = [ i for i, s in intentStates ]
+        missingIntents = False
+        for i in intentIds:
+            if i not in tmplist:
+                intentStates.append( ( i, " - " ) )
+                missingIntents = True
+        intentStates.sort()
+        for i, s in intentStates:
+            count += 1
+            main.log.info( "%-6s%-15s%-15s" %
+                           ( str( count ), str( i ), str( s ) ) )
+        main.ONOScli1.leaders()
+        main.ONOScli1.partitions()
+        # for node in nodes:
+        #     node.pendingMap()
+        pendingMap = main.ONOScli1.pendingMap()
+        intentAddResult = bool( pingResult and hostResult and intentAddResult
+                                and not missingIntents and installedCheck )
+        utilities.assert_equals(
+            expect=True,
+            actual=intentAddResult,
+            onpass="Pushed host intents to ONOS",
+            onfail="Error in pushing host intents to ONOS" )
 
-    def CASE4(self,main) :
+        if not intentAddResult or "key" in pendingMap:
+            import time
+            installedCheck = True
+            main.log.info( "Sleeping 60 seconds to see if intents are found" )
+            time.sleep( 60 )
+            onosIds = main.ONOScli1.getAllIntentsId()
+            main.log.info( "Submitted intents: " + str( intentIds ) )
+            main.log.info( "Intents in ONOS: " + str( onosIds ) )
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            for intent in json.loads( intents ):
+                # Iter through intents of a node
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            # add submitted intents not in the store
+            tmplist = [ i for i, s in intentStates ]
+            for i in intentIds:
+                if i not in tmplist:
+                    intentStates.append( ( i, " - " ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.pendingMap()
+
+    def CASE4( self, main ):
         """
         Ping across added host intents
         """
-        description = " Ping across added host intents"
-        main.log.report(description)
-        main.case(description)
-        Ping_Result = main.TRUE
-        for i in range(8,18):
-            ping = main.Mininet1.pingHost(src="h"+str(i),target="h"+str(i+10))
-            Ping_Result = Ping_Result and ping
-            if ping==main.FALSE:
-                main.log.warn("Ping failed between h"+str(i)+" and h" + str(i+10))
-            elif ping==main.TRUE:
-                main.log.info("Ping test passed!")
-                Ping_Result = main.TRUE
-        if Ping_Result==main.FALSE:
-            main.log.report("Intents have not been installed correctly, pings failed.")
-        if Ping_Result==main.TRUE:
-            main.log.report("Intents have been installed correctly and verified by pings")
-        utilities.assert_equals(expect = main.TRUE,actual=Ping_Result,
-                onpass="Intents have been installed correctly and pings work",
-                onfail ="Intents have not been installed correctly, pings failed." )
-
-    def CASE5(self,main) :
-        '''
-        Reading state of ONOS
-        '''
-        import time
         import json
-        from subprocess import Popen, PIPE
-        from sts.topology.teston_topology import TestONTopology # assumes that sts is already in you PYTHONPATH
+        description = " Ping across added host intents"
+        main.log.report( description )
+        main.case( description )
+        PingResult = main.TRUE
+        for i in range( 8, 18 ):
+            ping = main.Mininet1.pingHost( src="h" + str( i ),
+                                           target="h" + str( i + 10 ) )
+            PingResult = PingResult and ping
+            if ping == main.FALSE:
+                main.log.warn( "Ping failed between h" + str( i ) +
+                               " and h" + str( i + 10 ) )
+            elif ping == main.TRUE:
+                main.log.info( "Ping test passed!" )
+                # Don't set PingResult or you'd override failures
+        if PingResult == main.FALSE:
+            main.log.report(
+                "Intents have not been installed correctly, pings failed." )
+            # TODO: pretty print
+            main.log.warn( "ONSO1 intents: " )
+            main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
+                                       sort_keys=True,
+                                       indent=4,
+                                       separators=( ',', ': ' ) ) )
+        if PingResult == main.TRUE:
+            main.log.report(
+                "Intents have been installed correctly and verified by pings" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=PingResult,
+            onpass="Intents have been installed correctly and pings work",
+            onfail="Intents have not been installed correctly, pings failed." )
 
-        main.log.report("Setting up and gathering data for current state")
-        main.case("Setting up and gathering data for current state")
-        #The general idea for this test case is to pull the state of (intents,flows, topology,...) from each ONOS node
-        #We can then compare them with eachother and also with past states
+        installedCheck = True
+        if PingResult is not main.TRUE:
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            # Iter through intents of a node
+            for intent in json.loads( intents ):
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.partitions()
+        if not installedCheck:
+            main.log.info( "Waiting 60 seconds to see if intent states change" )
+            time.sleep( 60 )
+            # Print the intent states
+            intents = main.ONOScli1.intents()
+            intentStates = []
+            main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
+            count = 0
+            # Iter through intents of a node
+            for intent in json.loads( intents ):
+                state = intent.get( 'state', None )
+                if "INSTALLED" not in state:
+                    installedCheck = False
+                intentId = intent.get( 'id', None )
+                intentStates.append( ( intentId, state ) )
+            intentStates.sort()
+            for i, s in intentStates:
+                count += 1
+                main.log.info( "%-6s%-15s%-15s" %
+                               ( str( count ), str( i ), str( s ) ) )
+            main.ONOScli1.leaders()
+            main.ONOScli1.partitions()
+            main.ONOScli1.pendingMap()
 
-        main.step("Get the Mastership of each switch from each controller")
-        global mastership_state
-        mastership_state = []
+    def CASE5( self, main ):
+        """
+        Reading state of ONOS
+        """
+        import json
+        # assumes that sts is already in you PYTHONPATH
+        from sts.topology.teston_topology import TestONTopology
 
-        #Assert that each device has a master
-        roles_not_null = main.ONOScli1.roles_not_null()
-        utilities.assert_equals(expect = main.TRUE,actual=roles_not_null,
-                onpass="Each device has a master",
-                onfail="Some devices don't have a master assigned")
+        main.log.report( "Setting up and gathering data for current state" )
+        main.case( "Setting up and gathering data for current state" )
+        # The general idea for this test case is to pull the state of
+        # ( intents,flows, topology,... ) from each ONOS node
+        # We can then compare them with eachother and also with past states
 
+        main.step( "Get the Mastership of each switch from each controller" )
+        global mastershipState
+        mastershipState = []
 
-        ONOS1_mastership = main.ONOScli1.roles()
-        #print json.dumps(json.loads(ONOS1_mastership), sort_keys=True, indent=4, separators=(',', ': '))
-        #TODO: Make this a meaningful check
-        if "Error" in ONOS1_mastership or not ONOS1_mastership:
-            main.log.report("Error in getting ONOS roles")
-            main.log.warn("ONOS1 mastership response: " + repr(ONOS1_mastership))
-            consistent_mastership = main.FALSE
+        # Assert that each device has a master
+        rolesNotNull = main.ONOScli1.rolesNotNull()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=rolesNotNull,
+            onpass="Each device has a master",
+            onfail="Some devices don't have a master assigned" )
+
+        ONOS1Mastership = main.ONOScli1.roles()
+        # TODO: Make this a meaningful check
+        if "Error" in ONOS1Mastership or not ONOS1Mastership:
+            main.log.report( "Error in getting ONOS roles" )
+            main.log.warn(
+                "ONOS1 mastership response: " +
+                repr( ONOS1Mastership ) )
+            consistentMastership = main.FALSE
         else:
-            mastership_state = ONOS1_mastership
-            consistent_mastership = main.TRUE
+            mastershipState = ONOS1Mastership
+            consistentMastership = main.TRUE
 
-
-        main.step("Get the intents from each controller")
-        global intent_state
-        intent_state = []
-        ONOS1_intents = main.ONOScli1.intents( json_format=True )
-        intent_check = main.FALSE
-        if "Error" in ONOS1_intents or not ONOS1_intents:
-            main.log.report("Error in getting ONOS intents")
-            main.log.warn("ONOS1 intents response: " + repr(ONOS1_intents))
+        main.step( "Get the intents from each controller" )
+        global intentState
+        intentState = []
+        ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
+        intentCheck = main.FALSE
+        if "Error" in ONOS1Intents or not ONOS1Intents:
+            main.log.report( "Error in getting ONOS intents" )
+            main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
         else:
-            intent_check = main.TRUE
+            intentCheck = main.TRUE
 
-
-        main.step("Get the flows from each controller")
-        global flow_state
-        flow_state = []
-        ONOS1_flows = main.ONOScli1.flows( json_format=True )
-        flow_check = main.FALSE
-        if "Error" in ONOS1_flows or not ONOS1_flows:
-            main.log.report("Error in getting ONOS intents")
-            main.log.warn("ONOS1 flows repsponse: "+ ONOS1_flows)
+        main.step( "Get the flows from each controller" )
+        global flowState
+        flowState = []
+        flowCheck = main.FALSE
+        ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
+        if "Error" in ONOS1Flows or not ONOS1Flows:
+            main.log.report( "Error in getting ONOS flows" )
+            main.log.warn( "ONOS1 flows repsponse: " + ONOS1Flows )
         else:
-            #TODO: Do a better check, maybe compare flows on switches?
-            flow_state = ONOS1_flows
-            flow_check = main.TRUE
+            # TODO: Do a better check, maybe compare flows on switches?
+            flowState = ONOS1Flows
+            flowCheck = main.TRUE
 
-
-        main.step("Get the OF Table entries")
+        main.step( "Get the OF Table entries" )
         global flows
-        flows=[]
-        for i in range(1,29):
-            flows.append(main.Mininet2.get_flowTable(1.3, "s"+str(i)))
+        flows = []
+        for i in range( 1, 29 ):
+            flows.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
+        if flowCheck == main.FALSE:
+            for table in flows:
+                main.log.warn( table )
+        # TODO: Compare switch flow tables with ONOS flow tables
 
-        #TODO: Compare switch flow tables with ONOS flow tables
-
-        main.step("Create TestONTopology object")
+        main.step( "Create TestONTopology object" )
         ctrls = []
         count = 1
         temp = ()
-        temp = temp + (getattr(main,('ONOS' + str(count))),)
-        temp = temp + ("ONOS"+str(count),)
-        temp = temp + (main.params['CTRL']['ip'+str(count)],)
-        temp = temp + (eval(main.params['CTRL']['port'+str(count)]),)
-        ctrls.append(temp)
-        MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
+        temp = temp + ( "ONOS" + str( count ), )
+        temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
+        temp = temp + \
+            ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+        ctrls.append( temp )
+        MNTopo = TestONTopology(
+            main.Mininet1,
+            ctrls )  # can also add Intent API info for intent operations
 
-        main.step("Collecting topology information from ONOS")
+        main.step( "Collecting topology information from ONOS" )
         devices = []
         devices.append( main.ONOScli1.devices() )
-        '''
         hosts = []
-        hosts.append( main.ONOScli1.hosts() )
-        '''
+        hosts.append( json.loads( main.ONOScli1.hosts() ) )
         ports = []
         ports.append( main.ONOScli1.ports() )
         links = []
         links.append( main.ONOScli1.links() )
+        clusters = []
+        clusters.append( main.ONOScli1.clusters() )
+        ipResult = main.TRUE
+        for controller in range( 0, len( hosts ) ):
+            controllerStr = str( controller + 1 )
+            for host in hosts[ controller ]:
+                if host is None or host.get( 'ips', [] ) == []:
+                    main.log.error(
+                        "DEBUG:Error with host ips on controller" +
+                        controllerStr + ": " + str( host ) )
+                    ipResult = main.FALSE
 
+        # there should always only be one cluster
+        numClusters = len( json.loads( clusters[ 0 ] ) )
+        clusterResults = main.FALSE
+        if numClusters == 1:
+            clusterResults = main.TRUE
+        utilities.assert_equals(
+            expect=1,
+            actual=numClusters,
+            onpass="ONOS shows 1 SCC",
+            onfail="ONOS shows " + str( numClusters ) + " SCCs" )
 
-        main.step("Comparing ONOS topology to MN")
-        devices_results = main.TRUE
-        ports_results = main.TRUE
-        links_results = main.TRUE
-        for controller in range(num_controllers):
-            if devices[controller] or not "Error" in devices[controller]:
-                current_devices_result =  main.Mininet1.compare_switches(MNTopo, json.loads(devices[controller]))
+        main.step( "Comparing ONOS topology to MN" )
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = main.TRUE
+        hostsResults = main.TRUE
+        for controller in range( numControllers ):
+            controllerStr = str( controller + 1 )
+            if devices[ controller ] or "Error" not in devices[ controller ]:
+                currentDevicesResult = main.Mininet1.compareSwitches(
+                    MNTopo,
+                    json.loads( devices[ controller ] ) )
             else:
-                current_devices_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_devices_result,
-                    onpass="ONOS"+str(int(controller+1))+" Switches view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" Switches view is incorrect")
+                currentDevicesResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentDevicesResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " Switches view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " Switches view is incorrect" )
 
-            if ports[controller] or not "Error" in ports[controller]:
-                current_ports_result =  main.Mininet1.compare_ports(MNTopo, json.loads(ports[controller]))
+            if ports[ controller ] or "Error" not in ports[ controller ]:
+                currentPortsResult = main.Mininet1.comparePorts(
+                    MNTopo,
+                    json.loads( ports[ controller ] ) )
             else:
-                current_ports_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_ports_result,
-                    onpass="ONOS"+str(int(controller+1))+" ports view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" ports view is incorrect")
+                currentPortsResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentPortsResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " ports view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " ports view is incorrect" )
 
-            if links[controller] or not "Error" in links[controller]:
-                current_links_result =  main.Mininet1.compare_links(MNTopo, json.loads(links[controller]))
+            if links[ controller ] or "Error" not in links[ controller ]:
+                currentLinksResult = main.Mininet1.compareLinks(
+                    MNTopo,
+                    json.loads( links[ controller ] ) )
             else:
-                current_links_result = main.FALSE
-            utilities.assert_equals(expect=main.TRUE, actual=current_links_result,
-                    onpass="ONOS"+str(int(controller+1))+" links view is correct",
-                    onfail="ONOS"+str(int(controller+1))+" links view is incorrect")
+                currentLinksResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentLinksResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " links view is correct",
+                                     onfail="ONOS" + controllerStr +
+                                     " links view is incorrect" )
 
-            devices_results = devices_results and current_devices_result
-            ports_results = ports_results and current_ports_result
-            links_results = links_results and current_links_result
+            if hosts[ controller ] or "Error" not in hosts[ controller ]:
+                currentHostsResult = main.Mininet1.compareHosts(
+                    MNTopo, hosts[ controller ] )
+            else:
+                currentHostsResult = main.FALSE
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=currentHostsResult,
+                                     onpass="ONOS" + controllerStr +
+                                     " hosts exist in Mininet",
+                                     onfail="ONOS" + controllerStr +
+                                     " hosts don't match Mininet" )
 
-        topo_result = devices_results and ports_results and links_results
-        utilities.assert_equals(expect=main.TRUE, actual=topo_result,
-                onpass="Topology Check Test successful",
-                onfail="Topology Check Test NOT successful")
+            devicesResults = devicesResults and currentDevicesResult
+            portsResults = portsResults and currentPortsResult
+            linksResults = linksResults and currentLinksResult
+            hostsResults = hostsResults and currentHostsResult
 
-        final_assert = main.TRUE
-        final_assert = final_assert and topo_result and flow_check \
-                and intent_check and consistent_mastership and roles_not_null
-        utilities.assert_equals(expect=main.TRUE, actual=final_assert,
-                onpass="State check successful",
-                onfail="State check NOT successful")
+        topoResult = devicesResults and portsResults and linksResults\
+                     and clusterResults and ipResult and hostsResults
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                 onpass="Topology Check Test successful",
+                                 onfail="Topology Check Test NOT successful" )
 
+        finalAssert = main.TRUE
+        finalAssert = finalAssert and topoResult and flowCheck \
+                      and intentCheck and consistentMastership and rolesNotNull
+        utilities.assert_equals( expect=main.TRUE, actual=finalAssert,
+                                 onpass="State check successful",
+                                 onfail="State check NOT successful" )
 
-    def CASE6(self,main) :
-        '''
+    def CASE6( self, main ):
+        """
         The Failure case.
-        '''
+        """
         import time
 
-        main.log.report("Restart ONOS node")
-        main.log.case("Restart ONOS node")
-        main.ONOSbench.onos_kill(ONOS1_ip)
+        main.log.report( "Restart ONOS node" )
+        main.log.case( "Restart ONOS node" )
+        main.ONOSbench.onosKill( ONOS1Ip )
         start = time.time()
 
-        main.step("Checking if ONOS is up yet")
+        main.step( "Checking if ONOS is up yet" )
         count = 0
         while count < 10:
-            onos1_isup = main.ONOSbench.isup(ONOS1_ip)
-            if onos1_isup == main.TRUE:
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            if onos1Isup == main.TRUE:
                 elapsed = time.time() - start
                 break
             else:
                 count = count + 1
 
-        cli_result = main.ONOScli1.start_onos_cli(ONOS1_ip)
+        cliResult = main.ONOScli1.startOnosCli( ONOS1Ip )
 
-        case_results = main.TRUE and onos1_isup and cli_result
-        utilities.assert_equals(expect=main.TRUE, actual=case_results,
-                onpass="ONOS restart successful",
-                onfail="ONOS restart NOT successful")
-        main.log.info("ESTIMATE: ONOS took %s seconds to restart" % str(elapsed) )
-        time.sleep(5)
+        caseResults = main.TRUE and onos1Isup and cliResult
+        utilities.assert_equals( expect=main.TRUE, actual=caseResults,
+                                 onpass="ONOS restart successful",
+                                 onfail="ONOS restart NOT successful" )
+        if elapsed:
+            main.log.info( "ESTIMATE: ONOS took %s seconds to restart" %
+                           str( elapsed ) )
+        time.sleep( 5 )
 
-    def CASE7(self,main) :
-        '''
+    def CASE7( self, main ):
+        """
         Check state after ONOS failure
-        '''
-        import os
+        """
         import json
-        main.case("Running ONOS Constant State Tests")
+        main.case( "Running ONOS Constant State Tests" )
 
-        #Assert that each device has a master
-        roles_not_null = main.ONOScli1.roles_not_null()
-        utilities.assert_equals(expect = main.TRUE,actual=roles_not_null,
-                onpass="Each device has a master",
-                onfail="Some devices don't have a master assigned")
+        # Assert that each device has a master
+        rolesNotNull = main.ONOScli1.rolesNotNull()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=rolesNotNull,
+            onpass="Each device has a master",
+            onfail="Some devices don't have a master assigned" )
 
-
-
-        main.step("Check if switch roles are consistent across all nodes")
-        ONOS1_mastership = main.ONOScli1.roles()
-        #FIXME: Refactor this whole case for single instance
-        #print json.dumps(json.loads(ONOS1_mastership), sort_keys=True, indent=4, separators=(',', ': '))
-        if "Error" in ONOS1_mastership or not ONOS1_mastership:
-            main.log.report("Error in getting ONOS mastership")
-            main.log.warn("ONOS1 mastership response: " + repr(ONOS1_mastership))
-            consistent_mastership = main.FALSE
+        main.step( "Check if switch roles are consistent across all nodes" )
+        ONOS1Mastership = main.ONOScli1.roles()
+        # FIXME: Refactor this whole case for single instance
+        if "Error" in ONOS1Mastership or not ONOS1Mastership:
+            main.log.report( "Error in getting ONOS mastership" )
+            main.log.warn( "ONOS1 mastership response: " +
+                           repr( ONOS1Mastership ) )
+            consistentMastership = main.FALSE
         else:
-            consistent_mastership = main.TRUE
-            main.log.report("Switch roles are consistent across all ONOS nodes")
-        utilities.assert_equals(expect = main.TRUE,actual=consistent_mastership,
-                onpass="Switch roles are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of switch roles")
-
+            consistentMastership = main.TRUE
+            main.log.report(
+                "Switch roles are consistent across all ONOS nodes" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=consistentMastership,
+            onpass="Switch roles are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of switch roles" )
 
         description2 = "Compare switch roles from before failure"
-        main.step(description2)
+        main.step( description2 )
 
-        current_json = json.loads(ONOS1_mastership)
-        old_json = json.loads(mastership_state)
-        mastership_check = main.TRUE
-        for i in range(1,29):
-            switchDPID = str(main.Mininet1.getSwitchDPID(switch="s"+str(i)))
+        currentJson = json.loads( ONOS1Mastership )
+        oldJson = json.loads( mastershipState )
+        mastershipCheck = main.TRUE
+        for i in range( 1, 29 ):
+            switchDPID = str(
+                main.Mininet1.getSwitchDPID( switch="s" + str( i ) ) )
 
-            current = [switch['master'] for switch in current_json if switchDPID in switch['id']]
-            old = [switch['master'] for switch in old_json if switchDPID in switch['id']]
+            current = [ switch[ 'master' ] for switch in currentJson
+                        if switchDPID in switch[ 'id' ] ]
+            old = [ switch[ 'master' ] for switch in oldJson
+                    if switchDPID in switch[ 'id' ] ]
             if current == old:
-                mastership_check = mastership_check and main.TRUE
+                mastershipCheck = mastershipCheck and main.TRUE
             else:
-                main.log.warn("Mastership of switch %s changed" % switchDPID)
-                mastership_check = main.FALSE
-        if mastership_check == main.TRUE:
-            main.log.report("Mastership of Switches was not changed")
-        utilities.assert_equals(expect=main.TRUE,actual=mastership_check,
-                onpass="Mastership of Switches was not changed",
-                onfail="Mastership of some switches changed")
-        mastership_check = mastership_check and consistent_mastership
+                main.log.warn( "Mastership of switch %s changed" % switchDPID )
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
+            main.log.report( "Mastership of Switches was not changed" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=mastershipCheck,
+            onpass="Mastership of Switches was not changed",
+            onfail="Mastership of some switches changed" )
+        mastershipCheck = mastershipCheck and consistentMastership
 
-
-
-        main.step("Get the intents and compare across all nodes")
-        ONOS1_intents = main.ONOScli1.intents( json_format=True )
-        intent_check = main.FALSE
-        if "Error" in ONOS1_intents or not ONOS1_intents:
-            main.log.report("Error in getting ONOS intents")
-            main.log.warn("ONOS1 intents response: " + repr(ONOS1_intents))
+        main.step( "Get the intents and compare across all nodes" )
+        ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
+        intentCheck = main.FALSE
+        if "Error" in ONOS1Intents or not ONOS1Intents:
+            main.log.report( "Error in getting ONOS intents" )
+            main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
         else:
-            intent_check = main.TRUE
-            main.log.report("Intents are consistent across all ONOS nodes")
-        utilities.assert_equals(expect = main.TRUE,actual=intent_check,
-                onpass="Intents are consistent across all ONOS nodes",
-                onfail="ONOS nodes have different views of intents")
+            intentCheck = main.TRUE
+            main.log.report( "Intents are consistent across all ONOS nodes" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=intentCheck,
+            onpass="Intents are consistent across all ONOS nodes",
+            onfail="ONOS nodes have different views of intents" )
+        # Print the intent states
+        intents = []
+        intents.append( ONOS1Intents )
+        intentStates = []
+        for node in intents:  # Iter through ONOS nodes
+            nodeStates = []
+            # Iter through intents of a node
+            for intent in json.loads( node ):
+                nodeStates.append( intent[ 'state' ] )
+            intentStates.append( nodeStates )
+            out = [ (i, nodeStates.count( i ) ) for i in set( nodeStates ) ]
+            main.log.info( dict( out ) )
 
-        #NOTE: Hazelcast has no durability, so intents are lost
-        '''
-        main.step("Compare current intents with intents before the failure")
-        if intent_state == ONOS1_intents:
-            same_intents = main.TRUE
-            main.log.report("Intents are consistent with before failure")
-        #TODO: possibly the states have changed? we may need to figure out what the aceptable states are
+        # NOTE: Store has no durability, so intents are lost across system
+        #       restarts
+        """
+        main.step( "Compare current intents with intents before the failure" )
+        # NOTE: this requires case 5 to pass for intentState to be set.
+        #      maybe we should stop the test if that fails?
+        sameIntents = main.TRUE
+        if intentState and intentState == ONOS1Intents:
+            sameIntents = main.TRUE
+            main.log.report( "Intents are consistent with before failure" )
+        # TODO: possibly the states have changed? we may need to figure out
+        # what the aceptable states are
         else:
-            same_intents = main.FALSE
-        utilities.assert_equals(expect = main.TRUE,actual=same_intents,
-                onpass="Intents are consistent with before failure",
-                onfail="The Intents changed during failure")
-        intent_check = intent_check and same_intents
-        '''
+            try:
+                main.log.warn( "ONOS1 intents: " )
+                print json.dumps( json.loads( ONOS1Intents ),
+                                  sort_keys=True, indent=4,
+                                  separators=( ',', ': ' ) )
+            except Exception:
+                pass
+            sameIntents = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=sameIntents,
+            onpass="Intents are consistent with before failure",
+            onfail="The Intents changed during failure" )
+        intentCheck = intentCheck and sameIntents
+        """
+        main.step( "Get the OF Table entries and compare to before " +
+                   "component failure" )
+        FlowTables = main.TRUE
+        flows2 = []
+        for i in range( 28 ):
+            main.log.info( "Checking flow table on s" + str( i + 1 ) )
+            tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
+            flows2.append( tmpFlows )
+            tempResult = main.Mininet2.flowComp(
+                flow1=flows[ i ],
+                flow2=tmpFlows )
+            FlowTables = FlowTables and tempResult
+            if FlowTables == main.FALSE:
+                main.log.info( "Differences in flow table for switch: s" +
+                               str( i + 1 ) )
+        if FlowTables == main.TRUE:
+            main.log.report( "No changes were found in the flow tables" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=FlowTables,
+            onpass="No changes were found in the flow tables",
+            onfail="Changes were found in the flow tables" )
 
+        # Test of LeadershipElection
 
-
-        main.step("Get the OF Table entries and compare to before component failure")
-        Flow_Tables = main.TRUE
-        flows2=[]
-        for i in range(28):
-            main.log.info("Checking flow table on s" + str(i+1))
-            tmp_flows = main.Mininet2.get_flowTable(1.3, "s"+str(i+1))
-            flows2.append(tmp_flows)
-            temp_result = main.Mininet2.flow_comp(flow1=flows[i],flow2=tmp_flows)
-            Flow_Tables = Flow_Tables and temp_result
-            if Flow_Tables == main.FALSE:
-                main.log.info("Differences in flow table for switch: "+str(i+1))
-        if Flow_Tables == main.TRUE:
-            main.log.report("No changes were found in the flow tables")
-        utilities.assert_equals(expect=main.TRUE,actual=Flow_Tables,
-                onpass="No changes were found in the flow tables",
-                onfail="Changes were found in the flow tables")
-
-
-        #Test of LeadershipElection
-
-        leader = ONOS1_ip
-        leader_result = main.TRUE
-        for controller in range(1,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            leaderN = node.election_test_leader()
-            #verify leader is ONOS1
-            #NOTE even though we restarted ONOS, it is the only one so onos 1 must be leader
+        leader = ONOS1Ip
+        leaderResult = main.TRUE
+        for controller in range( 1, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            leaderN = node.electionTestLeader()
+            # verify leader is ONOS1
+            # NOTE even though we restarted ONOS, it is the only one so onos 1
+            # must be leader
             if leaderN == leader:
-                #all is well
+                # all is well
                 pass
             elif leaderN == main.FALSE:
-                #error in  response
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
+                # error in  response
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, check the" +
+                                 " error logs" )
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
-                main.log.report("ONOS" + str(controller) + " sees "+str(leaderN) +
-                        " as the leader of the election app. Leader should be "+str(leader) )
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a new leader was re-elected if applicable)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+                leaderResult = main.FALSE
+                main.log.report( "ONOS" + str( controller ) + " sees " +
+                                 str( leaderN ) +
+                                 " as the leader of the election app. " +
+                                 "Leader should be " + str( leader ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a new " +
+                             "leader was re-elected if applicable )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-
-        result = mastership_check and intent_check and Flow_Tables and roles_not_null\
-                and leader_result
-        result = int(result)
+        result = ( mastershipCheck and intentCheck and FlowTables and
+                   rolesNotNull and leaderResult )
+        result = int( result )
         if result == main.TRUE:
-            main.log.report("Constant State Tests Passed")
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="Constant State Tests Passed",
-                onfail="Constant state tests failed")
+            main.log.report( "Constant State Tests Passed" )
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="Constant State Tests Passed",
+                                 onfail="Constant state tests failed" )
 
-    def CASE8 (self,main):
-        '''
+    def CASE8( self, main ):
+        """
         Compare topo
-        '''
+        """
         import sys
-        sys.path.append("/home/admin/sts") # Trying to remove some dependancies, #FIXME add this path to params
-        from sts.topology.teston_topology import TestONTopology # assumes that sts is already in you PYTHONPATH
+        # FIXME add this path to params
+        sys.path.append( "/home/admin/sts" )
+        # assumes that sts is already in you PYTHONPATH
+        from sts.topology.teston_topology import TestONTopology
         import json
         import time
 
-        description ="Compare ONOS Topology view to Mininet topology"
-        main.case(description)
-        main.log.report(description)
-        main.step("Create TestONTopology object")
+        description = "Compare ONOS Topology view to Mininet topology"
+        main.case( description )
+        main.log.report( description )
+        main.step( "Create TestONTopology object" )
         ctrls = []
         count = 1
         temp = ()
-        temp = temp + (getattr(main,('ONOS' + str(count))),)
-        temp = temp + ("ONOS"+str(count),)
-        temp = temp + (main.params['CTRL']['ip'+str(count)],)
-        temp = temp + (eval(main.params['CTRL']['port'+str(count)]),)
-        ctrls.append(temp)
-        MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
+        temp = temp + ( "ONOS" + str( count ), )
+        temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
+        temp = temp + \
+            ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+        ctrls.append( temp )
+        MNTopo = TestONTopology(
+            main.Mininet1,
+            ctrls )  # can also add Intent API info for intent operations
 
-        main.step("Comparing ONOS topology to MN")
-        devices_results = main.TRUE
-        ports_results = main.TRUE
-        links_results = main.TRUE
-        topo_result = main.FALSE
+        main.step( "Comparing ONOS topology to MN" )
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = main.TRUE
+        hostsResults = main.TRUE
+        topoResult = main.FALSE
         elapsed = 0
         count = 0
-        main.step("Collecting topology information from ONOS")
-        start_time = time.time()
-        while topo_result == main.FALSE and elapsed < 60:
+        main.step( "Collecting topology information from ONOS" )
+        startTime = time.time()
+        # Give time for Gossip to work
+        while topoResult == main.FALSE and elapsed < 60:
             count = count + 1
             if count > 1:
-                MNTopo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
-            cli_start = time.time()
+                # TODO: Depricate STS usage
+                MNTopo = TestONTopology( main.Mininet1, ctrls )
+            cliStart = time.time()
             devices = []
             devices.append( main.ONOScli1.devices() )
-            '''
             hosts = []
-            hosts.append( main.ONOScli1.hosts() )
-            '''
+            hosts.append( json.loads( main.ONOScli1.hosts() ) )
+            ipResult = main.TRUE
+            for controller in range( 0, len( hosts ) ):
+                controllerStr = str( controller + 1 )
+                for host in hosts[ controller ]:
+                    if host is None or host.get( 'ips', [] ) == []:
+                        main.log.error(
+                            "DEBUG:Error with host ips on controller" +
+                            controllerStr + ": " + str( host ) )
+                        ipResult = main.FALSE
             ports = []
             ports.append( main.ONOScli1.ports() )
             links = []
             links.append( main.ONOScli1.links() )
-            elapsed = time.time() - start_time
-            print "CLI time: " + str(time.time() - cli_start)
+            clusters = []
+            clusters.append( main.ONOScli1.clusters() )
 
-            for controller in range(num_controllers):
-                if devices[controller] or not "Error" in devices[controller]:
-                    current_devices_result =  main.Mininet1.compare_switches(MNTopo, json.loads(devices[controller]))
+            elapsed = time.time() - startTime
+            cliTime = time.time() - cliStart
+            print "CLI time: " + str( cliTime )
+
+            for controller in range( numControllers ):
+                controllerStr = str( controller + 1 )
+                if devices[ controller ] or "Error" not in devices[
+                        controller ]:
+                    currentDevicesResult = main.Mininet1.compareSwitches(
+                        MNTopo,
+                        json.loads( devices[ controller ] ) )
                 else:
-                    current_devices_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_devices_result,
-                        onpass="ONOS"+str(int(controller+1))+" Switches view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" Switches view is incorrect")
+                    currentDevicesResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentDevicesResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " Switches view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " Switches view is incorrect" )
 
-                if ports[controller] or not "Error" in ports[controller]:
-                    current_ports_result =  main.Mininet1.compare_ports(MNTopo, json.loads(ports[controller]))
+                if ports[ controller ] or "Error" not in ports[ controller ]:
+                    currentPortsResult = main.Mininet1.comparePorts(
+                        MNTopo,
+                        json.loads( ports[ controller ] ) )
                 else:
-                    current_ports_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_ports_result,
-                        onpass="ONOS"+str(int(controller+1))+" ports view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" ports view is incorrect")
+                    currentPortsResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentPortsResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " ports view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " ports view is incorrect" )
 
-                if links[controller] or not "Error" in links[controller]:
-                    current_links_result =  main.Mininet1.compare_links(MNTopo, json.loads(links[controller]))
+                if links[ controller ] or "Error" not in links[ controller ]:
+                    currentLinksResult = main.Mininet1.compareLinks(
+                        MNTopo,
+                        json.loads( links[ controller ] ) )
                 else:
-                    current_links_result = main.FALSE
-                utilities.assert_equals(expect=main.TRUE, actual=current_links_result,
-                        onpass="ONOS"+str(int(controller+1))+" links view is correct",
-                        onfail="ONOS"+str(int(controller+1))+" links view is incorrect")
-            devices_results = devices_results and current_devices_result
-            ports_results = ports_results and current_ports_result
-            links_results = links_results and current_links_result
-            topo_result = devices_results and ports_results and links_results
+                    currentLinksResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentLinksResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " links view is correct",
+                                         onfail="ONOS" + controllerStr +
+                                         " links view is incorrect" )
 
-        topo_result = topo_result and int(count <= 2)
-        main.log.report("Very crass estimate for topology discovery/convergence(note it takes about 1 seconds to read the topology from each ONOS instance): " +\
-                str(elapsed) + " seconds, " + str(count) +" tries" )
-        if elapsed > 60:
-            main.log.report("Giving up on topology convergence")
-        utilities.assert_equals(expect=main.TRUE, actual=topo_result,
-                onpass="Topology Check Test successful",
-                onfail="Topology Check Test NOT successful")
-        if topo_result == main.TRUE:
-            main.log.report("ONOS topology view matches Mininet topology")
+                if hosts[ controller ] or "Error" not in hosts[ controller ]:
+                    currentHostsResult = main.Mininet1.compareHosts(
+                        MNTopo, hosts[ controller ] )
+                else:
+                    currentHostsResult = main.FALSE
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=currentHostsResult,
+                                         onpass="ONOS" + controllerStr +
+                                         " hosts exist in Mininet",
+                                         onfail="ONOS" + controllerStr +
+                                         " hosts don't match Mininet" )
 
+                devicesResults = devicesResults and currentDevicesResult
+                portsResults = portsResults and currentPortsResult
+                linksResults = linksResults and currentLinksResult
+                hostsResults = hostsResults and currentHostsResult
 
-    def CASE9 (self,main):
-        '''
+                # "consistent" results don't make sense for single instance
+            # there should always only be one cluster
+            numClusters = len( json.loads( clusters[ 0 ] ) )
+            clusterResults = main.FALSE
+            if numClusters == 1:
+                clusterResults = main.TRUE
+            utilities.assert_equals(
+                expect=1,
+                actual=numClusters,
+                onpass="ONOS shows 1 SCC",
+                onfail="ONOS shows " + str( numClusters ) + " SCCs" )
+
+            topoResult = ( devicesResults and portsResults and linksResults
+                           and hostsResults and ipResult and clusterResults )
+
+        topoResult = topoResult and int( count <= 2 )
+        note = "note it takes about " + str( int( cliTime ) ) + \
+            " seconds for the test to make all the cli calls to fetch " +\
+            "the topology from each ONOS instance"
+        main.log.info(
+            "Very crass estimate for topology discovery/convergence( " +
+            str( note ) + " ): " + str( elapsed ) + " seconds, " +
+            str( count ) + " tries" )
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                 onpass="Topology Check Test successful",
+                                 onfail="Topology Check Test NOT successful" )
+        if topoResult == main.TRUE:
+            main.log.report( "ONOS topology view matches Mininet topology" )
+
+    def CASE9( self, main ):
+        """
         Link s3-s28 down
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        import time
+        # NOTE: You should probably run a topology check after this
 
-        link_sleep = float(main.params['timers']['LinkDiscovery'])
+        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        description = "Turn off a link to ensure that Link Discovery is working properly"
-        main.log.report(description)
-        main.case(description)
+        description = "Turn off a link to ensure that Link Discovery " +\
+                      "is working properly"
+        main.log.report( description )
+        main.case( description )
 
+        main.step( "Kill Link between s3 and s28" )
+        LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
+        main.log.info( "Waiting " + str( linkSleep ) +
+                       " seconds for link down to be discovered" )
+        time.sleep( linkSleep )
+        utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
+                                 onpass="Link down succesful",
+                                 onfail="Failed to bring link down" )
+        # TODO do some sort of check here
 
-        main.step("Kill Link between s3 and s28")
-        Link_Down = main.Mininet1.link(END1="s3",END2="s28",OPTION="down")
-        main.log.info("Waiting " + str(link_sleep) + " seconds for link down to be discovered")
-        time.sleep(link_sleep)
-        utilities.assert_equals(expect=main.TRUE,actual=Link_Down,
-                onpass="Link down succesful",
-                onfail="Failed to bring link down")
-        #TODO do some sort of check here
-
-    def CASE10 (self,main):
-        '''
+    def CASE10( self, main ):
+        """
         Link s3-s28 up
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        import time
+        # NOTE: You should probably run a topology check after this
 
-        link_sleep = float(main.params['timers']['LinkDiscovery'])
+        linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        description = "Restore a link to ensure that Link Discovery is working properly"
-        main.log.report(description)
-        main.case(description)
+        description = "Restore a link to ensure that Link Discovery is " + \
+                      "working properly"
+        main.log.report( description )
+        main.case( description )
 
-        main.step("Bring link between s3 and s28 back up")
-        Link_Up = main.Mininet1.link(END1="s3",END2="s28",OPTION="up")
-        main.log.info("Waiting " + str(link_sleep) + " seconds for link up to be discovered")
-        time.sleep(link_sleep)
-        utilities.assert_equals(expect=main.TRUE,actual=Link_Up,
-                onpass="Link up succesful",
-                onfail="Failed to bring link up")
-        #TODO do some sort of check here
+        main.step( "Bring link between s3 and s28 back up" )
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
+        main.log.info( "Waiting " + str( linkSleep ) +
+                       " seconds for link up to be discovered" )
+        time.sleep( linkSleep )
+        utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
+                                 onpass="Link up succesful",
+                                 onfail="Failed to bring link up" )
+        # TODO do some sort of check here
 
-
-    def CASE11 (self, main) :
-        '''
+    def CASE11( self, main ):
+        """
         Switch Down
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        # NOTE: You should probably run a topology check after this
         import time
 
-        switch_sleep = float(main.params['timers']['SwitchDiscovery'])
+        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
 
         description = "Killing a switch to ensure it is discovered correctly"
-        main.log.report(description)
-        main.case(description)
+        main.log.report( description )
+        main.case( description )
+        switch = main.params[ 'kill' ][ 'switch' ]
+        switchDPID = main.params[ 'kill' ][ 'dpid' ]
 
-        #TODO: Make this switch parameterizable
-        main.step("Kill s28 ")
-        main.log.report("Deleting s28")
-        main.Mininet1.del_switch("s28")
-        main.log.info("Waiting " + str(switch_sleep) + " seconds for switch down to be discovered")
-        time.sleep(switch_sleep)
-        device = main.ONOScli1.get_device(dpid="0028")
-        #Peek at the deleted switch
-        main.log.warn( str(device) )
+        # TODO: Make this switch parameterizable
+        main.step( "Kill " + switch )
+        main.log.report( "Deleting " + switch )
+        main.Mininet1.delSwitch( switch )
+        main.log.info( "Waiting " + str( switchSleep ) +
+                       " seconds for switch down to be discovered" )
+        time.sleep( switchSleep )
+        device = main.ONOScli1.getDevice( dpid=switchDPID )
+        # Peek at the deleted switch
+        main.log.warn( str( device ) )
         result = main.FALSE
-        if device and device['available'] == False:
+        if device and device[ 'available' ] is False:
             result = main.TRUE
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="Kill switch succesful",
-                onfail="Failed to kill switch?")
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="Kill switch succesful",
+                                 onfail="Failed to kill switch?" )
 
-    def CASE12 (self, main) :
-        '''
+    def CASE12( self, main ):
+        """
         Switch Up
-        '''
-        #NOTE: You should probably run a topology check after this
+        """
+        # NOTE: You should probably run a topology check after this
         import time
 
-        switch_sleep = float(main.params['timers']['SwitchDiscovery'])
+        switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
+        switch = main.params[ 'kill' ][ 'switch' ]
+        switchDPID = main.params[ 'kill' ][ 'dpid' ]
+        links = main.params[ 'kill' ][ 'links' ].split()
         description = "Adding a switch to ensure it is discovered correctly"
-        main.log.report(description)
-        main.case(description)
+        main.log.report( description )
+        main.case( description )
 
-        main.step("Add back s28")
-        main.log.report("Adding back s28")
-        main.Mininet1.add_switch("s28", dpid = '0000000000002800')
-        #TODO: New dpid or same? Ask Thomas?
-        main.Mininet1.add_link('s28', 's3')
-        main.Mininet1.add_link('s28', 's6')
-        main.Mininet1.add_link('s28', 'h28')
-        main.Mininet1.assign_sw_controller(sw="28",
-                ip1=ONOS1_ip,port1=ONOS1_port)
-        main.log.info("Waiting " + str(switch_sleep) + " seconds for switch up to be discovered")
-        time.sleep(switch_sleep)
-        device = main.ONOScli1.get_device(dpid="0028")
-        #Peek at the deleted switch
-        main.log.warn( str(device) )
+        main.step( "Add back " + switch )
+        main.log.report( "Adding back " + switch )
+        main.Mininet1.addSwitch( switch, dpid=switchDPID )
+        # TODO: New dpid or same? Ask Thomas?
+        for peer in links:
+            main.Mininet1.addLink( switch, peer )
+        main.Mininet1.assignSwController( sw=switch.split( 's' )[ 1 ],
+                                          ip1=ONOS1Ip,
+                                          port1=ONOS1Port )
+        main.log.info( "Waiting " + str( switchSleep ) +
+                       " seconds for switch up to be discovered" )
+        time.sleep( switchSleep )
+        device = main.ONOScli1.getDevice( dpid=switchDPID )
+        # Peek at the deleted switch
+        main.log.warn( str( device ) )
         result = main.FALSE
-        if device and device['available'] == True:
+        if device and device[ 'available' ]:
             result = main.TRUE
-        utilities.assert_equals(expect=main.TRUE,actual=result,
-                onpass="add switch succesful",
-                onfail="Failed to add switch?")
+        utilities.assert_equals( expect=main.TRUE, actual=result,
+                                 onpass="add switch succesful",
+                                 onfail="Failed to add switch?" )
 
-    def CASE13 (self, main) :
-        '''
+    def CASE13( self, main ):
+        """
         Clean up
-        '''
+        """
         import os
         import time
-        #printing colors to terminal
+        # printing colors to terminal
         colors = {}
-        colors['cyan']   = '\033[96m'
-        colors['purple'] = '\033[95m'
-        colors['blue']   = '\033[94m'
-        colors['green']  = '\033[92m'
-        colors['yellow'] = '\033[93m'
-        colors['red']    = '\033[91m'
-        colors['end']    = '\033[0m'
+        colors[ 'cyan' ] = '\033[96m'
+        colors[ 'purple' ] = '\033[95m'
+        colors[ 'blue' ] = '\033[94m'
+        colors[ 'green' ] = '\033[92m'
+        colors[ 'yellow' ] = '\033[93m'
+        colors[ 'red' ] = '\033[91m'
+        colors[ 'end' ] = '\033[0m'
         description = "Test Cleanup"
-        main.log.report(description)
-        main.case(description)
-        main.step("Killing tcpdumps")
-        main.Mininet2.stop_tcpdump()
+        main.log.report( description )
+        main.case( description )
+        main.step( "Killing tcpdumps" )
+        main.Mininet2.stopTcpdump()
 
-        main.step("Checking ONOS Logs for errors")
-        print colors['purple'] + "Checking logs for errors on ONOS1:" + colors['end']
-        print main.ONOSbench.check_logs(ONOS1_ip)
-        main.step("Copying MN pcap and ONOS log files to test station")
+        main.step( "Checking ONOS Logs for errors" )
+        print colors[ 'purple' ] + "Checking logs for errors on ONOS1:" + \
+            colors[ 'end' ]
+        print main.ONOSbench.checkLogs( ONOS1Ip )
+        main.step( "Copying MN pcap and ONOS log files to test station" )
         testname = main.TEST
-        teststation_user = main.params['TESTONUSER']
-        teststation_IP = main.params['TESTONIP']
-        #NOTE: MN Pcap file is being saved to ~/packet_captures
+        teststationUser = main.params[ 'TESTONUSER' ]
+        teststationIP = main.params[ 'TESTONIP' ]
+        # NOTE: MN Pcap file is being saved to ~/packet_captures
         #       scp this file as MN and TestON aren't necessarily the same vm
-        #FIXME: scp
-        #####mn files
-        #TODO: Load these from params
-        #NOTE: must end in /
-        log_folder = "/opt/onos/log/"
-        log_files = ["karaf.log", "karaf.log.1"]
-        #NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS1_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS1-"+f )
-            main.ONOSbench.handle.expect("\$")
-            print main.ONOSbench.handle.before
+        # FIXME: scp
+        # mn files
+        # TODO: Load these from params
+        # NOTE: must end in /
+        logFolder = "/opt/onos/log/"
+        logFiles = [ "karaf.log", "karaf.log.1" ]
+        # NOTE: must end in /
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            main.ONOSbench.handle.sendline( "scp sdn@" + ONOS1Ip + ":" +
+                                            logFolder + f + " " +
+                                            teststationUser + "@" +
+                                            teststationIP + ":" + dstDir +
+                                            str( testname ) + "-ONOS1-" + f )
+            main.ONOSbench.handle.expect( "\$" )
 
-        #std*.log's
-        #NOTE: must end in /
-        log_folder = "/opt/onos/var/"
-        log_files = ["stderr.log", "stdout.log"]
-        #NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            main.ONOSbench.handle.sendline( "scp sdn@"+ONOS1_ip+":"+log_folder+f+" "+
-                    teststation_user +"@"+teststation_IP+":"+\
-                    dst_dir + str(testname) + "-ONOS1-"+f )
+        # std*.log's
+        # NOTE: must end in /
+        logFolder = "/opt/onos/var/"
+        logFiles = [ "stderr.log", "stdout.log" ]
+        # NOTE: must end in /
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            main.ONOSbench.handle.sendline( "scp sdn@" + ONOS1Ip + ":" +
+                                            logFolder + f + " " +
+                                            teststationUser + "@" +
+                                            teststationIP + ":" + dstDir +
+                                            str( testname ) + "-ONOS1-" + f )
+            main.ONOSbench.handle.expect( "\$" )
+        # sleep so scp can finish
+        time.sleep( 10 )
+        main.Mininet1.stopNet()
+        main.step( "Packing and rotating pcap archives" )
+        os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
 
+        # TODO: actually check something here
+        utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
+                                 onpass="Test cleanup successful",
+                                 onfail="Test cleanup NOT successful" )
 
-        #sleep so scp can finish
-        time.sleep(10)
-        main.step("Packing and rotating pcap archives")
-        os.system("~/TestON/dependencies/rotate.sh "+ str(testname))
-
-
-        #TODO: actually check something here
-        utilities.assert_equals(expect=main.TRUE, actual=main.TRUE,
-                onpass="Test cleanup successful",
-                onfail="Test cleanup NOT successful")
-
-    def CASE14 ( self, main ) :
-        '''
+    def CASE14( self, main ):
+        """
         start election app on all onos nodes
-        '''
-        leader_result = main.TRUE
-        #install app on onos 1
-        main.log.info("Install leadership election app")
-        main.ONOScli1.feature_install("onos-app-election")
-        #wait for election
-        #check for leader
-        leader = main.ONOScli1.election_test_leader()
-        #verify leader is ONOS1
-        if leader == ONOS1_ip:
-            #all is well
+        """
+        leaderResult = main.TRUE
+        # install app on onos 1
+        main.log.info( "Install leadership election app" )
+        main.ONOScli1.featureInstall( "onos-app-election" )
+        # wait for election
+        # check for leader
+        leader = main.ONOScli1.electionTestLeader()
+        # verify leader is ONOS1
+        if leader == ONOS1Ip:
+            # all is well
             pass
-        elif leader == None:
-            #No leader elected
-            main.log.report("No leader was elected")
-            leader_result = main.FALSE
+        elif leader is None:
+            # No leader elected
+            main.log.report( "No leader was elected" )
+            leaderResult = main.FALSE
         elif leader == main.FALSE:
-            #error in  response
-            #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-            main.log.report("Something is wrong with election_test_leader function, check the error logs")
-            leader_result = main.FALSE
+            # error in  response
+            # TODO: add check for "Command not found:" in the driver, this
+            # means the app isn't loaded
+            main.log.report( "Something is wrong with electionTestLeader" +
+                             " function, check the error logs" )
+            leaderResult = main.FALSE
         else:
-            #error in  response
-            main.log.report("Unexpected response from election_test_leader function:'"+str(leader)+"'")
-            leader_result = main.FALSE
+            # error in  response
+            main.log.report(
+                "Unexpected response from electionTestLeader function:'" +
+                str( leader ) +
+                "'" )
+            leaderResult = main.FALSE
 
-
-
-
-        #install on other nodes and check for leader.
-        #Should be onos1 and each app should show the same leader
-        for controller in range(2,num_controllers+1):
-            node = getattr( main, ( 'ONOScli' + str( controller ) ) )#loop through ONOScli handlers
-            node.feature_install("onos-app-election")
-            leaderN = node.election_test_leader()
-            #verify leader is ONOS1
-            if leaderN == ONOS1_ip:
-                #all is well
+        # install on other nodes and check for leader.
+        # Should be onos1 and each app should show the same leader
+        for controller in range( 2, numControllers + 1 ):
+            # loop through ONOScli handlers
+            node = getattr( main, ( 'ONOScli' + str( controller ) ) )
+            node.featureInstall( "onos-app-election" )
+            leaderN = node.electionTestLeader()
+            # verify leader is ONOS1
+            if leaderN == ONOS1Ip:
+                # all is well
                 pass
             elif leaderN == main.FALSE:
-                #error in  response
-                #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-                main.log.report("Something is wrong with election_test_leader function, check the error logs")
-                leader_result = main.FALSE
+                # error in  response
+                # TODO: add check for "Command not found:" in the driver, this
+                # means the app isn't loaded
+                main.log.report( "Something is wrong with " +
+                                 "electionTestLeader function, check the" +
+                                 " error logs" )
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
-                main.log.report("ONOS" + str(controller) + " sees "+str(leaderN) +
-                        " as the leader of the election app. Leader should be "+str(leader) )
-        if leader_result:
-            main.log.report("Leadership election tests passed(consistent view of leader across listeners and a leader was elected)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
+                leaderResult = main.FALSE
+                main.log.report( "ONOS" + str( controller ) + " sees " +
+                                 str( leaderN ) +
+                                 " as the leader of the election app. Leader" +
+                                 " should be " +
+                                 str( leader ) )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
+                             "view of leader across listeners and a leader " +
+                             "was elected )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
-    def CASE15 ( self, main ) :
-        '''
+    def CASE15( self, main ):
+        """
         Check that Leadership Election is still functional
-        '''
-        leader_result = main.TRUE
+        """
+        leaderResult = main.TRUE
         description = "Check that Leadership Election is still functional"
-        main.log.report(description)
-        main.case(description)
-        main.step("Find current leader and withdraw")
-        leader = main.ONOScli1.election_test_leader()
-        #TODO: do some sanity checking on leader before using it
-        withdraw_result = main.FALSE
-        if leader == ONOS1_ip:
-            old_leader = getattr( main, "ONOScli1" )
-        elif leader == None or leader == main.FALSE:
-            main.log.report("Leader for the election app should be an ONOS node,"\
-                    +"instead got '"+str(leader)+"'")
-            leader_result = main.FALSE
-        withdraw_result = old_leader.election_test_withdraw()
-
-
-        main.step("Make sure new leader is elected")
-        leader_list = []
-        leaderN =  main.ONOScli1.election_test_leader() 
-        if leaderN == leader:
-            main.log.report("ONOS"+str(controller)+" still sees " + str(leader) +\
-                    " as leader after they withdrew")
-            leader_result = main.FALSE
-        elif leaderN == main.FALSE:
-            #error in  response
-            #TODO: add check for "Command not found:" in the driver, this means the app isn't loaded
-            main.log.report("Something is wrong with election_test_leader function, check the error logs")
-            leader_result = main.FALSE
-        elif leaderN == None:
-            main.log.info("There is no leader after the app withdrew from election")
-        if leader_result:
-            main.log.report("Leadership election tests passed(There is no leader after the old leader resigned)")
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="Something went wrong with Leadership election")
-
-
-        main.step("Run for election on old leader(just so everyone is in the hat)")
-        run_result = old_leader.election_test_run()
-        leader = main.ONOScli1.election_test_leader()
-        #verify leader is ONOS1
-        if leader == ONOS1_ip:
-            leader_result = main.TRUE
+        main.log.report( description )
+        main.case( description )
+        main.step( "Find current leader and withdraw" )
+        leader = main.ONOScli1.electionTestLeader()
+        # TODO: do some sanity checking on leader before using it
+        withdrawResult = main.FALSE
+        if leader == ONOS1Ip:
+            oldLeader = getattr( main, "ONOScli1" )
+        elif leader is None or leader == main.FALSE:
+            main.log.report(
+                "Leader for the election app should be an ONOS node," +
+                "instead got '" + str( leader ) + "'" )
+            leaderResult = main.FALSE
+            oldLeader = None
         else:
-            leader_result = main.FALSE
-        #TODO: assert on  run and withdraw results?
+            main.log.error( "Leader election --- why am I HERE?!?")
+        if oldLeader:
+            withdrawResult = oldLeader.electionTestWithdraw()
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=withdrawResult,
+            onpass="App was withdrawn from election",
+            onfail="App was not withdrawn from election" )
 
-        utilities.assert_equals(expect=main.TRUE, actual=leader_result,
-                onpass="Leadership election passed",
-                onfail="ONOS1's election app was not leader after it re-ran for election")
+        main.step( "Make sure new leader is elected" )
+        leaderList = []
+        leaderN = main.ONOScli1.electionTestLeader()
+        if leaderN == leader:
+            main.log.report( "ONOS still sees " + str( leaderN ) +
+                             " as leader after they withdrew" )
+            leaderResult = main.FALSE
+        elif leaderN == main.FALSE:
+            # error in  response
+            # TODO: add check for "Command not found:" in the driver, this
+            # means the app isn't loaded
+            main.log.report( "Something is wrong with electionTestLeader " +
+                             "function, check the error logs" )
+            leaderResult = main.FALSE
+        elif leaderN is None:
+            main.log.info(
+                "There is no leader after the app withdrew from election" )
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( There is no " +
+                             "leader after the old leader resigned )" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="Something went wrong with Leadership election" )
 
+        main.step( "Run for election on old leader( just so everyone " +
+                   "is in the hat )" )
+        if oldLeader:
+            runResult = oldLeader.electionTestRun()
+        else:
+            runResult = main.FALSE
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=runResult,
+            onpass="App re-ran for election",
+            onfail="App failed to run for election" )
+        leader = main.ONOScli1.electionTestLeader()
+        # verify leader is ONOS1
+        if leader == ONOS1Ip:
+            leaderResult = main.TRUE
+        else:
+            leaderResult = main.FALSE
+        # TODO: assert on  run and withdraw results?
+
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=leaderResult,
+            onpass="Leadership election passed",
+            onfail="ONOS1's election app was not leader after it re-ran " +
+                   "for election" )
diff --git a/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.topo b/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.topo
index 4d4156c..9305025 100644
--- a/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.topo
+++ b/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.topo
@@ -151,7 +151,7 @@
                 <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
                 <arg2> --topo mytopo </arg2>
                 <arg3> </arg3>
-                <controller> remote </controller>
+                <controller> none </controller>
             </COMPONENTS>
         </Mininet1>
 
@@ -162,11 +162,7 @@
             <type>RemoteMininetDriver</type>
             <connect_order>17</connect_order>
             <COMPONENTS>
-                # Specify the Option for mininet
-                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
-                <arg2> --topo mytopo --arp</arg2>
-                <controller> remote </controller>
-             </COMPONENTS>
+            </COMPONENTS>
         </Mininet2>
 
     </COMPONENT>
diff --git a/TestON/tests/IntentPerfNext/Dependency/IntentClass.py b/TestON/tests/IntentPerfNext/Dependency/IntentClass.py
new file mode 100644
index 0000000..f5b17c2
--- /dev/null
+++ b/TestON/tests/IntentPerfNext/Dependency/IntentClass.py
@@ -0,0 +1,56 @@
+
+def __init__(self):
+    self_ = self
+
+def printLog(main):
+    main.log.info("Print log success")
+
+def iptablesDropAllNodes(main, MN_ip, sw_port):
+    #INPUT RULES 
+    main.ONOS1.handle.sendline(
+        "sudo iptables -A INPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS2.handle.sendline(
+        "sudo iptables -A INPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS3.handle.sendline(
+        "sudo iptables -A INPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS4.handle.sendline(
+        "sudo iptables -A INPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS5.handle.sendline(
+        "sudo iptables -A INPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS6.handle.sendline(
+        "sudo iptables -A INPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS7.handle.sendline(
+        "sudo iptables -A INPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+
+    main.ONOS1.handle.sendline(
+        "sudo iptables -A OUTPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS2.handle.sendline(
+        "sudo iptables -A OUTPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS3.handle.sendline(
+        "sudo iptables -A OUTPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS4.handle.sendline(
+        "sudo iptables -A OUTPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS5.handle.sendline(
+        "sudo iptables -A OUTPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS6.handle.sendline(
+        "sudo iptables -A OUTPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+    main.ONOS7.handle.sendline(
+        "sudo iptables -A OUTPUT -p tcp -s "+
+        MN_ip+" --dport "+sw_port+" -j DROP")
+
+def uninstallAllNodes(main, node_ip_list):
+    for node in node_ip_list:
+        main.ONOSbench.onos_uninstall(node_ip = node)
diff --git a/TestON/tests/IntentPerfNext/Dependency/__init__.py b/TestON/tests/IntentPerfNext/Dependency/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/IntentPerfNext/Dependency/__init__.py
diff --git a/TestON/tests/IntentPerfNext/IntentPerfNext.params b/TestON/tests/IntentPerfNext/IntentPerfNext.params
index edba27b..90ef160 100644
--- a/TestON/tests/IntentPerfNext/IntentPerfNext.params
+++ b/TestON/tests/IntentPerfNext/IntentPerfNext.params
@@ -1,5 +1,5 @@
 <PARAMS>
-    <testcases>1,5,7,2,3</testcases>
+    <testcases>1,4,5,4,5,4,5,4</testcases>
 
     <ENV>
         <cellName>intent_perf_test</cellName>
@@ -36,15 +36,23 @@
 
     <TEST>
         #Number of times to iterate each case
-        <numIter>15</numIter>
-        <numIgnore>3</numIgnore>
-        <numSwitch>9</numSwitch>
+        <numIter>8</numIter>
+        <numIgnore>2</numIgnore>
+        <numSwitch>8</numSwitch>
         <batchThresholdMin>0</batchThresholdMin>
         <batchThresholdMax>1000</batchThresholdMax>
-        <batchIntentSize>200</batchIntentSize>
+        <batchIntentSize>1</batchIntentSize>
         <numMult>1</numMult>
+        #Interface to bring down for intent reroute case
+        <intfs>s3-eth2</intfs>
     </TEST>
 
+    <DB>
+        <intentFilePath>
+        /home/admin/ONLabTest/TestON/tests/IntentPerfNext/intentLatencyResultDb.log
+        </intentFilePath>
+    </DB>
+
     <JSON>
         <submittedTime>intentSubmittedTimestamp</submittedTime>
         <installedTime>intentInstalledTimestamp</installedTime>
diff --git a/TestON/tests/IntentPerfNext/IntentPerfNext.py b/TestON/tests/IntentPerfNext/IntentPerfNext.py
index daa1ae2..cb226e7 100644
--- a/TestON/tests/IntentPerfNext/IntentPerfNext.py
+++ b/TestON/tests/IntentPerfNext/IntentPerfNext.py
@@ -15,95 +15,93 @@
         ONOS startup sequence
         """
         import time
-        global cluster_count
-        cluster_count = 1
+        global clusterCount
+        global timeToPost
+        global runNum
 
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
+        clusterCount = 1
+        timeToPost = time.strftime("%Y-%m-%d %H:%M:%S")
+        runNum = time.strftime("%d%H%M%S")
 
-        git_pull = main.params[ 'GIT' ][ 'autoPull' ]
-        checkout_branch = main.params[ 'GIT' ][ 'checkout' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS4_ip = main.params[ 'CTRL' ][ 'ip4' ]
-        ONOS5_ip = main.params[ 'CTRL' ][ 'ip5' ]
-        ONOS6_ip = main.params[ 'CTRL' ][ 'ip6' ]
-        ONOS7_ip = main.params[ 'CTRL' ][ 'ip7' ]
+        gitPull = main.params[ 'GIT' ][ 'autoPull' ]
+        checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
+        intentFilePath = main.params[ 'DB' ][ 'intentFilePath' ]
 
-        main.ONOSbench.onos_uninstall( node_ip=ONOS1_ip )
-        main.ONOSbench.onos_uninstall( node_ip=ONOS2_ip )
-        main.ONOSbench.onos_uninstall( node_ip=ONOS3_ip )
-        main.ONOSbench.onos_uninstall( node_ip=ONOS4_ip )
-        main.ONOSbench.onos_uninstall( node_ip=ONOS5_ip )
-        main.ONOSbench.onos_uninstall( node_ip=ONOS6_ip )
-        main.ONOSbench.onos_uninstall( node_ip=ONOS7_ip )
+        ONOSIp = []
+        for i in range(1, 8):
+            ONOSIp.append(main.params[ 'CTRL' ][ 'ip'+str(i) ]) 
+            main.ONOSbench.onosUninstall( nodeIp = ONOSIp[i-1] )
 
-        MN1_ip = main.params[ 'MN' ][ 'ip1' ]
-        BENCH_ip = main.params[ 'BENCH' ][ 'ip' ]
+        MN1Ip = main.params[ 'MN' ][ 'ip1' ]
+        BENCHIp = main.params[ 'BENCH' ][ 'ip' ]
 
         main.case( "Setting up test environment" )
 
+        main.step( "Clearing previous DB log file" )
+        fIntentLog = open(intentFilePath, 'w')
+        # Overwrite with empty line and close 
+        fIntentLog.write('')
+        fIntentLog.close()
+
+        main.step( "Starting mininet topology" )
+        main.Mininet1.startNet()
+
         main.step( "Creating cell file" )
-        cell_file_result = main.ONOSbench.create_cell_file(
-            BENCH_ip, cell_name, MN1_ip,
-            "onos-core,onos-app-metrics,onos-gui",
-            # ONOS1_ip, ONOS2_ip, ONOS3_ip )
-            ONOS1_ip )
+        cellFileResult = main.ONOSbench.createCellFile(
+            BENCHIp, cellName, MN1Ip,
+            ("onos-core,webconsole,onos-api,onos-app-metrics,onos-gui,"
+            "onos-cli,onos-openflow"),
+            ONOSIp[0] )
 
         main.step( "Applying cell file to environment" )
-        cell_apply_result = main.ONOSbench.set_cell( cell_name )
-        verify_cell_result = main.ONOSbench.verify_cell()
+        cellApplyResult = main.ONOSbench.setCell( cellName )
+        verifyCellResult = main.ONOSbench.verifyCell()
 
         main.step( "Removing raft logs" )
-        main.ONOSbench.onos_remove_raft_logs()
+        main.ONOSbench.onosRemoveRaftLogs()
 
-        main.step( "Git checkout and pull " + checkout_branch )
-        if git_pull == 'on':
-            checkout_result = \
-                main.ONOSbench.git_checkout( checkout_branch )
-            pull_result = main.ONOSbench.git_pull()
+        main.step( "Git checkout and pull " + checkoutBranch )
+        if gitPull == 'on':
+            checkoutResult = \
+                main.ONOSbench.gitCheckout( checkoutBranch )
+            pullResult = main.ONOSbench.gitPull()
 
             # If you used git pull, auto compile
             main.step( "Using onos-build to compile ONOS" )
-            build_result = main.ONOSbench.onos_build()
+            buildResult = main.ONOSbench.onosBuild()
         else:
-            checkout_result = main.TRUE
-            pull_result = main.TRUE
-            build_result = main.TRUE
+            checkoutResult = main.TRUE
+            pullResult = main.TRUE
+            buildResult = main.TRUE
             main.log.info( "Git pull skipped by configuration" )
 
         main.log.report( "Commit information - " )
-        main.ONOSbench.get_version( report=True )
+        main.ONOSbench.getVersion( report=True )
 
         main.step( "Creating ONOS package" )
-        package_result = main.ONOSbench.onos_package()
+        packageResult = main.ONOSbench.onosPackage()
 
         main.step( "Installing ONOS package" )
-        install1_result = main.ONOSbench.onos_install( node=ONOS1_ip )
-        #install2_result = main.ONOSbench.onos_install( node=ONOS2_ip )
-        #install3_result = main.ONOSbench.onos_install( node=ONOS3_ip )
+        install1Result = main.ONOSbench.onosInstall( node=ONOSIp[0] )
 
         main.step( "Set cell for ONOScli env" )
-        main.ONOS1cli.set_cell( cell_name )
-        # main.ONOS2cli.set_cell( cell_name )
-        # main.ONOS3cli.set_cell( cell_name )
+        main.ONOS1cli.setCell( cellName )
 
         time.sleep( 5 )
 
         main.step( "Start onos cli" )
-        cli1 = main.ONOS1cli.start_onos_cli( ONOS1_ip )
-        #cli2 = main.ONOS2cli.start_onos_cli( ONOS2_ip )
-        #cli3 = main.ONOS3cli.start_onos_cli( ONOS3_ip )
+        cli1 = main.ONOS1cli.startOnosCli( ONOSIp[0] )
 
         utilities.assert_equals( expect=main.TRUE,
-                                 actual=cell_file_result and cell_apply_result and
-                                 verify_cell_result and checkout_result and
-                                 pull_result and build_result and
-                                 install1_result,  # and install2_result and
-                                 # install3_result,
-                                 onpass="ONOS started successfully",
-                                 onfail="Failed to start ONOS" )
+                                actual=cellFileResult and cellApplyResult and
+                                verifyCellResult and checkoutResult and
+                                pullResult and buildResult and
+                                install1Result,  # and install2Result and
+                                # install3Result,
+                                onpass="ONOS started successfully",
+                                onfail="Failed to start ONOS" )
 
     def CASE2( self, main ):
         """
@@ -115,136 +113,252 @@
         import requests
         import os
         import numpy
+        global clusterCount
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS_user = main.params[ 'CTRL' ][ 'user' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOSIpList = []
+        for i in range( 1, 8 ):
+            ONOSIpList.append( main.params[ 'CTRL' ][ 'ip' + str( i ) ] )
 
-        default_sw_port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOSUser = main.params[ 'CTRL' ][ 'user' ]
+
+        defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
 
         # number of iterations of case
-        num_iter = main.params[ 'TEST' ][ 'numIter' ]
-        num_ignore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
+        numIter = main.params[ 'TEST' ][ 'numIter' ]
+        numIgnore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
 
         # Timestamp keys for json metrics output
-        submit_time = main.params[ 'JSON' ][ 'submittedTime' ]
-        install_time = main.params[ 'JSON' ][ 'installedTime' ]
-        wdRequest_time = main.params[ 'JSON' ][ 'wdRequestTime' ]
-        withdrawn_time = main.params[ 'JSON' ][ 'withdrawnTime' ]
+        submitTime = main.params[ 'JSON' ][ 'submittedTime' ]
+        installTime = main.params[ 'JSON' ][ 'installedTime' ]
+        wdRequestTime = main.params[ 'JSON' ][ 'wdRequestTime' ]
+        withdrawnTime = main.params[ 'JSON' ][ 'withdrawnTime' ]
 
-        intent_add_lat_list = []
+        assertion = main.TRUE
 
-        # Assign 'linear' switch format for basic intent testing
-        main.Mininet1.assign_sw_controller(
-            sw="1", ip1=ONOS1_ip, port1=default_sw_port )
-        main.Mininet1.assign_sw_controller(
-            sw="2", ip1=ONOS2_ip, port1=default_sw_port )
-        main.Mininet1.assign_sw_controller(
-            sw="3", ip1=ONOS2_ip, port1=default_sw_port )
-        main.Mininet1.assign_sw_controller(
-            sw="4", ip1=ONOS2_ip, port1=default_sw_port )
-        main.Mininet1.assign_sw_controller(
-            sw="5", ip1=ONOS3_ip, port1=default_sw_port )
+        intentAddLatList = []
+
+        # Distribute switches according to cluster count
+        for i in range( 1, 9 ):
+            if clusterCount == 1:
+                main.Mininet1.assignSwController(
+                    sw=str( i ), ip1=ONOSIpList[ 0 ],
+                    port1=defaultSwPort
+                )
+            elif clusterCount == 3:
+                if i < 3:
+                    index = 0
+                elif i < 6 and i >= 3:
+                    index = 1
+                else:
+                    index = 2
+                main.Mininet1.assignSwController(
+                    sw=str( i ), ip1=ONOSIpList[ index ],
+                    port1=defaultSwPort
+                )
+            elif clusterCount == 5:
+                if i < 3:
+                    index = 0
+                elif i < 5 and i >= 3:
+                    index = 1
+                elif i < 7 and i >= 5:
+                    index = 2
+                elif i == 7:
+                    index = 3
+                else:
+                    index = 4
+                main.Mininet1.assignSwController(
+                    sw=str( i ), ip1=ONOSIpList[ index ],
+                    port1=defaultSwPort
+                )
+            elif clusterCount == 7:
+                if i < 6:
+                    index = i
+                else:
+                    index = 6
+                main.Mininet1.assignSwController(
+                    sw=str( i ), ip1=ONOSIpList[ index ],
+                    port1=defaultSwPort
+                )
 
         time.sleep( 10 )
 
         main.log.report( "Single intent add latency test" )
 
-        devices_json_str = main.ONOS1cli.devices()
-        devices_json_obj = json.loads( devices_json_str )
-        device_id_list = []
+        devicesJsonStr = main.ONOS1cli.devices()
+        devicesJsonObj = json.loads( devicesJsonStr )
+
+        if not devicesJsonObj:
+            main.log.report( "Devices not discovered" )
+            main.log.report( "Aborting test" )
+            main.exit()
+        else:
+            main.log.info( "Devices discovered successfully" )
+
+        deviceIdList = []
 
         # Obtain device id list in ONOS format.
         # They should already be in order ( 1,2,3,10,11,12,13, etc )
-        for device in devices_json_obj:
-            device_id_list.append( device[ 'id' ] )
+        for device in devicesJsonObj:
+            deviceIdList.append( device[ 'id' ] )
 
-        for i in range( 0, int( num_iter ) ):
-            # add_point_intent( ingr_device,  egr_device,
-            #                 ingr_port,    egr_port )
-            main.ONOS1cli.add_point_intent(
-                device_id_list[ 0 ] + "/1", device_id_list[ 4 ] + "/1" )
+        for i in range( 0, int( numIter ) ):
+            # addPointIntent( ingrDevice,  egrDevice,
+            #                 ingrPort,    egrPort )
+            main.ONOS1cli.addPointIntent(
+                deviceIdList[ 0 ] + "/2", deviceIdList[ 7 ] + "/2" )
 
             # Allow some time for intents to propagate
             time.sleep( 5 )
 
+            intentsStr = main.ONOS1cli.intents( jsonFormat=True )
+            intentsObj = json.loads( intentsStr )
+            for intent in intentsObj:
+                if intent[ 'state' ] == "INSTALLED":
+                    main.log.info( "Intent installed successfully" )
+                    intentId = intent[ 'id' ]
+                    main.log.info( "Intent id: " + str( intentId ) )
+                else:
+                    # TODO: Add error handling
+                    main.log.info( "Intent installation failed" )
+                    intentId = ""
+
             # Obtain metrics from ONOS 1, 2, 3
-            intents_json_str_1 = main.ONOS1cli.intents_events_metrics()
-            intents_json_str_2 = main.ONOS2cli.intents_events_metrics()
-            intents_json_str_3 = main.ONOS3cli.intents_events_metrics()
-
-            intents_json_obj_1 = json.loads( intents_json_str_1 )
-            intents_json_obj_2 = json.loads( intents_json_str_2 )
-            intents_json_obj_3 = json.loads( intents_json_str_3 )
-
+            intentsJsonStr1 = main.ONOS1cli.intentsEventsMetrics()
+            intentsJsonObj1 = json.loads( intentsJsonStr1 )
             # Parse values from the json object
-            intent_submit_1 = \
-                intents_json_obj_1[ submit_time ][ 'value' ]
-            intent_submit_2 = \
-                intents_json_obj_2[ submit_time ][ 'value' ]
-            intent_submit_3 = \
-                intents_json_obj_3[ submit_time ][ 'value' ]
+            intentSubmit1 = \
+                intentsJsonObj1[ submitTime ][ 'value' ]
+            intentInstall1 = \
+                intentsJsonObj1[ installTime ][ 'value' ]
+            intentInstallLat1 = \
+                int( intentInstall1 ) - int( intentSubmit1 )
 
-            intent_install_1 = \
-                intents_json_obj_1[ install_time ][ 'value' ]
-            intent_install_2 = \
-                intents_json_obj_2[ install_time ][ 'value' ]
-            intent_install_3 = \
-                intents_json_obj_3[ install_time ][ 'value' ]
+            if clusterCount == 3:
+                intentsJsonStr2 = main.ONOS2cli.intentsEventsMetrics()
+                intentsJsonStr3 = main.ONOS3cli.intentsEventsMetrics()
+                intentsJsonObj2 = json.loads( intentsJsonStr2 )
+                intentsJsonObj3 = json.loads( intentsJsonStr3 )
+                intentSubmit2 = \
+                    intentsJsonObj2[ submitTime ][ 'value' ]
+                intentSubmit3 = \
+                    intentsJsonObj3[ submitTime ][ 'value' ]
+                intentInstall2 = \
+                    intentsJsonObj2[ installTime ][ 'value' ]
+                intentInstall3 = \
+                    intentsJsonObj3[ installTime ][ 'value' ]
+                intentInstallLat2 = \
+                    int( intentInstall2 ) - int( intentSubmit2 )
+                intentInstallLat3 = \
+                    int( intentInstall3 ) - int( intentSubmit3 )
+            else:
+                intentInstallLat2 = 0
+                intentInstallLat3 = 0
 
-            intent_install_lat_1 = \
-                int( intent_install_1 ) - int( intent_submit_1 )
-            intent_install_lat_2 = \
-                int( intent_install_2 ) - int( intent_submit_2 )
-            intent_install_lat_3 = \
-                int( intent_install_3 ) - int( intent_submit_3 )
+            if clusterCount == 5:
+                intentsJsonStr4 = main.ONOS4cli.intentsEventsMetrics()
+                intentsJsonStr5 = main.ONOS5cli.intentsEventsMetrics()
+                intentsJsonObj4 = json.loads( intentsJsonStr4 )
+                intentsJsonObj5 = json.loads( intentsJsonStr5 )
+                intentSubmit4 = \
+                    intentsJsonObj4[ submitTime ][ 'value' ]
+                intentSubmit5 = \
+                    intentsJsonObj5[ submitTime ][ 'value' ]
+                intentInstall4 = \
+                    intentsJsonObj5[ installTime ][ 'value' ]
+                intentInstall5 = \
+                    intentsJsonObj5[ installTime ][ 'value' ]
+                intentInstallLat4 = \
+                    int( intentInstall4 ) - int( intentSubmit4 )
+                intentInstallLat5 = \
+                    int( intentInstall5 ) - int( intentSubmit5 )
+            else:
+                intentInstallLat4 = 0
+                intentInstallLat5 = 0
 
-            intent_install_lat_avg = \
-                ( intent_install_lat_1 +
-                  intent_install_lat_2 +
-                  intent_install_lat_3 ) / 3
+            if clusterCount == 7:
+                intentsJsonStr6 = main.ONOS6cli.intentsEventsMetrics()
+                intentsJsonStr7 = main.ONOS7cli.intentsEventsMetrics()
+                intentsJsonObj6 = json.loads( intentsJsonStr6 )
+                intentsJsonObj7 = json.loads( intentsJsonStr7 )
+                intentSubmit6 = \
+                    intentsJsonObj6[ submitTime ][ 'value' ]
+                intentSubmit7 = \
+                    intentsJsonObj6[ submitTime ][ 'value' ]
+                intentInstall6 = \
+                    intentsJsonObj6[ installTime ][ 'value' ]
+                intentInstall7 = \
+                    intentsJsonObj7[ installTime ][ 'value' ]
+                intentInstallLat6 = \
+                    int( intentInstall6 ) - int( intentSubmit6 )
+                intentInstallLat7 = \
+                    int( intentInstall7 ) - int( intentSubmit7 )
+            else:
+                intentInstallLat6 = 0
+                intentInstallLat7 = 0
+
+            intentInstallLatAvg = \
+                ( intentInstallLat1 +
+                  intentInstallLat2 +
+                  intentInstallLat3 +
+                  intentInstallLat4 +
+                  intentInstallLat5 +
+                  intentInstallLat6 +
+                  intentInstallLat7 ) / clusterCount
 
             main.log.info( "Intent add latency avg for iteration " + str( i ) +
-                           ": " + str( intent_install_lat_avg ) + " ms" )
+                           ": " + str( intentInstallLatAvg ) + " ms" )
 
-            if intent_install_lat_avg > 0.0 and \
-               intent_install_lat_avg < 1000 and i > num_ignore:
-                intent_add_lat_list.append( intent_install_lat_avg )
+            if intentInstallLatAvg > 0.0 and \
+               intentInstallLatAvg < 1000 and i > numIgnore:
+                intentAddLatList.append( intentInstallLatAvg )
             else:
                 main.log.info( "Intent add latency exceeded " +
                                "threshold. Skipping iteration " + str( i ) )
 
             time.sleep( 3 )
 
-            # TODO: Possibly put this in the driver function
+            # TODO: Only remove intents that were installed
+            #      in this case... Otherwise many other intents
+            #      may show up distorting the results
             main.log.info( "Removing intents for next iteration" )
-            json_temp = \
-                main.ONOS1cli.intents( json_format=True )
-            json_obj_intents = json.loads( json_temp )
-            if json_obj_intents:
-                for intents in json_obj_intents:
-                    temp_id = intents[ 'id' ]
-                    main.ONOS1cli.remove_intent( temp_id )
+            jsonTemp = \
+                main.ONOS1cli.intents( jsonFormat=True )
+            jsonObjIntents = json.loads( jsonTemp )
+            if jsonObjIntents:
+                for intents in jsonObjIntents:
+                    tempId = intents[ 'id' ]
+                    # main.ONOS1cli.removeIntent( tempId )
                     main.log.info( "Removing intent id: " +
-                                   str( temp_id ) )
-                    main.ONOS1cli.remove_intent( temp_id )
+                                   str( tempId ) )
+                    main.ONOS1cli.removeIntent( tempId )
             else:
                 main.log.info( "Intents were not installed correctly" )
 
             time.sleep( 5 )
 
-        intent_add_lat_avg = sum( intent_add_lat_list ) /\
-            len( intent_add_lat_list )
-        intent_add_lat_std = \
-            round( numpy.std( intent_add_lat_list ), 1 )
+        if intentAddLatList:
+            intentAddLatAvg = sum( intentAddLatList ) /\
+                len( intentAddLatList )
+        else:
+            main.log.report( "Intent installation latency test failed" )
+            intentAddLatAvg = "NA"
+            assertion = main.FALSE
+
+        intentAddLatStd = \
+            round( numpy.std( intentAddLatList ), 1 )
         # END ITERATION FOR LOOP
         main.log.report( "Single intent add latency - " )
-        main.log.report( "Avg: " + str( intent_add_lat_avg ) + " ms" )
-        main.log.report(
-            "Std Deviation: " +
-            str( intent_add_lat_std ) +
-            " ms" )
+        main.log.report( "Avg: " + str( intentAddLatAvg ) + " ms" )
+        main.log.report( "Std Deviation: " + str( intentAddLatStd ) + " ms" )
+
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=assertion,
+            onpass="Single intent install latency test successful",
+            onfail="Single intent install latency test failed" )
 
     def CASE3( self, main ):
         """
@@ -255,463 +369,602 @@
         import requests
         import os
         import numpy
+        global clusterCount
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS_user = main.params[ 'CTRL' ][ 'user' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOSUser = main.params[ 'CTRL' ][ 'user' ]
+       
+        ONOSIpList = []
+        for i in range( 1, 8 ):
+            ONOSIpList.append( main.params[ 'CTRL' ][ 'ip' + str( i ) ] )
 
-        default_sw_port = main.params[ 'CTRL' ][ 'port1' ]
+        defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
 
         # number of iterations of case
-        num_iter = main.params[ 'TEST' ][ 'numIter' ]
-        num_ignore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
+        numIter = main.params[ 'TEST' ][ 'numIter' ]
+        numIgnore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
+        assertion = main.TRUE
 
         # Timestamp keys for json metrics output
-        submit_time = main.params[ 'JSON' ][ 'submittedTime' ]
-        install_time = main.params[ 'JSON' ][ 'installedTime' ]
-        wdRequest_time = main.params[ 'JSON' ][ 'wdRequestTime' ]
-        withdrawn_time = main.params[ 'JSON' ][ 'withdrawnTime' ]
+        submitTime = main.params[ 'JSON' ][ 'submittedTime' ]
+        installTime = main.params[ 'JSON' ][ 'installedTime' ]
+        wdRequestTime = main.params[ 'JSON' ][ 'wdRequestTime' ]
+        withdrawnTime = main.params[ 'JSON' ][ 'withdrawnTime' ]
 
-        devices_json_str = main.ONOS1cli.devices()
-        devices_json_obj = json.loads( devices_json_str )
+        # NOTE: May need to configure interface depending on topology
+        intfs = main.params[ 'TEST' ][ 'intfs' ]
+        
+        # Distribute switches according to cluster count
+        for i in range( 1, 9 ):
+            if clusterCount == 1:
+                main.Mininet1.assignSwController(
+                    sw=str( i ), ip1=ONOSIpList[ 0 ],
+                    port1=defaultSwPort
+                )
+            elif clusterCount == 3:
+                if i < 3:
+                    index = 0
+                elif i < 6 and i >= 3:
+                    index = 1
+                else:
+                    index = 2
+                main.Mininet1.assignSwController(
+                    sw=str( i ), ip1=ONOSIpList[ index ],
+                    port1=defaultSwPort
+                )
+            elif clusterCount == 5:
+                if i < 3:
+                    index = 0
+                elif i < 5 and i >= 3:
+                    index = 1
+                elif i < 7 and i >= 5:
+                    index = 2
+                elif i == 7:
+                    index = 3
+                else:
+                    index = 4
+                main.Mininet1.assignSwController(
+                    sw=str( i ), ip1=ONOSIpList[ index ],
+                    port1=defaultSwPort
+                )
+            elif clusterCount == 7:
+                if i < 6:
+                    index = i
+                else:
+                    index = 6
+                main.Mininet1.assignSwController(
+                    sw=str( i ), ip1=ONOSIpList[ index ],
+                    port1=defaultSwPort
+                )
 
-        device_id_list = []
+        time.sleep(10)
+
+        devicesJsonStr = main.ONOS1cli.devices()
+        devicesJsonObj = json.loads( devicesJsonStr )
+
+        deviceIdList = []
 
         # Obtain device id list in ONOS format.
         # They should already be in order ( 1,2,3,10,11,12,13, etc )
-        for device in devices_json_obj:
-            device_id_list.append( device[ 'id' ] )
+        for device in devicesJsonObj:
+            deviceIdList.append( device[ 'id' ] )
 
-        intent_reroute_lat_list = []
+        intentRerouteLatList = []
 
-        for i in range( 0, int( num_iter ) ):
-            # add_point_intent( ingr_device, ingr_port,
-            #                 egr_device, egr_port )
-            if len( device_id_list ) > 0:
-                main.ONOS1cli.add_point_intent(
-                    device_id_list[ 0 ] + "/2", device_id_list[ 4 ] + "/1" )
+        for i in range( 0, int( numIter ) ):
+            # addPointIntent( ingrDevice, ingrPort,
+            #                 egrDevice, egrPort )
+            if len( deviceIdList ) > 0:
+                main.ONOS1cli.addPointIntent(
+                    deviceIdList[ 0 ] + "/2", deviceIdList[ 7 ] + "/2" )
             else:
                 main.log.info( "Failed to fetch devices from ONOS" )
 
             time.sleep( 5 )
 
-            intents_str = main.ONOS1cli.intents( json_format=True )
-            intents_obj = json.loads( intents_str )
-            for intent in intents_obj:
+            intentsStr = main.ONOS1cli.intents( jsonFormat=True )
+            intentsObj = json.loads( intentsStr )
+            for intent in intentsObj:
+                main.log.info(intent)
                 if intent[ 'state' ] == "INSTALLED":
                     main.log.info( "Intent installed successfully" )
-                    intent_id = intent[ 'id' ]
-                else:
-                    # TODO: Add error handling
-                    main.log.info( "Intent installation failed" )
-                    intent_id = ""
+                    intentId = intent[ 'id' ]
+                    main.log.info( "Intent id: " + str( intentId ) )
+                #else:
+                    #TODO: Add error handling
+                    #main.log.info( "Intent installation failed" )
+                    #intentId = ""
 
-            # NOTE: this interface is specific to
-            #      topo-intentFlower.py topology
-            #      reroute case.
-            main.log.info( "Disabling interface s2-eth3" )
+            main.log.info( "Disabling interface " + intfs )
+            t0System = time.time() * 1000
             main.Mininet1.handle.sendline(
-                "sh ifconfig s2-eth3 down" )
-            t0_system = time.time() * 1000
+                "sh ifconfig " + intfs + " down" )
+            main.Mininet1.handle.expect( "mininet>" )
 
             # TODO: Check for correct intent reroute
-            time.sleep( 5 )
+            time.sleep( 1 )
 
             # Obtain metrics from ONOS 1, 2, 3
-            intents_json_str_1 = main.ONOS1cli.intents_events_metrics()
-            intents_json_str_2 = main.ONOS2cli.intents_events_metrics()
-            intents_json_str_3 = main.ONOS3cli.intents_events_metrics()
-
-            intents_json_obj_1 = json.loads( intents_json_str_1 )
-            intents_json_obj_2 = json.loads( intents_json_str_2 )
-            intents_json_obj_3 = json.loads( intents_json_str_3 )
-
+            intentsJsonStr1 = main.ONOS1cli.intentsEventsMetrics()
+            intentsJsonObj1 = json.loads( intentsJsonStr1 )
             # Parse values from the json object
-            intent_install_1 = \
-                intents_json_obj_1[ install_time ][ 'value' ]
-            intent_install_2 = \
-                intents_json_obj_2[ install_time ][ 'value' ]
-            intent_install_3 = \
-                intents_json_obj_3[ install_time ][ 'value' ]
+            intentInstall1 = \
+                intentsJsonObj1[ installTime ][ 'value' ]
+            intentRerouteLat1 = \
+                int( intentInstall1 ) - int( t0System )
 
-            intent_reroute_lat_1 = \
-                int( intent_install_1 ) - int( t0_system )
-            intent_reroute_lat_2 = \
-                int( intent_install_2 ) - int( t0_system )
-            intent_reroute_lat_3 = \
-                int( intent_install_3 ) - int( t0_system )
+            if clusterCount == 3:
+                intentsJsonStr2 = main.ONOS2cli.intentsEventsMetrics()
+                intentsJsonStr3 = main.ONOS3cli.intentsEventsMetrics()
 
-            intent_reroute_lat_avg = \
-                ( intent_reroute_lat_1 +
-                  intent_reroute_lat_2 +
-                  intent_reroute_lat_3 ) / 3
+                intentsJsonObj2 = json.loads( intentsJsonStr2 )
+                intentsJsonObj3 = json.loads( intentsJsonStr3 )
+                intentInstall2 = \
+                    intentsJsonObj2[ installTime ][ 'value' ]
+                intentInstall3 = \
+                    intentsJsonObj3[ installTime ][ 'value' ]
+                intentRerouteLat2 = \
+                    int( intentInstall2 ) - int( t0System )
+                intentRerouteLat3 = \
+                    int( intentInstall3 ) - int( t0System )
+            else:
+                intentRerouteLat2 = 0
+                intentRerouteLat3 = 0
+
+            if clusterCount == 5:
+                intentsJsonStr4 = main.ONOS4cli.intentsEventsMetrics()
+                intentsJsonStr5 = main.ONOS5cli.intentsEventsMetrics()
+
+                intentsJsonObj4 = json.loads( intentsJsonStr4 )
+                intentsJsonObj5 = json.loads( intentsJsonStr5 )
+                intentInstall4 = \
+                    intentsJsonObj4[ installTime ][ 'value' ]
+                intentInstall5 = \
+                    intentsJsonObj5[ installTime ][ 'value' ]
+                intentRerouteLat4 = \
+                    int( intentInstall4 ) - int( t0System )
+                intentRerouteLat5 = \
+                    int( intentInstall5 ) - int( t0System )
+            else:
+                intentRerouteLat4 = 0
+                intentRerouteLat5 = 0
+
+            if clusterCount == 7:
+                intentsJsonStr6 = main.ONOS6cli.intentsEventsMetrics()
+                intentsJsonStr7 = main.ONOS7cli.intentsEventsMetrics()
+
+                intentsJsonObj6 = json.loads( intentsJsonStr6 )
+                intentsJsonObj7 = json.loads( intentsJsonStr7 )
+                intentInstall6 = \
+                    intentsJsonObj6[ installTime ][ 'value' ]
+                intentInstall7 = \
+                    intentsJsonObj7[ installTime ][ 'value' ]
+                intentRerouteLat6 = \
+                    int( intentInstall6 ) - int( t0System )
+                intentRerouteLat7 = \
+                    int( intentInstall7 ) - int( t0System )
+            else:
+                intentRerouteLat6 = 0
+                intentRerouteLat7 = 0
+
+            intentRerouteLatAvg = \
+                ( intentRerouteLat1 +
+                  intentRerouteLat2 +
+                  intentRerouteLat3 +
+                  intentRerouteLat4 +
+                  intentRerouteLat5 +
+                  intentRerouteLat6 +
+                  intentRerouteLat7 ) / clusterCount
 
             main.log.info( "Intent reroute latency avg for iteration " +
-                           str( i ) + ": " + str( intent_reroute_lat_avg ) )
+                           str( i ) + ": " + str( intentRerouteLatAvg )+ " ms")
 
-            if intent_reroute_lat_avg > 0.0 and \
-               intent_reroute_lat_avg < 1000 and i > num_ignore:
-                intent_reroute_lat_list.append( intent_reroute_lat_avg )
+            if intentRerouteLatAvg > 0.0 and \
+               intentRerouteLatAvg < 1000 and i > numIgnore:
+                intentRerouteLatList.append( intentRerouteLatAvg )
             else:
                 main.log.info( "Intent reroute latency exceeded " +
                                "threshold. Skipping iteration " + str( i ) )
 
             main.log.info( "Removing intents for next iteration" )
-            main.ONOS1cli.remove_intent( intent_id )
+            main.ONOS1cli.removeIntent( intentId )
 
             main.log.info( "Bringing Mininet interface up for next " +
                            "iteration" )
             main.Mininet1.handle.sendline(
-                "sh ifconfig s2-eth3 up" )
+                "sh ifconfig " + intfs + " up" )
+            main.Mininet1.handle.expect( "mininet>" )
 
-        intent_reroute_lat_avg = sum( intent_reroute_lat_list ) /\
-            len( intent_reroute_lat_list )
-        intent_reroute_lat_std = \
-            round( numpy.std( intent_reroute_lat_list ), 1 )
+        if intentRerouteLatList:
+            intentRerouteLatAvg = sum( intentRerouteLatList ) /\
+                len( intentRerouteLatList )
+        else:
+            main.log.report( "Intent reroute test failed. Results NA" )
+            intentRerouteLatAvg = "NA"
+            # NOTE: fails test when list is empty
+            assertion = main.FALSE
+
+        intentRerouteLatStd = \
+            round( numpy.std( intentRerouteLatList ), 1 )
         # END ITERATION FOR LOOP
         main.log.report( "Single intent reroute latency - " )
-        main.log.report( "Avg: " + str( intent_reroute_lat_avg ) + " ms" )
+        main.log.report( "Avg: " + str( intentRerouteLatAvg ) + " ms" )
         main.log.report(
             "Std Deviation: " +
-            str( intent_reroute_lat_std ) +
+            str( intentRerouteLatStd ) +
             " ms" )
 
-    def CASE7( self, main ):
-        """
-        Batch intent reroute latency
-        """
-        import time
-        import json
-        import requests
-        import os
-        import numpy
-
-        ONOS_ip_list = []
-        for i in range( 1, 8 ):
-            ONOS_ip_list.append( main.params[ 'CTRL' ][ 'ip' + str( i ) ] )
-
-        ONOS_user = main.params[ 'CTRL' ][ 'user' ]
-        default_sw_port = main.params[ 'CTRL' ][ 'port1' ]
-
-        batch_intent_size = main.params[ 'TEST' ][ 'batchIntentSize' ]
-        batch_thresh_min = int( main.params[ 'TEST' ][ 'batchThresholdMin' ] )
-        batch_thresh_max = int( main.params[ 'TEST' ][ 'batchThresholdMax' ] )
-        install_time = main.params[ 'JSON' ][ 'installedTime' ]
-
-        # number of iterations of case
-        num_iter = main.params[ 'TEST' ][ 'numIter' ]
-        num_ignore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
-        num_switch = int( main.params[ 'TEST' ][ 'numSwitch' ] )
-        n_thread = main.params[ 'TEST' ][ 'numMult' ]
-
-        main.log.report( "Batch intent installation test of " +
-                         batch_intent_size + " intents" )
-
-        batch_result_list = []
-
-        # Assign 'linear' switch format for basic intent testing
-        main.Mininet1.assign_sw_controller(
-            sw="1", ip1=ONOS1_ip, port1=default_sw_port )
-        main.Mininet1.assign_sw_controller(
-            sw="2", ip1=ONOS2_ip, port1=default_sw_port )
-        main.Mininet1.assign_sw_controller(
-            sw="3", ip1=ONOS2_ip, port1=default_sw_port )
-        main.Mininet1.assign_sw_controller(
-            sw="4", ip1=ONOS2_ip, port1=default_sw_port )
-        main.Mininet1.assign_sw_controller(
-            sw="5", ip1=ONOS3_ip, port1=default_sw_port )
-
-        time.sleep( 10 )
-
-        main.log.info( "Getting list of available devices" )
-        device_id_list = []
-        json_str = main.ONOS1cli.devices()
-        json_obj = json.loads( json_str )
-        for device in json_obj:
-            device_id_list.append( device[ 'id' ] )
-
-        batch_install_lat = []
-        batch_withdraw_lat = []
-        sleep_time = 10
-
-        base_dir = "/tmp/"
-        max_install_lat = []
-
-        for i in range( 0, int( num_iter ) ):
-            main.log.info( "Pushing " +
-                           str( int( batch_intent_size ) * int( n_thread ) ) +
-                           " intents. Iteration " + str( i ) )
-
-            main.ONOS1cli.push_test_intents(
-                "of:0000000000000001/1",
-                "of:0000000000000005/1",
-                1000, num_mult="1", app_id="1" )
-
-            # TODO: Check for installation success then proceed
-            time.sleep( 30 )
-
-            # NOTE: this interface is specific to
-            #      topo-intentFlower.py topology
-            #      reroute case.
-            main.log.info( "Disabling interface s2-eth3" )
-            main.Mininet1.handle.sendline(
-                "sh ifconfig s2-eth3 down" )
-            t0_system = time.time() * 1000
-
-            # TODO: Wait sufficient time for intents to install
-            time.sleep( 10 )
-
-            # TODO: get intent installation time
-
-            # Obtain metrics from ONOS 1, 2, 3
-            intents_json_str_1 = main.ONOS1cli.intents_events_metrics()
-            intents_json_str_2 = main.ONOS2cli.intents_events_metrics()
-            intents_json_str_3 = main.ONOS3cli.intents_events_metrics()
-
-            intents_json_obj_1 = json.loads( intents_json_str_1 )
-            intents_json_obj_2 = json.loads( intents_json_str_2 )
-            intents_json_obj_3 = json.loads( intents_json_str_3 )
-
-            # Parse values from the json object
-            intent_install_1 = \
-                intents_json_obj_1[ install_time ][ 'value' ]
-            intent_install_2 = \
-                intents_json_obj_2[ install_time ][ 'value' ]
-            intent_install_3 = \
-                intents_json_obj_3[ install_time ][ 'value' ]
-
-            intent_reroute_lat_1 = \
-                int( intent_install_1 ) - int( t0_system )
-            intent_reroute_lat_2 = \
-                int( intent_install_2 ) - int( t0_system )
-            intent_reroute_lat_3 = \
-                int( intent_install_3 ) - int( t0_system )
-
-            intent_reroute_lat_avg = \
-                ( intent_reroute_lat_1 +
-                  intent_reroute_lat_2 +
-                  intent_reroute_lat_3 ) / 3
-
-            main.log.info( "Intent reroute latency avg for iteration " +
-                           str( i ) + ": " + str( intent_reroute_lat_avg ) )
-            # TODO: Remove intents for next iteration
-
-            time.sleep( 5 )
-
-            intents_str = main.ONOS1cli.intents()
-            intents_json = json.loads( intents_str )
-            for intents in intents_json:
-                intent_id = intents[ 'id' ]
-                if intent_id:
-                    main.ONOS1cli.remove_intent( intent_id )
-
-            main.Mininet1.handle.sendline(
-                "sh ifconfig s2-eth3 up" )
-
-            main.log.info( "Intents removed and port back up" )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=assertion,
+            onpass="Single intent reroute latency test successful",
+            onfail="Single intent reroute latency test failed" )
 
     def CASE4( self, main ):
         """
         Batch intent install
+        
+        Supports scale-out scenarios and increasing
+        number of intents within each iteration
         """
         import time
         import json
         import requests
         import os
         import numpy
+        global clusterCount
+        global timeToPost
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS4_ip = main.params[ 'CTRL' ][ 'ip4' ]
-        ONOS5_ip = main.params[ 'CTRL' ][ 'ip5' ]
-        ONOS6_ip = main.params[ 'CTRL' ][ 'ip6' ]
-        ONOS7_ip = main.params[ 'CTRL' ][ 'ip7' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
 
-        ONOS_ip_list = []
+        assertion = main.TRUE
+
+        ONOSIpList = []
         for i in range( 1, 8 ):
-            ONOS_ip_list.append( main.params[ 'CTRL' ][ 'ip' + str( i ) ] )
+            ONOSIpList.append( main.params[ 'CTRL' ][ 'ip' + str( i ) ] )
 
-        ONOS_user = main.params[ 'CTRL' ][ 'user' ]
+        ONOSUser = main.params[ 'CTRL' ][ 'user' ]
 
-        default_sw_port = main.params[ 'CTRL' ][ 'port1' ]
+        defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
 
-        batch_intent_size = main.params[ 'TEST' ][ 'batchIntentSize' ]
-        batch_thresh_min = int( main.params[ 'TEST' ][ 'batchThresholdMin' ] )
-        batch_thresh_max = int( main.params[ 'TEST' ][ 'batchThresholdMax' ] )
+        batchIntentSize = int( main.params[ 'TEST' ][ 'batchIntentSize' ] )
+        batchThreshMin = int( main.params[ 'TEST' ][ 'batchThresholdMin' ] )
+        batchThreshMax = int( main.params[ 'TEST' ][ 'batchThresholdMax' ] )
 
         # number of iterations of case
-        num_iter = main.params[ 'TEST' ][ 'numIter' ]
-        num_ignore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
-        num_switch = int( main.params[ 'TEST' ][ 'numSwitch' ] )
-        n_thread = main.params[ 'TEST' ][ 'numMult' ]
-        #n_thread = 105
+        numIter = main.params[ 'TEST' ][ 'numIter' ]
+        numIgnore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
+        numSwitch = int( main.params[ 'TEST' ][ 'numSwitch' ] )
+        nThread = main.params[ 'TEST' ][ 'numMult' ]
+        #nThread = 105
 
-        #*****
-        global cluster_count
-        #*****
+        # DB operation variables
+        intentFilePath = main.params[ 'DB' ][ 'intentFilePath' ]
 
         # Switch assignment NOTE: hardcoded
-        if cluster_count == 1:
-            for i in range( 1, num_switch + 1 ):
-                main.Mininet1.assign_sw_controller(
+        if clusterCount == 1:
+            for i in range( 1, numSwitch + 1 ):
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS1_ip,
-                    port1=default_sw_port )
-        if cluster_count == 3:
+                    ip1=ONOS1Ip,
+                    port1=defaultSwPort )
+        if clusterCount == 3:
             for i in range( 1, 3 ):
-                main.Mininet1.assign_sw_controller(
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS1_ip,
-                    port1=default_sw_port )
+                    ip1=ONOS1Ip,
+                    port1=defaultSwPort )
             for i in range( 3, 6 ):
-                main.Mininet1.assign_sw_controller(
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS2_ip,
-                    port1=default_sw_port )
+                    ip1=ONOS2Ip,
+                    port1=defaultSwPort )
             for i in range( 6, 9 ):
-                main.Mininet1.assign_sw_controller(
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS3_ip,
-                    port1=default_sw_port )
-        if cluster_count == 5:
-            main.Mininet1.assign_sw_controller(
+                    ip1=ONOS3Ip,
+                    port1=defaultSwPort )
+        if clusterCount == 5:
+            main.Mininet1.assignSwController(
                 sw="1",
-                ip1=ONOS1_ip,
-                port1=default_sw_port )
-            main.Mininet1.assign_sw_controller(
+                ip1=ONOS1Ip,
+                port1=defaultSwPort )
+            main.Mininet1.assignSwController(
                 sw="2",
-                ip1=ONOS2_ip,
-                port1=default_sw_port )
+                ip1=ONOS2Ip,
+                port1=defaultSwPort )
             for i in range( 3, 6 ):
-                main.Mininet1.assign_sw_controller(
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS3_ip,
-                    port1=default_sw_port )
-            main.Mininet1.assign_sw_controller(
+                    ip1=ONOS3Ip,
+                    port1=defaultSwPort )
+            main.Mininet1.assignSwController(
                 sw="6",
-                ip1=ONOS4_ip,
-                port1=default_sw_port )
-            main.Mininet1.assign_sw_controller(
+                ip1=ONOS4Ip,
+                port1=defaultSwPort )
+            main.Mininet1.assignSwController(
                 sw="7",
-                ip1=ONOS5_ip,
-                port1=default_sw_port )
-            main.Mininet1.assign_sw_controller(
+                ip1=ONOS5Ip,
+                port1=defaultSwPort )
+            main.Mininet1.assignSwController(
                 sw="8",
-                ip1=ONOS5_ip,
-                port1=default_sw_port )
+                ip1=ONOS5Ip,
+                port1=defaultSwPort )
 
-        if cluster_count == 7:
+        if clusterCount == 7:
             for i in range( 1, 9 ):
                 if i < 8:
-                    main.Mininet1.assign_sw_controller(
+                    main.Mininet1.assignSwController(
                         sw=str( i ),
-                        ip1=ONOS_ip_list[ i - 1 ],
-                        port1=default_sw_port )
+                        ip1=ONOSIpList[ i - 1 ],
+                        port1=defaultSwPort )
                 elif i >= 8:
-                    main.Mininet1.assign_sw_controller(
+                    main.Mininet1.assignSwController(
                         sw=str( i ),
-                        ip1=ONOS_ip_list[ 6 ],
-                        port1=default_sw_port )
+                        ip1=ONOSIpList[ 6 ],
+                        port1=defaultSwPort )
 
-        time.sleep( 30 )
+        time.sleep( 20 )
 
         main.log.report( "Batch intent installation test of " +
-                         batch_intent_size + " intents" )
+                         str( batchIntentSize ) + " intent(s)" )
 
-        batch_result_list = []
+        batchResultList = []
 
         main.log.info( "Getting list of available devices" )
-        device_id_list = []
-        json_str = main.ONOS1cli.devices()
-        json_obj = json.loads( json_str )
-        for device in json_obj:
-            device_id_list.append( device[ 'id' ] )
+        deviceIdList = []
+        jsonStr = main.ONOS1cli.devices()
+        jsonObj = json.loads( jsonStr )
+        for device in jsonObj:
+            deviceIdList.append( device[ 'id' ] )
 
-        batch_install_lat = []
-        batch_withdraw_lat = []
-        sleep_time = 10
+        # List of install / witdhraw latencies for each batch
+        batchInstallLat = []
+        batchWithdrawLat = []
 
-        base_dir = "/tmp/"
-        max_install_lat = []
+        sleepTime = 10
 
-        for i in range( 0, int( num_iter ) ):
-            main.log.info( "Pushing " +
-                           str( int( batch_intent_size ) * int( n_thread ) ) +
-                           " intents. Iteration " + str( i ) )
+        baseDir = "/tmp/"
 
-            for node in range( 1, cluster_count + 1 ):
-                save_dir = base_dir + "batch_intent_" + str( node ) + ".txt"
-                main.ONOSbench.push_test_intents_shell(
-                    "of:0000000000000001/" + str( node ),
-                    "of:0000000000000008/" + str( node ),
-                    int( batch_intent_size ),
-                    save_dir, ONOS_ip_list[ node - 1 ],
-                    num_mult=n_thread, app_id=node )
+        # Batch size increase loop
+        for batch in range( 0, 5 ):
+            # Max intent install measurement of all nodes
+            # Resets after each batch calculation
+            maxInstallLat = []
+            maxWithdrawLat = []
+            # Max single intent install measurement of all nodes
+            # For example, if batch size is 1000, result latency
+            # will be divided by 1000
+            maxSingleInstallLat = []
+            maxSingleWithdrawLat = []
+            # Statistical gathering loop over number of iterations
+            for i in range( 0, int( numIter ) ):
+                main.log.info( "Pushing " +
+                               str( int( batchIntentSize ) * int( nThread ) ) +
+                               " intents. Iteration " + str( i ) )
 
-            # Wait sufficient time for intents to start
-            # installing
+                for node in range( 1, clusterCount + 1 ):
+                    saveDir = baseDir + "batch_intent_" + str( node ) + ".txt"
+                    main.ONOSbench.pushTestIntentsShell(
+                        deviceIdList[ 0 ] + "/2",
+                        deviceIdList[ 7 ] + "/2",
+                        batchIntentSize,
+                        saveDir, ONOSIpList[ node - 1 ],
+                        numMult=nThread )
 
-            time.sleep( sleep_time )
-            print sleep_time
+                # Wait sufficient time for intents to start
+                # installing
+                time.sleep( sleepTime )
 
-            intent = ""
-            counter = 300
-            while len( intent ) > 0 and counter > 0:
-                main.ONOS1cli.handle.sendline(
-                    "intents | wc -l" )
-                main.ONOS1cli.handle.expect(
-                    "intents | wc -l" )
-                main.ONOS1cli.handle.expect(
-                    "onos>" )
-                intent_temp = main.ONOS1cli.handle.before()
-                print intent_temp
+                intent = ""
+                counter = 300
+                while len( intent ) > 0 and counter > 0:
+                    main.ONOS1cli.handle.sendline(
+                        "intents | wc -l" )
+                    main.ONOS1cli.handle.expect(
+                        "intents | wc -l" )
+                    main.ONOS1cli.handle.expect(
+                        "onos>" )
+                    intentTemp = main.ONOS1cli.handle.before()
+                    intent = main.ONOS1cli.intents()
+                    intent = json.loads( intent )
+                    counter = counter - 1
+                    time.sleep( 1 )
 
-                intent = main.ONOS1cli.intents()
-                intent = json.loads( intent )
-                counter = counter - 1
-                time.sleep( 1 )
+                time.sleep( 5 )
 
-            time.sleep( 5 )
+                for node in range( 1, clusterCount + 1 ):
+                    saveDir = baseDir + "batch_intent_" + str( node ) + ".txt"
+                    with open( saveDir ) as fOnos:
+                        lineCount = 0
+                        for line in fOnos:
+                            line_temp = ""
+                            main.log.info( "Line read: " + str( line ) )
+                            line_temp = line[ 1: ]
+                            line_temp = line_temp.split( ": " )
+                            #Prevent split method if line doesn't have
+                            #space
+                            if " " in str(line_temp):
+                                result = line_temp[ 1 ].split( " " )[ 0 ]
+                            else:
+                                main.log.warn( "Empty line read" )
+                                result = 0
+                            # TODO: add parameters before appending latency
+                            if lineCount == 0:
+                                if "Failure" in str(line):
+                                    main.log.warn("Intent installation failed")
+                                    result = 'NA' 
+                                else:
+                                    main.log.info("Install result: "+result)
+                                    batchInstallLat.append( int( result ) )
+                                installResult = result
+                            elif lineCount == 1:
+                                if "Failure" in str(line):
+                                    main.log.warn("Intent withdraw failed")
+                                    result = 'NA'
+                                else:
+                                    main.log.info("Withdraw result: "+result)
+                                    batchWithdrawLat.append( int( result ) )
+                                withdrawResult = result
+                            else:
+                                main.log.warn("Invalid results: excess lines")
+                                installResult = 'NA'
+                                withdrawResult = 'NA'
+                            lineCount += 1
+                    main.log.info( "Batch install latency for ONOS" +
+                                   str( node ) + " with " +
+                                   str( batchIntentSize ) + "intents: " +
+                                   str( installResult ) + " ms" )
+                    main.log.info( "Batch withdraw latency for ONOS" +
+                                   str( node ) + " with " +
+                                   str( batchIntentSize ) + "intents: " +
+                                   str( withdrawResult ) + " ms" )
 
-            for node in range( 1, cluster_count + 1 ):
-                save_dir = base_dir + "batch_intent_" + str( node ) + ".txt"
-                with open( save_dir ) as f_onos:
-                    line_count = 0
-                    for line in f_onos:
-                        line = line[ 1: ]
-                        line = line.split( ": " )
-                        result = line[ 1 ].split( " " )[ 0 ]
-                        # TODO: add parameters before appending latency
-                        if line_count == 0:
-                            batch_install_lat.append( int( result ) )
-                        elif line_count == 1:
-                            batch_withdraw_lat.append( int( result ) )
-                        line_count += 1
-                main.log.info( "Batch install latency for ONOS" +
-                               str( node ) + " with " +
-                               str( batch_intent_size ) + "intents: " +
-                               str( batch_install_lat ) )
+                    main.log.info( "Single intent install latency ONOS" +
+                                    str( node ) + " with " +
+                                    str( batchIntentSize ) + "intents: " +
+                                    str( float(installResult) /\
+                                         int(batchIntentSize) ) + " ms" )
+                    main.log.info( "Single intent withdraw latency ONOS" +
+                                    str( node ) + " with " +
+                                    str( batchIntentSize ) + "intents: " +
+                                    str( float(withdrawResult) /\
+                                         int(batchIntentSize) ) + " ms" )
 
-            if len( batch_install_lat ) > 0 and int( i ) > num_ignore:
-                max_install_lat.append( max( batch_install_lat ) )
-            elif len( batch_install_lat ) == 0:
-                # If I failed to read anything from the file,
-                # increase the wait time before checking intents
-                sleep_time += 30
-            batch_install_lat = []
+                #NOTE: END node loop
 
-            # Sleep in between iterations
-            time.sleep( 5 )
+                if len( batchInstallLat ) > 0 and int( i ) > numIgnore:
+                    maxInstallLat.append( max( batchInstallLat ) )
+                    maxSingleInstallLat.append( 
+                            max( batchInstallLat ) / int( batchIntentSize ) 
+                    )
+                elif len( batchInstallLat ) == 0:
+                    # If I failed to read anything from the file,
+                    # increase the wait time before checking intents
+                    sleepTime += 30
+                if len( batchWithdrawLat ) > 0 and int( i ) > numIgnore:
+                    maxWithdrawLat.append( max( batchWithdrawLat ) )
+                    maxSingleWithdrawLat.append( 
+                            max( batchWithdrawLat ) / int( batchIntentSize ) 
+                    )
+                batchInstallLat = []
+                batchWithdrawLat = []
 
-        main.log.report( "Avg of batch installation latency " +
-                         ": " +
-                         str( sum( max_install_lat ) /
-                              len( max_install_lat ) ) )
-        main.log.report( "Std Deviation of batch installation latency " +
-                         ": " +
-                         str( numpy.std( max_install_lat ) ) )
+                # Sleep in between iterations
+                time.sleep( 5 )
+
+            #NOTE: END iteration loop
+
+            if maxInstallLat:
+                avgInstallLat = str( round( numpy.average(maxInstallLat)
+                                          , 2 ))
+                stdInstallLat = str( round(
+                                    numpy.std(maxInstallLat), 2))
+                avgSingleInstallLat = str( round( 
+                                            numpy.average(maxSingleInstallLat)
+                                           , 3 ))
+                stdSingleInstallLat = str( round(
+                                            numpy.std(maxSingleInstallLat),
+                                            3 ))
+            else:
+                avgInstallLat = "NA"
+                stdInstallLat = "NA"
+                main.log.report( "Batch installation failed" )
+                assertion = main.FALSE
+
+            if maxWithdrawLat:
+                avgWithdrawLat = str( round( numpy.average(maxWithdrawLat)
+                                            , 2 ))
+                stdWithdrawLat = str( round(
+                                    numpy.std(maxWithdrawLat), 2))
+                avgSingleWithdrawLat = str( round( 
+                                            numpy.average(maxSingleWithdrawLat)
+                                           , 3 ))
+                stdSingleWithdrawLat = str( round(
+                                            numpy.std(maxSingleWithdrawLat),
+                                            3 ))
+            else:
+                avgWithdrawLat = "NA"
+                stdWithdrawLat = "NA"
+                main.log.report( "Batch withdraw failed" )
+                assertion = main.FALSE
+
+            main.log.report( "Avg of batch installation latency " +
+                             "of size " + str( batchIntentSize ) + ": " +
+                             str( avgInstallLat ) + " ms" )
+            main.log.report( "Std Deviation of batch installation latency " +
+                             ": " +
+                             str( stdInstallLat ) + " ms" )
+            main.log.report( "Avg of single installation latency " +
+                             "of size " + str( batchIntentSize ) + ": " +
+                             str( avgSingleInstallLat ) + " ms" )
+            main.log.report( "Std Deviation of single installation latency " +
+                             ": " +
+                             str( stdSingleInstallLat ) + " ms" )
+
+            main.log.report( "Avg of batch withdraw latency " +
+                             "of size " + str( batchIntentSize ) + ": " +
+                             str( avgWithdrawLat ) + " ms" )
+            main.log.report( "Std Deviation of batch withdraw latency " +
+                             ": " +
+                             str( stdWithdrawLat ) + " ms" )
+            main.log.report( "Avg of single withdraw latency " +
+                             "of size " + str( batchIntentSize ) + ": " +
+                             str( avgSingleWithdrawLat ) + " ms" )
+            main.log.report( "Std Deviation of single withdraw latency " +
+                             ": " +
+                             str( stdSingleWithdrawLat ) + " ms" )
+
+            dbCmd = (
+                "INSERT INTO intents_latency_tests VALUES("
+                "'"+timeToPost+"','intents_latency_results',"
+                ""+runNum+","+str(clusterCount)+","+str(batchIntentSize)+","
+                ""+str(avgInstallLat)+","+str(stdInstallLat)+","
+                ""+str(avgWithdrawLat)+","+str(stdWithdrawLat)+");"
+            )
+
+            # Write result to file (which is posted to DB by jenkins)
+            fResult = open(intentFilePath, 'a')
+            if dbCmd:        
+                fResult.write(dbCmd+"\n")
+            fResult.close()
+
+            if batch == 0:
+                batchIntentSize = 10
+            elif batch == 1:
+                batchIntentSize = 100
+            elif batch == 2:
+                batchIntentSize = 1000
+            elif batch == 3:
+                batchIntentSize = 2000
+            if batch < 4:
+                main.log.report( "Increasing batch intent size to " +
+                             str(batchIntentSize) )
+
+        #NOTE: END batch loop
+
+        #main.log.info( "Removing all intents for next test case" )
+        #jsonTemp = main.ONOS1cli.intents( jsonFormat=True )
+        #jsonObjIntents = json.loads( jsonTemp )
+        # if jsonObjIntents:
+        #    for intents in jsonObjIntents:
+        #        tempId = intents[ 'id' ]
+            # main.ONOS1cli.removeIntent( tempId )
+        #        main.ONOS1cli.removeIntent( tempId )
+
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=assertion,
+            onpass="Batch intent install/withdraw test successful",
+            onfail="Batch intent install/withdraw test failed" )
 
     def CASE5( self, main ):
         """
@@ -720,100 +973,276 @@
         import time
         import json
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS4_ip = main.params[ 'CTRL' ][ 'ip4' ]
-        ONOS5_ip = main.params[ 'CTRL' ][ 'ip5' ]
-        ONOS6_ip = main.params[ 'CTRL' ][ 'ip6' ]
-        ONOS7_ip = main.params[ 'CTRL' ][ 'ip7' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
 
-        global cluster_count
-        cluster_count += 2
+        global clusterCount
+        clusterCount += 2
         main.log.report( "Increasing cluster size to " +
-                         str( cluster_count ) )
+                         str( clusterCount ) )
 
-        install_result = main.FALSE
+        installResult = main.FALSE
 
-        if cluster_count == 3:
-            install_result1 = \
-                main.ONOSbench.onos_install( node=ONOS2_ip )
-            install_result2 = \
-                main.ONOSbench.onos_install( node=ONOS3_ip )
+        if clusterCount == 3:
+            installResult1 = \
+                main.ONOSbench.onosInstall( node=ONOS2Ip )
+            installResult2 = \
+                main.ONOSbench.onosInstall( node=ONOS3Ip )
             time.sleep( 5 )
 
             main.log.info( "Starting ONOS CLI" )
-            main.ONOS2cli.start_onos_cli( ONOS2_ip )
-            main.ONOS3cli.start_onos_cli( ONOS3_ip )
+            main.ONOS2cli.startOnosCli( ONOS2Ip )
+            main.ONOS3cli.startOnosCli( ONOS3Ip )
 
-            install_result = install_result1 and install_result2
+            installResult = installResult1 and installResult2
 
-        if cluster_count == 5:
+        if clusterCount == 5:
             main.log.info( "Installing ONOS on node 4 and 5" )
-            install_result1 = \
-                main.ONOSbench.onos_install( node=ONOS4_ip )
-            install_result2 = \
-                main.ONOSbench.onos_install( node=ONOS5_ip )
+            installResult1 = \
+                main.ONOSbench.onosInstall( node=ONOS4Ip )
+            installResult2 = \
+                main.ONOSbench.onosInstall( node=ONOS5Ip )
 
             main.log.info( "Starting ONOS CLI" )
-            main.ONOS4cli.start_onos_cli( ONOS4_ip )
-            main.ONOS5cli.start_onos_cli( ONOS5_ip )
+            main.ONOS4cli.startOnosCli( ONOS4Ip )
+            main.ONOS5cli.startOnosCli( ONOS5Ip )
 
-            install_result = install_result1 and install_result2
+            installResult = installResult1 and installResult2
 
-        if cluster_count == 7:
+        if clusterCount == 7:
             main.log.info( "Installing ONOS on node 6 and 7" )
-            install_result1 = \
-                main.ONOSbench.onos_install( node=ONOS6_ip )
-            install_result2 = \
-                main.ONOSbench.onos_install( node=ONOS7_ip )
+            installResult1 = \
+                main.ONOSbench.onosInstall( node=ONOS6Ip )
+            installResult2 = \
+                main.ONOSbench.onosInstall( node=ONOS7Ip )
 
             main.log.info( "Starting ONOS CLI" )
-            main.ONOS6cli.start_onos_cli( ONOS6_ip )
-            main.ONOS7cli.start_onos_cli( ONOS7_ip )
+            main.ONOS6cli.startOnosCli( ONOS6Ip )
+            main.ONOS7cli.startOnosCli( ONOS7Ip )
 
-            install_result = install_result1 and install_result2
+            installResult = installResult1 and installResult2
 
         time.sleep( 5 )
 
-        if install_result == main.TRUE:
+        if installResult == main.TRUE:
             assertion = main.TRUE
         else:
             assertion = main.FALSE
 
-        utilities.assert_equals(
-            expect=main.TRUE,
-            actual=assertion,
-            onpass="Scale out to " +
-            str( cluster_count ) +
-            " nodes successful",
-            onfail="Scale out to " +
-            str( cluster_count ) +
-            " nodes failed" )
+        utilities.assert_equals( expect=main.TRUE, actual=assertion,
+                                onpass="Scale out to " + str( clusterCount ) +
+                                " nodes successful",
+                                onfail="Scale out to " + str( clusterCount ) +
+                                " nodes failed" )
+
+    def CASE7( self, main ):
+        # TODO: Fix for scale-out scenario
+        """
+        Batch intent reroute latency
+        """
+        import time
+        import json
+        import requests
+        import os
+        import numpy
+        global clusterCount
+
+        ONOSIpList = []
+        for i in range( 1, 8 ):
+            ONOSIpList.append( main.params[ 'CTRL' ][ 'ip' + str( i ) ] )
+
+        ONOSUser = main.params[ 'CTRL' ][ 'user' ]
+        defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
+
+        batchIntentSize = main.params[ 'TEST' ][ 'batchIntentSize' ]
+        batchThreshMin = int( main.params[ 'TEST' ][ 'batchThresholdMin' ] )
+        batchThreshMax = int( main.params[ 'TEST' ][ 'batchThresholdMax' ] )
+        intfs = main.params[ 'TEST' ][ 'intfs' ]
+        installTime = main.params[ 'JSON' ][ 'installedTime' ]
+
+        # number of iterations of case
+        numIter = main.params[ 'TEST' ][ 'numIter' ]
+        numIgnore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
+        numSwitch = int( main.params[ 'TEST' ][ 'numSwitch' ] )
+        nThread = main.params[ 'TEST' ][ 'numMult' ]
+
+        main.log.report( "Batch intent installation test of " +
+                         batchIntentSize + " intents" )
+
+        batchResultList = []
+
+        time.sleep( 10 )
+
+        main.log.info( "Getting list of available devices" )
+        deviceIdList = []
+        jsonStr = main.ONOS1cli.devices()
+        jsonObj = json.loads( jsonStr )
+        for device in jsonObj:
+            deviceIdList.append( device[ 'id' ] )
+
+        batchInstallLat = []
+        batchWithdrawLat = []
+        sleepTime = 10
+
+        baseDir = "/tmp/"
+        maxInstallLat = []
+
+        for i in range( 0, int( numIter ) ):
+            main.log.info( "Pushing " +
+                           str( int( batchIntentSize ) * int( nThread ) ) +
+                           " intents. Iteration " + str( i ) )
+
+            main.ONOSbench.pushTestIntentsShell(
+                deviceIdList[ 0 ] + "/2",
+                deviceIdList[ 7 ] + "/2",
+                batchIntentSize, "/tmp/batch_install.txt",
+                ONOSIpList[ 0 ], numMult="1", appId="1",
+                report=False, options="--install" )
+            # main.ONOSbench.pushTestIntentsShell(
+            #    "of:0000000000001002/1",
+            #    "of:0000000000002002/1",
+            #    133, "/tmp/temp2.txt", "10.128.174.2",
+            #    numMult="6", appId="2",report=False )
+
+            # TODO: Check for installation success then proceed
+            time.sleep( 30 )
+
+            # NOTE: this interface is specific to
+            #      topo-intentFlower.py topology
+            #      reroute case.
+            main.log.info( "Disabling interface " + intfs )
+            main.Mininet1.handle.sendline(
+                "sh ifconfig " + intfs + " down" )
+            t0System = time.time() * 1000
+
+            # TODO: Wait sufficient time for intents to install
+            time.sleep( 10 )
+
+            # TODO: get intent installation time
+
+            # Obtain metrics from ONOS 1, 2, 3
+            intentsJsonStr1 = main.ONOS1cli.intentsEventsMetrics()
+            intentsJsonObj1 = json.loads( intentsJsonStr1 )
+            # Parse values from the json object
+            intentInstall1 = \
+                intentsJsonObj1[ installTime ][ 'value' ]
+            intentRerouteLat1 = \
+                int( intentInstall1 ) - int( t0System )
+
+            if clusterCount == 3:
+                intentsJsonStr2 =\
+                    main.ONOS2cli.intentsEventsMetrics()
+                intentsJsonStr3 =\
+                    main.ONOS3cli.intentsEventsMetrics()
+                intentsJsonObj2 = json.loads( intentsJsonStr2 )
+                intentsJsonObj3 = json.loads( intentsJsonStr3 )
+                intentInstall2 = \
+                    intentsJsonObj2[ installTime ][ 'value' ]
+                intentInstall3 = \
+                    intentsJsonObj3[ installTime ][ 'value' ]
+                intentRerouteLat2 = \
+                    int( intentInstall2 ) - int( t0System )
+                intentRerouteLat3 = \
+                    int( intentInstall3 ) - int( t0System )
+            else:
+                intentRerouteLat2 = 0
+                intentRerouteLat3 = 0
+
+            if clusterCount == 5:
+                intentsJsonStr4 =\
+                    main.ONOS4cli.intentsEventsMetrics()
+                intentsJsonStr5 =\
+                    main.ONOS5cli.intentsEventsMetrics()
+                intentsJsonObj4 = json.loads( intentsJsonStr4 )
+                intentsJsonObj5 = json.loads( intentsJsonStr5 )
+                intentInstall4 = \
+                    intentsJsonObj4[ installTime ][ 'value' ]
+                intentInstall5 = \
+                    intentsJsonObj5[ installTime ][ 'value' ]
+                intentRerouteLat4 = \
+                    int( intentInstall4 ) - int( t0System )
+                intentRerouteLat5 = \
+                    int( intentInstall5 ) - int( t0System )
+            else:
+                intentRerouteLat4 = 0
+                intentRerouteLat5 = 0
+
+            if clusterCount == 7:
+                intentsJsonStr6 =\
+                    main.ONOS6cli.intentsEventsMetrics()
+                intentsJsonStr7 =\
+                    main.ONOS7cli.intentsEventsMetrics()
+                intentsJsonObj6 = json.loads( intentsJsonStr6 )
+                intentsJsonObj7 = json.loads( intentsJsonStr7 )
+                intentInstall6 = \
+                    intentsJsonObj6[ installTime ][ 'value' ]
+                intentInstall7 = \
+                    intentsJsonObj7[ installTime ][ 'value' ]
+                intentRerouteLat6 = \
+                    int( intentInstall6 ) - int( t0System )
+                intentRerouteLat7 = \
+                    int( intentInstall7 ) - int( t0System )
+            else:
+                intentRerouteLat6 = 0
+                intentRerouteLat7 = 0
+
+            intentRerouteLatAvg = \
+                ( intentRerouteLat1 +
+                  intentRerouteLat2 +
+                  intentRerouteLat3 +
+                  intentRerouteLat4 +
+                  intentRerouteLat5 +
+                  intentRerouteLat6 +
+                  intentRerouteLat7 ) / clusterCount
+
+            main.log.info( "Intent reroute latency avg for iteration " +
+                           str( i ) + ": " + str( intentRerouteLatAvg ) )
+            # TODO: Remove intents for next iteration
+
+            time.sleep( 5 )
+
+            intentsStr = main.ONOS1cli.intents()
+            intentsJson = json.loads( intentsStr )
+            for intents in intentsJson:
+                intentId = intents[ 'id' ]
+                # TODO: make sure this removes all intents
+                # print intentId
+                if intentId:
+                    main.ONOS1cli.removeIntent( intentId )
+
+            main.Mininet1.handle.sendline(
+                "sh ifconfig " + intfs + " up" )
+
+            main.log.info( "Intents removed and port back up" )
 
     def CASE9( self, main ):
         count = 0
-        sw_num1 = 1
-        sw_num2 = 1
+        swNum1 = 1
+        swNum2 = 1
         appid = 0
-        port_num1 = 1
-        port_num2 = 1
+        portNum1 = 1
+        portNum2 = 1
 
         time.sleep( 30 )
 
         while True:
-            # main.ONOS1cli.push_test_intents(
+            # main.ONOS1cli.pushTestIntents(
                     #"of:0000000000001001/1",
                 #"of:0000000000002001/1",
-                #    100, num_mult="10", app_id="1" )
-            # main.ONOS2cli.push_test_intents(
+                #    100, numMult="10", appId="1" )
+            # main.ONOS2cli.pushTestIntents(
             #    "of:0000000000001002/1",
             #    "of:0000000000002002/1",
-            #    100, num_mult="10", app_id="2" )
-            # main.ONOS2cli.push_test_intents(
+            #    100, numMult="10", appId="2" )
+            # main.ONOS2cli.pushTestIntents(
             #    "of:0000000000001003/1",
             #    "of:0000000000002003/1",
-            #    100, num_mult="10", app_id="3" )
+            #    100, numMult="10", appId="3" )
             count += 1
 
             if count >= 100:
@@ -822,36 +1251,34 @@
                     " /tmp/metrics_intents_temp.txt &" )
                 count = 0
 
-            arg1 = "of:000000000000100" + \
-                str( sw_num1 ) + "/" + str( port_num1 )
-            arg2 = "of:000000000000200" + \
-                str( sw_num2 ) + "/" + str( port_num2 )
+            arg1 = "of:000000000000100" + str( swNum1 ) + "/" + str( portNum1 )
+            arg2 = "of:000000000000200" + str( swNum2 ) + "/" + str( portNum2 )
 
-            sw_num1 += 1
+            swNum1 += 1
 
-            if sw_num1 > 7:
-                sw_num1 = 1
-                sw_num2 += 1
-                if sw_num2 > 7:
+            if swNum1 > 7:
+                swNum1 = 1
+                swNum2 += 1
+                if swNum2 > 7:
                     appid += 1
 
-            if sw_num2 > 7:
-                sw_num2 = 1
+            if swNum2 > 7:
+                swNum2 = 1
 
-            main.ONOSbench.push_test_intents_shell(
+            main.ONOSbench.pushTestIntentsShell(
                 arg1,
                 arg2,
                 100, "/tmp/temp.txt", "10.128.174.1",
-                num_mult="10", app_id=appid, report=False )
-            # main.ONOSbench.push_test_intents_shell(
+                numMult="10", appId=appid, report=False )
+            # main.ONOSbench.pushTestIntentsShell(
             #    "of:0000000000001002/1",
             #    "of:0000000000002002/1",
             #    133, "/tmp/temp2.txt", "10.128.174.2",
-            #    num_mult="6", app_id="2",report=False )
-            # main.ONOSbench.push_test_intents_shell(
+            #    numMult="6", appId="2",report=False )
+            # main.ONOSbench.pushTestIntentsShell(
             #    "of:0000000000001003/1",
             #    "of:0000000000002003/1",
             #    133, "/tmp/temp3.txt", "10.128.174.3",
-            #    num_mult="6", app_id="3",report=False )
+            #    numMult="6", appId="3",report=False )
 
             time.sleep( 0.2 )
diff --git a/TestON/tests/IntentPerfNext/IntentPerfNext.topo b/TestON/tests/IntentPerfNext/IntentPerfNext.topo
index 048695d..5575237 100644
--- a/TestON/tests/IntentPerfNext/IntentPerfNext.topo
+++ b/TestON/tests/IntentPerfNext/IntentPerfNext.topo
@@ -24,7 +24,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
-            <connect_order>2</connect_order>
+            <connect_order>3</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS2cli>
         
@@ -33,7 +33,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
-            <connect_order>2</connect_order>
+            <connect_order>4</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS3cli>
         
@@ -42,7 +42,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
-            <connect_order>2</connect_order>
+            <connect_order>5</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS4cli>
         
@@ -51,7 +51,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
-            <connect_order>2</connect_order>
+            <connect_order>6</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS5cli>
         
@@ -60,7 +60,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
-            <connect_order>2</connect_order>
+            <connect_order>7</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS6cli>
         
@@ -69,7 +69,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
-            <connect_order>2</connect_order>
+            <connect_order>8</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS7cli>
 
@@ -78,7 +78,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosDriver</type>
-            <connect_order>3</connect_order>
+            <connect_order>9</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS1>
 
@@ -87,9 +87,9 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>MininetCliDriver</type>
-            <connect_order>4</connect_order>
+            <connect_order>10</connect_order>
             <COMPONENTS>
-                <arg1> --custom topo-intentFlower.py </arg1>
+                <arg1> --custom topo-intent-8sw.py </arg1>
                 <arg2> --arp --mac --topo mytopo </arg2>
                 <arg3> </arg3>
                 <controller> remote </controller>
@@ -101,7 +101,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>RemoteMininetDriver</type>
-            <connect_order>5</connect_order>
+            <connect_order>11</connect_order>
             <COMPONENTS> </COMPONENTS>
         </Mininet2>
 
diff --git a/TestON/tests/IntentPerfNext/__init__.py b/TestON/tests/IntentPerfNext/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/IntentPerfNext/__init__.py
diff --git a/TestON/tests/LincOETest/LincOETest.py b/TestON/tests/LincOETest/LincOETest.py
index 6c59c5b..b693138 100644
--- a/TestON/tests/LincOETest/LincOETest.py
+++ b/TestON/tests/LincOETest/LincOETest.py
@@ -29,62 +29,62 @@
         """
         import time
 
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS1_port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
 
-        git_pull_trigger = main.params[ 'GIT' ][ 'autoPull' ]
-        git_checkout_branch = main.params[ 'GIT' ][ 'checkout' ]
+        gitPullTrigger = main.params[ 'GIT' ][ 'autoPull' ]
+        gitCheckoutBranch = main.params[ 'GIT' ][ 'checkout' ]
 
         main.case( "Setting up test environment" )
 
         main.step( "Creating cell file" )
         # params: ( bench ip, cell name, mininet ip, *onos ips )
-        cell_file_result = main.ONOSbench.create_cell_file(
-            "10.128.20.10", cell_name, "10.128.10.90",
+        cellFileResult = main.ONOSbench.createCellFile(
+            "10.128.20.10", cellName, "10.128.10.90",
             "onos-core-trivial,onos-app-fwd",
             "10.128.174.1" )
 
         main.step( "Applying cell variable to environment" )
-        #cell_result = main.ONOSbench.set_cell( cell_name )
-        cell_result = main.ONOSbench.set_cell( "temp_cell_2" )
-        verify_result = main.ONOSbench.verify_cell()
+        # cellResult = main.ONOSbench.setCell( cellName )
+        cellResult = main.ONOSbench.setCell( "temp_cell_2" )
+        verifyResult = main.ONOSbench.verifyCell()
 
-        if git_pull_trigger == 'on':
+        if gitPullTrigger == 'on':
             main.step( "Git checkout and pull master" )
-            main.ONOSbench.git_checkout( git_checkout_branch )
-            git_pull_result = main.ONOSbench.git_pull()
+            main.ONOSbench.gitCheckout( gitCheckoutBranch )
+            gitPullResult = main.ONOSbench.gitPull()
         else:
             main.log.info( "Git checkout and pull skipped by config" )
-            git_pull_result = main.TRUE
+            gitPullResult = main.TRUE
 
         main.step( "Using mvn clean & install" )
-        #clean_install_result = main.ONOSbench.clean_install()
-        clean_install_result = main.TRUE
+        # cleanInstallResult = main.ONOSbench.cleanInstall()
+        cleanInstallResult = main.TRUE
 
         main.step( "Creating ONOS package" )
-        package_result = main.ONOSbench.onos_package()
+        packageResult = main.ONOSbench.onosPackage()
 
         main.step( "Installing ONOS package" )
-        onos_install_result = main.ONOSbench.onos_install()
-        onos1_isup = main.ONOSbench.isup()
+        onosInstallResult = main.ONOSbench.onosInstall()
+        onos1Isup = main.ONOSbench.isup()
 
         main.step( "Starting ONOS service" )
-        start_result = main.ONOSbench.onos_start( ONOS1_ip )
+        startResult = main.ONOSbench.onosStart( ONOS1Ip )
 
         main.step( "Setting cell for ONOScli" )
-        main.ONOScli.set_cell( cell_name )
+        main.ONOScli.setCell( cellName )
 
         main.step( "Starting ONOScli" )
-        main.ONOScli.start_onos_cli( ONOS1_ip )
+        main.ONOScli.startOnosCli( ONOS1Ip )
 
-        case1_result = ( clean_install_result and package_result and
-                         cell_result and verify_result and onos_install_result and
-                         onos1_isup and start_result )
-        utilities.assert_equals( expect=main.TRUE, actual=case1_result,
-                                 onpass="Test startup successful",
-                                 onfail="Test startup NOT successful" )
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and onosInstallResult and
+                        onos1Isup and startResult )
+        utilities.assertEquals( expect=main.TRUE, actual=case1Result,
+                                onpass="Test startup successful",
+                                onfail="Test startup NOT successful" )
 
         time.sleep( 10 )
 
@@ -94,18 +94,18 @@
         """
         import time
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        default_sw_port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
 
         # Assign packet level switches to controller
-        main.Mininet1.assign_sw_controller(
+        main.Mininet1.assignSwController(
             sw="1",
-            ip1=ONOS1_ip,
-            port1=default_sw_port )
-        main.Mininet1.assign_sw_controller(
+            ip1=ONOS1Ip,
+            port1=defaultSwPort )
+        main.Mininet1.assignSwController(
             sw="2",
-            ip1=ONOS1_ip,
-            port1=default_sw_port )
+            ip1=ONOS1Ip,
+            port1=defaultSwPort )
 
         # Check devices in controller
         # This should include Linc-OE devices as well
diff --git a/TestON/tests/LincOETest/__init__.py b/TestON/tests/LincOETest/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/LincOETest/__init__.py
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.params b/TestON/tests/LinkEventTP/LinkEventTP.params
index 83a1180..b4d50e5 100644
--- a/TestON/tests/LinkEventTP/LinkEventTP.params
+++ b/TestON/tests/LinkEventTP/LinkEventTP.params
@@ -1,12 +1,9 @@
 <PARAMS>
-
-    <testcases>1,2,3,2,3,2,3</testcases>
-
+    <testcases>1,3,2,3,2,3,2,3</testcases>
     <ENV>
     <cellName>network_tp_test</cellName>
     <cellFeatures>"webconsole,onos-core,onos-api,onos-cli,onos-null,onos-rest,onos-app-metrics,onos-app-metrics-intent,onos-app-metrics-topology"</cellFeatures>
     </ENV>
-    
     <SCALE>2</SCALE>
     <availableNodes>7</availableNodes>
 
@@ -17,21 +14,21 @@
 
     <CTRL>
         <USER>admin</USER>
-        <ip1>10.128.5.51</ip1>
+        <ip1>10.254.1.201</ip1>
         <port1>6633</port1>
-        <ip2>10.128.5.52</ip2>
+        <ip2>10.254.1.202</ip2>
         <port2>6633</port2>
-        <ip3>10.128.5.53</ip3>
+        <ip3>10.254.1.203</ip3>
         <port3>6633</port3>
-        <ip4>10.128.5.54</ip4>
+        <ip4>10.254.1.204</ip4>
         <port4>6633</port4>
-        <ip5>10.128.5.65</ip5>
+        <ip5>10.254.1.205</ip5>
         <port5>6633</port5>
-	    <ip6>10.128.5.66</ip6>
+	<ip6>10.254.1.206</ip6>
         <port6>6633</port6>
-	    <ip7>10.128.5.67</ip7>
+	<ip7>10.254.1.207</ip7>
         <port7>6633</port7>
-        </CTRL>
+    </CTRL>
 
     <BENCH>
         <user>admin</user>
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.py b/TestON/tests/LinkEventTP/LinkEventTP.py
index ab490a9..e7d2133 100644
--- a/TestON/tests/LinkEventTP/LinkEventTP.py
+++ b/TestON/tests/LinkEventTP/LinkEventTP.py
@@ -89,7 +89,64 @@
         #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
         if skipMvn != "yes":
             mvnResult = main.ONOSbench.cleanInstall()
-           
+
+        #configuring file to enable flicker
+        main.log.step(" Configuring null provider to enable flicker. Flicker Rate = " + flickerRate )
+        homeDir = os.path.expanduser('~')
+        main.log.info(homeDir)
+        localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
+        filePath = homeDir + localPath
+        main.log.info(filePath)
+
+        neighborsString = ""
+        for node in range(1, maxNodes + 1):
+            neighborsString += ONOSIp[node]
+            if node < maxNodes:
+                neighborsString += ","
+
+        configFile = open(filePath, 'w+')
+        main.log.info("File opened")
+        configFile.write("# Sample configurations for the NullLinkProvider.\n")
+        configFile.write("# \n")
+        configFile.write("# If enabled, sets time between linkEvent generation\n")
+        configFile.write("# in milliseconds.\n")
+        configFile.write("#\n") 
+        configFile.write("eventRate = " + flickerRate)
+        configFile.write("\n")
+        configFile.write("#Set order of islands to chain together, in a line.\n")
+        configFile.write("neighbors = " + neighborsString)
+        configFile.close()
+        main.log.info("Configuration completed")
+
+        ### configure event rate file ###
+        main.log.step("Writing Default Topology Provider config file")
+        localPath = main.params[ 'TEST' ][ 'configFile' ]
+        filePath = homeDir + localPath
+        main.log.info(filePath)
+        configFile = open(filePath, 'w+')
+        main.log.info("File Opened")
+        configFile.write("maxEvents = 1\n")
+        configFile.write("maxIdleMs = 0\n")
+        configFile.write("maxBatchMs = 0\n")
+        main.log.info("File written and closed")
+       
+ 
+        devices_by_ip = ""
+        for node in range(1, maxNodes + 1):
+            devices_by_ip += (ONOSIp[node] + ":" + str(5))
+            if node < maxNodes:
+                devices_by_ip +=(",")
+        
+        main.log.step("Configuring device provider")
+        localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
+        filePath = homeDir + localPath
+        main.log.info(filePath)
+        configFile = open(filePath, 'w+')
+        main.log.info("Device config file opened")
+        configFile.write("devConfigs = " + devices_by_ip)
+        configFile.close()
+        main.log.info("File closed")
+
         logFileName = main.params[ 'TEST' ][ 'logFile' ]
         logFile = open(logFileName, 'w+')
         main.log.info("Created log File")
@@ -108,7 +165,7 @@
         main.ONOS1cli.startOnosCli( ONOSIp[1] )
         main.step( "ONOS 1 is up and running." )
         main.ONOSbench.handle.expect(":~") #there is a dangling sendline somewhere...	
-        
+    
     def CASE2( self, main ):
         # This case increases the cluster size by whatever scale is
         # Note: 'scale' is the size of the step
@@ -162,7 +219,7 @@
             main.ONOSbench.onosInstall( ONOSIp[node] )
             exec "a = main.ONOS%scli.startOnosCli" %str(node)
             a(ONOSIp[node])
-
+        
         for node in range(1, clusterCount + 1):
             for i in range( 2 ):
                 isup = main.ONOSbench.isup( ONOSIp[node] )
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.pyc b/TestON/tests/LinkEventTP/LinkEventTP.pyc
new file mode 100644
index 0000000..08393ed
--- /dev/null
+++ b/TestON/tests/LinkEventTP/LinkEventTP.pyc
Binary files differ
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.topo~181237eeae25f1037910e9d18e4c2c1dc778ce92 b/TestON/tests/LinkEventTP/LinkEventTP.topo~181237eeae25f1037910e9d18e4c2c1dc778ce92
new file mode 100644
index 0000000..1c48a85
--- /dev/null
+++ b/TestON/tests/LinkEventTP/LinkEventTP.topo~181237eeae25f1037910e9d18e4c2c1dc778ce92
@@ -0,0 +1,146 @@
+<TOPOLOGY>
+
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+		<home>~/onos</home>
+	    </COMPONENTS>
+
+        </ONOSbench>
+
+        <ONOS1cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1cli>
+
+        <ONOS2cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS2cli>
+
+        <ONOS3cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS3cli>
+
+        <ONOS4cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS4cli>
+
+        <ONOS5cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS5cli>
+
+	<ONOS6cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>7</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS6cli>
+
+        <ONOS7cli>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>8</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS7cli>
+
+        <ONOS1>
+            <host>10.254.1.201</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>9</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOS2>
+            <host>10.254.1.202</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>10</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS2>
+
+        <ONOS3>
+            <host>10.254.1.203</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>11</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS3>
+
+        <ONOS4>
+            <host>10.254.1.204</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>12</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS4>
+
+	
+        <ONOS5>
+            <host>10.254.1.205</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>13</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS5>
+
+        <ONOS6>
+            <host>10.254.1.206</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>14</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS6>
+
+        <ONOS7>
+            <host>10.254.1.207</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>15</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS7>
+
+    </COMPONENT>
+
+</TOPOLOGY>
diff --git a/TestON/tests/LinkEventTP/OLDLinkEventTP.py b/TestON/tests/LinkEventTP/OLDLinkEventTP.py
new file mode 100644
index 0000000..e12befa
--- /dev/null
+++ b/TestON/tests/LinkEventTP/OLDLinkEventTP.py
@@ -0,0 +1,348 @@
+# ScaleOutTemplate --> LinkEventTp
+#
+# CASE1 starts number of nodes specified in param file
+#
+# cameron@onlab.us
+
+import sys
+import os
+
+
+class LinkEventTP:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        import os.path
+        global clusterCount
+        clusterCount = 1
+
+        checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
+        gitPull = main.params[ 'GIT' ][ 'autopull' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
+        BENCHUser = main.params[ 'BENCH' ][ 'user' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        flickerRate = main.params[ 'TEST' ][ 'flickerRate']
+        
+
+        main.log.step( "Cleaning Enviornment..." )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+        main.ONOSbench.onosUninstall( ONOS2Ip )
+        main.ONOSbench.onosUninstall( ONOS3Ip )
+
+        main.step( "Git checkout and pull " + checkoutBranch )
+        if gitPull == 'on':
+            checkoutResult = main.ONOSbench.gitCheckout( checkoutBranch )
+            pullResult = main.ONOSbench.gitPull()
+
+        else:
+            checkoutResult = main.TRUE
+            pullResult = main.TRUE
+            main.log.info( "Skipped git checkout and pull" )
+
+        #mvnResult = main.ONOSbench.cleanInstall()
+
+        main.step( "Set cell for ONOS cli env" )
+        main.ONOS1cli.setCell( cellName )
+        main.ONOS2cli.setCell( cellName )
+        main.ONOS3cli.setCell( cellName )
+        
+        ### configuring file to enable flicker ###
+        main.log.info(" Configuring null provider to enable flicker. Flicker Rate = " + flickerRate ) 
+        homeDir = os.path.expanduser('~')
+        main.log.info(homeDir)
+        localPath = "/ONOS/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
+        filePath = homeDir + localPath
+        main.log.info(filePath)
+
+        configFile = open(filePath, 'w+')
+        main.log.info("File opened")
+        configFile.write("# Sample configurations for the NullLinkProvider.\n")
+        configFile.write("# \n")
+        configFile.write("# If enabled, generates LinkDetected and LinkVanished events\n")
+        configFile.write("# to make the link appear to be flapping.\n")
+        configFile.write("#\n")
+        configFile.write("flicker = true\n")
+        configFile.write("#\n")
+        configFile.write("# If enabled, sets the time between LinkEvent generation,\n")
+        configFile.write("# in milliseconds.\n")
+        configFile.write("#\n")
+        configFile.write("eventRate = " + flickerRate)
+        configFile.close()
+        main.log.info("Configuration completed")
+        
+        #############################
+        #config file default topo provider 
+        ###########################
+
+        ### configure deafult topo provider event rate ###??????????????????
+        localPath = main.params[ 'TEST' ][ 'configFile' ]
+        filePath = homeDir + localPath
+        main.log.info(filePath)
+        configFile = open(filePath, 'w+')
+        main.log.info("File Opened")
+        configFile.write("maxEvents = 1\n") 
+        configFile.write("maxIdleMs = 0\n")
+        configFile.write("maxBatchMs = 0\n")
+        main.log.info("File written and closed") 
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()  # no file or directory
+
+        main.step( "Installing ONOS package" )
+        install1Result = main.ONOSbench.onosInstall( node=ONOS1Ip )
+
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        main.step( "Applying cell file to environment" )
+        cellApplyResult = main.ONOSbench.setCell( cellName )
+        main.step( "verify cells" )
+        verifyCellResult = main.ONOSbench.verifyCell()
+
+        main.step( "Set cell for ONOS cli env" )
+        main.ONOS1cli.setCell( cellName )
+
+        cli1 = main.ONOS1cli.startOnosCli( ONOS1Ip )
+
+    def CASE2( self, main ):
+        """
+        Increase number of nodes and initiate CLI
+        """
+        import time
+        global clusterCount
+
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        #ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        #ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        #ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        #ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        scale = int( main.params[ 'SCALE' ] )
+
+        # Cluster size increased everytime the case is defined
+        clusterCount += scale
+
+        main.log.report( "Increasing cluster size to " +
+                         str( clusterCount ) )
+        installResult = main.FALSE
+
+        if scale == 2:
+            if clusterCount == 3:
+                main.log.info( "Installing nodes 2 and 3" )
+                install2Result = main.ONOSbench.onosInstall( node=ONOS2Ip )
+                install3Result = main.ONOSbench.onosInstall( node=ONOS3Ip )
+                cli2 = main.ONOS2cli.startOnosCli( ONOS2Ip )
+                cli3 = main.ONOS3cli.startOnosCli( ONOS3Ip )
+                installResult = main.TRUE 
+              
+        if scale == 1:
+            if clusterCount == 2:
+                main.log.info( "Installing node 2" )
+                install2Result = main.ONOSbench.onosInstall( node=ONOS2Ip )
+                cli2 = main.ONOS2cli.startOnosCli( ONOS2Ip )
+                installResult = main.TRUE 
+
+            if clusterCount == 3:
+                main.log.info( "Installing node 3" )
+                install3Result = main.ONOSbench.onosInstall( node=ONOS3Ip )
+                cli3 = main.ONOS3cli.startOnosCli( ONOS3Ip )
+                installResult = main.TRUE 
+
+
+    def CASE3( self, main ):
+        import time
+        import json
+        import string
+        import csv
+        
+        linkResult = main.FALSE 
+        
+        testDelay = main.params[ 'TEST' ][ 'wait']
+        time.sleep( float( testDelay ) )
+
+        metric1 = main.params[ 'TEST' ][ 'metric1' ]
+        metric2 = main.params[ 'TEST' ][ 'metric2' ]
+        testDuration = main.params[ 'TEST' ][ 'duration' ]
+        stop = time.time() + float( testDuration )
+    
+        main.ONOS1cli.featureInstall("onos-null")
+
+        msg = ( "Starting test loop for " + str(testDuration) + " seconds" )
+        main.log.info( msg )
+        logInterval = main.params[ 'TEST' ][ 'log_interval' ]
+
+        while time.time() < stop:
+            time.sleep( float( logInterval ) )
+
+            JsonStr1 = main.ONOS1cli.topologyEventsMetrics() 
+            JsonObj1 = json.loads( JsonStr1 ) 
+            msg = ( "Node 1 Link Event TP: " + str( JsonObj1[ metric1  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            msg = ( "Node 1 Graph Event TP: " + str( JsonObj1[ metric2  ][ 'm1_rate' ] ) )
+            main.log.info( msg ) 
+            
+            lastGraphRate = round(JsonObj1[ metric2 ][ 'm1_rate' ],2)
+            lastLinkRate = round(JsonObj1[ metric1  ][ 'm1_rate' ],2)
+
+        msg = ( "Final Link Event TP: " + str( lastLinkRate ) ) 
+        main.log.report( msg )
+        msg = ( "Final Graph Event TP: " + str( lastGraphRate ) )
+        main.log.report( msg )
+       
+        linkResult = main.TRUE 
+        '''
+        jenkinsReport = open('LinkEventTP.csv', 'w')
+        jenkinsReport.write("T1 - Node 1, T2 - Node 1, T2 - Node 2, T3 - Node 1, T3 - Node 2, T3 - Node 3\n")
+        jenkinsReport.write(str(lastRate1))
+        jenkinsReport.write("\n")
+        jenkinsReport.close()
+        
+        dbReportS1 = open('LinkEventTP-S1.csv','w')         #must be the name of the test "-S" followed by the scale 
+        dbReportS1.write(str(linkResult))
+        dbReportS1.write("\n")
+        dbReportS1.write(str(lastRate1))
+        dbReportS1.write("\n")                              #additional newline needed for bash script reading
+        dbReportS1.close()
+        '''
+
+
+    def CASE4( self, main ):
+        import time
+        import json
+        import string
+
+        linkResult = main.FALSE
+
+        testDelay = main.params[ 'TEST' ][ 'wait']
+        time.sleep( float( testDelay ) )
+
+        getMetric = main.params[ 'TEST' ][ 'metric1' ]
+        testDuration = main.params[ 'TEST' ][ 'duration' ]
+        stop = time.time() + float( testDuration )
+
+        main.ONOS2cli.featureInstall("onos-null")
+
+        msg = ( "Starting test loop for " + str(testDuration) + " seconds" )
+        main.log.info( msg )
+        logInterval = main.params[ 'TEST' ][ 'log_interval' ]
+
+        while time.time() < stop:
+            time.sleep( float( logInterval ) )
+
+            JsonStr1 = main.ONOS1cli.topologyEventsMetrics() 
+            JsonObj1 = json.loads( JsonStr1 )
+            msg = ( "Node 1 TP: " + str( JsonObj1[ getMetric  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            lastRate1 = round(JsonObj1[ getMetric  ][ 'm1_rate' ],2)
+
+
+            JsonStr2 = main.ONOS2cli.topologyEventsMetrics() 
+            JsonObj2 = json.loads( JsonStr2 )
+            msg = ( "Node 2 TP: " + str( JsonObj2[ getMetric  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            lastRate2 = round(JsonObj2[ getMetric  ][ 'm1_rate' ],2)
+
+
+        msg = ( "Final TP on node 1: " + str( lastRate1 ) )
+        main.log.report( msg )
+
+        msg = ( "Final TP on node 2: " + str( lastRate2 ) )
+        main.log.report( msg )
+
+        linkResult = main.TRUE
+
+        jenkinsReport = open('LinkEventTP.csv', 'a')
+        jenkinsReport.write(str(lastRate1))
+        jenkinsReport.write(", ")
+        jenkinsReport.write(str(lastRate2))
+        jenkinsReport.write(", ")
+        jenkinsReport.close()
+
+        dbReportS2 = open('LinkEventTP-S2.csv','w')         #must be the name of the test "-S" followed by the scale
+        dbReportS2.write(str(linkResult))
+        dbReportS2.write("\n")
+        dbReportS2.write(str(lastRate1))
+        dbReportS2.write("\n")
+        dbReportS2.write(str(lastRate2))
+        dbReportS2.write("\n")
+        dbReportS2.close()
+
+
+
+    def CASE5( self, main ):
+        import time
+        import json
+        import string
+
+        linkResult = main.FALSE
+
+        testDelay = main.params[ 'TEST' ][ 'wait']
+        time.sleep( float( testDelay ) )
+
+        getMetric = main.params[ 'TEST' ][ 'metric1' ]
+        testDuration = main.params[ 'TEST' ][ 'duration' ]
+        stop = time.time() + float( testDuration )
+
+        main.ONOS3cli.featureInstall("onos-null")
+
+        msg = ( "Starting test loop for " + str(testDuration) + " seconds" )
+        main.log.info( msg )
+        logInterval = main.params[ 'TEST' ][ 'log_interval' ]
+
+        while time.time() < stop:
+            time.sleep( float( logInterval ) )
+
+            JsonStr1 = main.ONOS1cli.topologyEventsMetrics()
+            JsonObj1 = json.loads( JsonStr1 )
+            msg = ( "Node 1 TP: " + str( JsonObj1[ getMetric  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            lastRate1 = round(JsonObj1[ getMetric  ][ 'm1_rate' ],2)
+
+            JsonStr2 = main.ONOS2cli.topologyEventsMetrics()
+            JsonObj2 = json.loads( JsonStr2 )
+            msg = ( "Node 2 TP: " + str( JsonObj2[ getMetric  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            lastRate2 = round(JsonObj2[ getMetric  ][ 'm1_rate' ],2)
+    
+            JsonStr3 = main.ONOS3cli.topologyEventsMetrics()
+            JsonObj3 = json.loads( JsonStr3 )
+            msg = ( "Node 3 TP: " + str( JsonObj3[ getMetric  ][ 'm1_rate' ] ) )
+            main.log.info( msg )
+            lastRate3 = round(JsonObj3[ getMetric  ][ 'm1_rate' ],2)
+
+        msg = ( "Final TP on node 1: " + str( lastRate1 ) )
+        main.log.report( msg )
+
+        msg = ( "Final TP on node 2: " + str( lastRate2 ) )
+        main.log.report( msg )
+
+        msg = ( "Final TP on node 3: " + str( lastRate3 ) )
+        main.log.report( msg )
+
+        linkResult = main.TRUE
+
+        jenkinsReport = open('LinkEventTP.csv', 'a')
+        jenkinsReport.write(str(lastRate1))
+        jenkinsReport.write(", ")
+        jenkinsReport.write(str(lastRate2))
+        jenkinsReport.write(", ")
+        jenkinsReport.write(str(lastRate3))
+        jenkinsReport.close()
+       
+        dbReportS3 = open('LinkEventTP-S3.csv','w')         #must be the name of the test "-S" followed by the scale
+        dbReportS3.write(str(linkResult))
+        dbReportS3.write("\n")
+        dbReportS3.write(str(lastRate1))
+        dbReportS3.write("\n")
+        dbReportS3.write(str(lastRate2))
+        dbReportS3.write("\n")
+        dbReportS3.write(str(lastRate3))
+        dbReportS3.write("\n")
+        dbReportS3.close() 
+
+
diff --git a/TestON/tests/LinkEventTP/__init__.pyc b/TestON/tests/LinkEventTP/__init__.pyc
new file mode 100644
index 0000000..5415a7b
--- /dev/null
+++ b/TestON/tests/LinkEventTP/__init__.pyc
Binary files differ
diff --git a/TestON/tests/MultiProd/MultiProd.params b/TestON/tests/MultiProd/MultiProd.params
index 8bf1600..6e5c85e 100755
--- a/TestON/tests/MultiProd/MultiProd.params
+++ b/TestON/tests/MultiProd/MultiProd.params
@@ -1,6 +1,6 @@
 <PARAMS>
     
-    <testcases>1,4,10,5,6,7,8,6,8,9,31,32,8,33</testcases>    
+    <testcases>1,4,10,5,6,7,8,6,8,9,8,31,32,8,33,8</testcases>    
 
     #Environment variables
     <ENV>
diff --git a/TestON/tests/MultiProd/MultiProd.py b/TestON/tests/MultiProd/MultiProd.py
index 6b67f63..52519d8 100644
--- a/TestON/tests/MultiProd/MultiProd.py
+++ b/TestON/tests/MultiProd/MultiProd.py
@@ -11,7 +11,6 @@
 
 time.sleep( 1 )
 
-
 class MultiProd:
 
     def __init__( self ):
@@ -29,13 +28,13 @@
         onos-install -f
         onos-wait-for-start
         """
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS1_port = main.params[ 'CTRL' ][ 'port1' ]
-        ONOS2_port = main.params[ 'CTRL' ][ 'port2' ]
-        ONOS3_port = main.params[ 'CTRL' ][ 'port3' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+        ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
 
         main.case( "Setting up test environment" )
         main.log.report(
@@ -43,190 +42,199 @@
         main.log.report( "__________________________________" )
 
         main.step( "Applying cell variable to environment" )
-        cell_result1 = main.ONOSbench.set_cell( cell_name )
-        #cell_result2 = main.ONOScli1.set_cell( cell_name )
-        #cell_result3 = main.ONOScli2.set_cell( cell_name )
-        #cell_result4 = main.ONOScli3.set_cell( cell_name )
-        verify_result = main.ONOSbench.verify_cell()
-        cell_result = cell_result1
+        cellResult1 = main.ONOSbench.setCell( cellName )
+        # cellResult2 = main.ONOScli1.setCell( cellName )
+        # cellResult3 = main.ONOScli2.setCell( cellName )
+        # cellResult4 = main.ONOScli3.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
+        cellResult = cellResult1
 
         main.step( "Removing raft logs before a clen installation of ONOS" )
-        remove_log_Result = main.ONOSbench.onos_remove_raft_logs()
+        removeLogResult = main.ONOSbench.onosRemoveRaftLogs()
 
-        main.step( "Git checkout and pull master and get version" )
-        main.ONOSbench.git_checkout( "master" )
-        git_pull_result = main.ONOSbench.git_pull()
-        print "git_pull_result = ", git_pull_result
-        version_result = main.ONOSbench.get_version( report=True )
+        main.step( "Git checkout, pull and get version" )
+        #main.ONOSbench.gitCheckout( "master" )
+        gitPullResult = main.ONOSbench.gitPull()
+        main.log.info( "git_pull_result = " + str( gitPullResult ))
+        versionResult = main.ONOSbench.getVersion( report=True )
 
-        if git_pull_result == 1:
+        if gitPullResult == 1:
             main.step( "Using mvn clean & install" )
-            clean_install_result = main.ONOSbench.clean_install()
-            #clean_install_result = main.TRUE
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+            # cleanInstallResult = main.TRUE
 
         main.step( "Creating ONOS package" )
-        package_result = main.ONOSbench.onos_package()
+        packageResult = main.ONOSbench.onosPackage()
 
-        #main.step( "Creating a cell" )
-        # cell_create_result = main.ONOSbench.create_cell_file( **************
+        # main.step( "Creating a cell" )
+        # cellCreateResult = main.ONOSbench.createCellFile( **************
         # )
 
         main.step( "Installing ONOS package" )
-        onos1_install_result = main.ONOSbench.onos_install(
+        onos1InstallResult = main.ONOSbench.onosInstall(
             options="-f",
-            node=ONOS1_ip )
-        onos2_install_result = main.ONOSbench.onos_install(
+            node=ONOS1Ip )
+        onos2InstallResult = main.ONOSbench.onosInstall(
             options="-f",
-            node=ONOS2_ip )
-        onos3_install_result = main.ONOSbench.onos_install(
+            node=ONOS2Ip )
+        onos3InstallResult = main.ONOSbench.onosInstall(
             options="-f",
-            node=ONOS3_ip )
-        onos_install_result = onos1_install_result and onos2_install_result and onos3_install_result
-        if onos_install_result == main.TRUE:
+            node=ONOS3Ip )
+        onosInstallResult = onos1InstallResult and onos2InstallResult and\
+                onos3InstallResult
+        if onosInstallResult == main.TRUE:
             main.log.report( "Installing ONOS package successful" )
         else:
             main.log.report( "Installing ONOS package failed" )
 
-        onos1_isup = main.ONOSbench.isup( ONOS1_ip )
-        onos2_isup = main.ONOSbench.isup( ONOS2_ip )
-        onos3_isup = main.ONOSbench.isup( ONOS3_ip )
-        onos_isup = onos1_isup and onos2_isup and onos3_isup
-        if onos_isup == main.TRUE:
+        onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+        onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+        onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+        onosIsup = onos1Isup and onos2Isup and onos3Isup
+        if onosIsup == main.TRUE:
             main.log.report( "ONOS instances are up and ready" )
         else:
             main.log.report( "ONOS instances may not be up" )
 
         main.step( "Starting ONOS service" )
-        start_result = main.TRUE
-        #start_result = main.ONOSbench.onos_start( ONOS1_ip )
-        startcli1 = main.ONOScli1.start_onos_cli( ONOS_ip=ONOS1_ip )
-        startcli2 = main.ONOScli2.start_onos_cli( ONOS_ip=ONOS2_ip )
-        startcli3 = main.ONOScli3.start_onos_cli( ONOS_ip=ONOS3_ip )
+        startResult = main.TRUE
+        # startResult = main.ONOSbench.onosStart( ONOS1Ip )
+        startcli1 = main.ONOScli1.startOnosCli( ONOSIp=ONOS1Ip )
+        startcli2 = main.ONOScli2.startOnosCli( ONOSIp=ONOS2Ip )
+        startcli3 = main.ONOScli3.startOnosCli( ONOSIp=ONOS3Ip )
         print startcli1
         print startcli2
         print startcli3
 
-        case1_result = ( package_result and
-                         cell_result and verify_result and onos_install_result and
-                         onos_isup and start_result )
-        utilities.assert_equals( expect=main.TRUE, actual=case1_result,
-                                 onpass="Test startup successful",
-                                 onfail="Test startup NOT successful" )
+        # Starting the mininet using the old way
+        main.step( "Starting Mininet ..." )
+        netIsUp = main.Mininet1.startNet()
+        if netIsUp:
+            main.log.info("Mininet CLI is up")
+
+        case1Result = ( packageResult and
+                        cellResult and verifyResult and onosInstallResult and
+                        onosIsup and startResult )
+        utilities.assertEquals( expect=main.TRUE, actual=case1Result,
+                                onpass="Test startup successful",
+                                onfail="Test startup NOT successful" )
 
     def CASE11( self, main ):
         """
         Cleanup sequence:
-        onos-service <node_ip> stop
+        onos-service <nodeIp> stop
         onos-uninstall
 
         TODO: Define rest of cleanup
 
         """
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
 
         main.case( "Cleaning up test environment" )
 
         main.step( "Testing ONOS kill function" )
-        kill_result1 = main.ONOSbench.onos_kill( ONOS1_ip )
-        kill_result2 = main.ONOSbench.onos_kill( ONOS2_ip )
-        kill_result3 = main.ONOSbench.onos_kill( ONOS3_ip )
+        killResult1 = main.ONOSbench.onosKill( ONOS1Ip )
+        killResult2 = main.ONOSbench.onosKill( ONOS2Ip )
+        killResult3 = main.ONOSbench.onosKill( ONOS3Ip )
 
         main.step( "Stopping ONOS service" )
-        stop_result1 = main.ONOSbench.onos_stop( ONOS1_ip )
-        stop_result2 = main.ONOSbench.onos_stop( ONOS2_ip )
-        stop_result3 = main.ONOSbench.onos_stop( ONOS3_ip )
+        stopResult1 = main.ONOSbench.onosStop( ONOS1Ip )
+        stopResult2 = main.ONOSbench.onosStop( ONOS2Ip )
+        stopResult3 = main.ONOSbench.onosStop( ONOS3Ip )
 
         main.step( "Uninstalling ONOS service" )
-        uninstall_result = main.ONOSbench.onos_uninstall()
+        uninstallResult = main.ONOSbench.onosUninstall()
 
     def CASE3( self, main ):
         """
         Test 'onos' command and its functionality in driver
         """
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
 
         main.case( "Testing 'onos' command" )
 
         main.step( "Sending command 'onos -w <onos-ip> system:name'" )
         cmdstr1 = "system:name"
-        cmd_result1 = main.ONOSbench.onos_cli( ONOS1_ip, cmdstr1 )
-        main.log.info( "onos command returned: " + cmd_result1 )
-        cmd_result2 = main.ONOSbench.onos_cli( ONOS2_ip, cmdstr1 )
-        main.log.info( "onos command returned: " + cmd_result2 )
-        cmd_result3 = main.ONOSbench.onos_cli( ONOS3_ip, cmdstr1 )
-        main.log.info( "onos command returned: " + cmd_result3 )
+        cmdResult1 = main.ONOSbench.onosCli( ONOS1Ip, cmdstr1 )
+        main.log.info( "onos command returned: " + cmdResult1 )
+        cmdResult2 = main.ONOSbench.onosCli( ONOS2Ip, cmdstr1 )
+        main.log.info( "onos command returned: " + cmdResult2 )
+        cmdResult3 = main.ONOSbench.onosCli( ONOS3Ip, cmdstr1 )
+        main.log.info( "onos command returned: " + cmdResult3 )
 
         main.step( "Sending command 'onos -w <onos-ip> onos:topology'" )
         cmdstr2 = "onos:topology"
-        cmd_result4 = main.ONOSbench.onos_cli( ONOS1_ip, cmdstr2 )
-        main.log.info( "onos command returned: " + cmd_result4 )
-        cmd_result5 = main.ONOSbench.onos_cli( ONOS2_ip, cmdstr2 )
-        main.log.info( "onos command returned: " + cmd_result5 )
-        cmd_result6 = main.ONOSbench.onos_cli( ONOS6_ip, cmdstr2 )
-        main.log.info( "onos command returned: " + cmd_result6 )
+        cmdResult4 = main.ONOSbench.onosCli( ONOS1Ip, cmdstr2 )
+        main.log.info( "onos command returned: " + cmdResult4 )
+        cmdResult5 = main.ONOSbench.onosCli( ONOS2Ip, cmdstr2 )
+        main.log.info( "onos command returned: " + cmdResult5 )
+        cmdResult6 = main.ONOSbench.onosCli( ONOS6Ip, cmdstr2 )
+        main.log.info( "onos command returned: " + cmdResult6 )
 
     def CASE4( self, main ):
         import re
         import time
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS1_port = main.params[ 'CTRL' ][ 'port1' ]
-        ONOS2_port = main.params[ 'CTRL' ][ 'port2' ]
-        ONOS3_port = main.params[ 'CTRL' ][ 'port3' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+        ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
 
         main.log.report(
-            "This testcase is testing the assignment of all the switches to all controllers and discovering the hosts in reactive mode" )
+            "This testcase is testing the assignment of all the switches" +
+            " to all controllers and discovering the hosts in reactive mode" )
         main.log.report( "__________________________________" )
         main.case( "Pingall Test(No intents are added)" )
         main.step( "Assigning switches to controllers" )
         for i in range( 1, 29 ):  # 1 to ( num of switches +1 )
-            main.Mininet1.assign_sw_controller(
+            main.Mininet1.assignSwController(
                 sw=str( i ),
                 count=3,
-                ip1=ONOS1_ip,
-                port1=ONOS1_port,
-                ip2=ONOS2_ip,
-                port2=ONOS2_port,
-                ip3=ONOS3_ip,
-                port3=ONOS3_port )
+                ip1=ONOS1Ip,
+                port1=ONOS1Port,
+                ip2=ONOS2Ip,
+                port2=ONOS2Port,
+                ip3=ONOS3Ip,
+                port3=ONOS3Port )
 
-        switch_mastership = main.TRUE
+        switchMastership = main.TRUE
         for i in range( 1, 29 ):
-            response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+            response = main.Mininet1.getSwController( "s" + str( i ) )
             print( "Response is " + str( response ) )
-            if re.search( "tcp:" + ONOS1_ip, response ):
-                switch_mastership = switch_mastership and main.TRUE
+            if re.search( "tcp:" + ONOS1Ip, response ):
+                switchMastership = switchMastership and main.TRUE
             else:
-                switch_mastership = main.FALSE
+                switchMastership = main.FALSE
 
-        if switch_mastership == main.TRUE:
+        if switchMastership == main.TRUE:
             main.log.report( "Controller assignment successfull" )
         else:
             main.log.report( "Controller assignment failed" )
         # REACTIVE FWD test
         main.step( "Pingall" )
-        ping_result = main.FALSE
+        pingResult = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall()
         time2 = time.time()
         print "Time for pingall: %2f seconds" % ( time2 - time1 )
 
-        case4_result = switch_mastership and ping_result
-        if ping_result == main.TRUE:
+        case4Result = switchMastership and pingResult
+        if pingResult == main.TRUE:
             main.log.report(
-                "Pingall Test in reactive mode to discover the hosts successful" )
+                "Pingall Test in reactive mode to" +
+                " discover the hosts successful" )
         else:
             main.log.report(
                 "Pingall Test in reactive mode to discover the hosts failed" )
 
-        utilities.assert_equals(
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case4_result,
+            actual=case4Result,
             onpass="Controller assignment and Pingall Test successful",
             onfail="Controller assignment and Pingall Test NOT successful" )
 
@@ -235,15 +243,17 @@
         from subprocess import Popen, PIPE
         # assumes that sts is already in you PYTHONPATH
         from sts.topology.teston_topology import TestONTopology
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
 
         main.log.report(
-            "This testcase is testing if all ONOS nodes are in topology sync with mininet and its peer ONOS nodes" )
+            "This testcase is testing if all ONOS nodes are in topologyi" +
+            " sync with mininet and its peer ONOS nodes" )
         main.log.report( "__________________________________" )
         main.case(
-            "Testing Mininet topology with the topology of multi instances ONOS" )
+            "Testing Mininet topology with the" +
+            " topology of multi instances ONOS" )
         main.step( "Collecting topology information from ONOS" )
         devices1 = main.ONOScli1.devices()
         devices2 = main.ONOScli2.devices()
@@ -336,85 +346,91 @@
             ctrls )  # can also add Intent API info for intent operations
         MNTopo = Topo
 
-        Topology_Check = main.TRUE
+        TopologyCheck = main.TRUE
         main.step( "Compare ONOS Topology to MN Topology" )
 
-        switches_results1 = main.Mininet1.compare_switches(
+        switchesResults1 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices1 ) )
-        print "switches_Result1 = ", switches_results1
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results1,
-                                 onpass="ONOS1 Switches view is correct",
-                                 onfail="ONOS1 Switches view is incorrect" )
+        print "switches_Result1 = ", switchesResults1
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults1,
+                                onpass="ONOS1 Switches view is correct",
+                                onfail="ONOS1 Switches view is incorrect" )
 
-        switches_results2 = main.Mininet1.compare_switches(
+        switchesResults2 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results2,
-                                 onpass="ONOS2 Switches view is correct",
-                                 onfail="ONOS2 Switches view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults2,
+                                onpass="ONOS2 Switches view is correct",
+                                onfail="ONOS2 Switches view is incorrect" )
 
-        switches_results3 = main.Mininet1.compare_switches(
+        switchesResults3 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results3,
-                                 onpass="ONOS3 Switches view is correct",
-                                 onfail="ONOS3 Switches view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults3,
+                                onpass="ONOS3 Switches view is correct",
+                                onfail="ONOS3 Switches view is incorrect" )
 
         """
-        ports_results1 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports1 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results1,
+        portsResults1 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports1 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults1,
                 onpass="ONOS1 Ports view is correct",
                 onfail="ONOS1 Ports view is incorrect" )
 
-        ports_results2 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results2,
+        portsResults2 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports2 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults2,
                 onpass="ONOS2 Ports view is correct",
                 onfail="ONOS2 Ports view is incorrect" )
 
-        ports_results3 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results3,
+        portsResults3 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports3 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults3,
                 onpass="ONOS3 Ports view is correct",
                 onfail="ONOS3 Ports view is incorrect" )
         """
-        links_results1 = main.Mininet1.compare_links(
+        linksResults1 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links1 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results1,
-                                 onpass="ONOS1 Links view is correct",
-                                 onfail="ONOS1 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults1,
+                                onpass="ONOS1 Links view is correct",
+                                onfail="ONOS1 Links view is incorrect" )
 
-        links_results2 = main.Mininet1.compare_links(
+        linksResults2 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results2,
-                                 onpass="ONOS2 Links view is correct",
-                                 onfail="ONOS2 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults2,
+                                onpass="ONOS2 Links view is correct",
+                                onfail="ONOS2 Links view is incorrect" )
 
-        links_results3 = main.Mininet1.compare_links(
+        linksResults3 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results3,
-                                 onpass="ONOS2 Links view is correct",
-                                 onfail="ONOS2 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults3,
+                                onpass="ONOS2 Links view is correct",
+                                onfail="ONOS2 Links view is incorrect" )
 
-        #topo_result = switches_results1 and switches_results2 and switches_results3\
-        # and ports_results1 and ports_results2 and ports_results3\
-        # and links_results1 and links_results2 and links_results3
+        # topoResult = switchesResults1 and switchesResults2
+        # and switchesResults3\
+        # and portsResults1 and portsResults2 and portsResults3\
+        # and linksResults1 and linksResults2 and linksResults3
 
-        topo_result = switches_results1 and switches_results2 and switches_results3\
-            and links_results1 and links_results2 and links_results3
+        topoResult = switchesResults1 and switchesResults2 and\
+                     switchesResults3 and linksResults1 and linksResults2 and\
+                     linksResults3
 
-        if topo_result == main.TRUE:
+        if topoResult == main.TRUE:
             main.log.report(
-                "Topology Check Test with mininet and ONOS instances successful" )
+                "Topology Check Test with mininet" +
+                "and ONOS instances successful" )
         else:
             main.log.report(
                 "Topology Check Test with mininet and ONOS instances failed" )
 
-        utilities.assert_equals( expect=main.TRUE, actual=topo_result,
-                                 onpass="Topology Check Test successful",
-                                 onfail="Topology Check Test NOT successful" )
+        utilities.assertEquals( expect=main.TRUE, actual=topoResult,
+                                onpass="Topology Check Test successful",
+                                onfail="Topology Check Test NOT successful" )
 
     def CASE10( self ):
         main.log.report(
@@ -422,31 +438,34 @@
         main.log.report( "__________________________________" )
         main.case( "Uninstalling reactive forwarding app" )
         # Unistall onos-app-fwd app to disable reactive forwarding
-        appUninstall_result1 = main.ONOScli1.feature_uninstall(
+        appUninstallResult1 = main.ONOScli1.featureUninstall(
             "onos-app-fwd" )
-        appUninstall_result2 = main.ONOScli2.feature_uninstall(
+        appUninstallResult2 = main.ONOScli2.featureUninstall(
             "onos-app-fwd" )
-        appUninstall_result3 = main.ONOScli3.feature_uninstall(
+        appUninstallResult3 = main.ONOScli3.featureUninstall(
             "onos-app-fwd" )
         main.log.info( "onos-app-fwd uninstalled" )
 
-        # After reactive forwarding is disabled, the reactive flows on switches timeout in 10-15s
+        # After reactive forwarding is disabled,
+        # the reactive flows on switches timeout in 10-15s
         # So sleep for 15s
         time.sleep( 15 )
 
         hosts = main.ONOScli1.hosts()
         main.log.info( hosts )
 
-        case10_result = appUninstall_result1 and appUninstall_result2 and appUninstall_result3
-        utilities.assert_equals(
+        case10Result = appUninstallResult1 and\
+                appUninstallResult2 and appUninstallResult3
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case10_result,
+            actual=case10Result,
             onpass="Reactive forwarding app uninstallation successful",
             onfail="Reactive forwarding app uninstallation failed" )
 
     def CASE6( self ):
         main.log.report(
-            "This testcase is testing the addition of host intents and then doing pingall" )
+            "This testcase is testing the addition of" +
+            " host intents and then doing pingall" )
         main.log.report( "__________________________________" )
         main.case( "Obtaining hostsfor adding host intents" )
         main.step( "Get hosts" )
@@ -454,45 +473,57 @@
         main.log.info( hosts )
 
         main.step( "Get all devices id" )
-        devices_id_list = main.ONOScli1.get_all_devices_id()
-        main.log.info( devices_id_list )
+        devicesIdList = main.ONOScli1.getAllDevicesId()
+        main.log.info( devicesIdList )
 
-        # ONOS displays the hosts in hex format unlike mininet which does in decimal format
+        # ONOS displays the hosts in hex format
+        # unlike mininet which does in decimal format
         # So take care while adding intents
 
         """
-        main.step( "Add host intents for mn hosts(h8-h18,h9-h19,h10-h20,h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:08/-1", "00:00:00:00:00:12/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:09/-1", "00:00:00:00:00:13/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0A/-1", "00:00:00:00:00:14/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0B/-1", "00:00:00:00:00:15/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0C/-1", "00:00:00:00:00:16/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0D/-1", "00:00:00:00:00:17/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0E/-1", "00:00:00:00:00:18/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0F/-1", "00:00:00:00:00:19/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:10/-1", "00:00:00:00:00:1A/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:11/-1", "00:00:00:00:00:1B/-1" )
+        main.step( "Add host intents for mn hosts(h8-h18,h9-h19,h10-h20,
+        h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:08/-1",
+        "00:00:00:00:00:12/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:09/-1",
+        "00:00:00:00:00:13/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0A/-1",
+        "00:00:00:00:00:14/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0B/-1",
+        "00:00:00:00:00:15/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0C/-1",
+        "00:00:00:00:00:16/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0D/-1",
+        "00:00:00:00:00:17/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0E/-1",
+        "00:00:00:00:00:18/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0F/-1",
+        "00:00:00:00:00:19/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:10/-1",
+        "00:00:00:00:00:1A/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:11/-1",
+        "00:00:00:00:00:1B/-1" )
         """
         for i in range( 8, 18 ):
             main.log.info(
-                "Adding host intent between h" + str( i ) + " and h" + str( i + 10 ) )
+                "Adding host intent between h" + str( i ) +
+                " and h" + str( i + 10 ) )
             host1 = "00:00:00:00:00:" + \
                 str( hex( i )[ 2: ] ).zfill( 2 ).upper()
             host2 = "00:00:00:00:00:" + \
                 str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
             # NOTE: get host can return None
             # TODO: handle this
-            host1_id = main.ONOScli1.get_host( host1 )[ 'id' ]
-            host2_id = main.ONOScli1.get_host( host2 )[ 'id' ]
-            tmp_result = main.ONOScli1.add_host_intent( host1_id, host2_id )
+            host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
+            host2Id = main.ONOScli1.getHost( host2 )[ 'id' ]
+            tmpResult = main.ONOScli1.addHostIntent( host1Id, host2Id )
 
         flowHandle = main.ONOScli1.flows()
-        # print "flowHandle = ", flowHandle
         main.log.info( "flows:" + flowHandle )
 
         count = 1
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         while i < 18:
             main.log.info(
                 "\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
@@ -500,8 +531,8 @@
                 src="h" + str( i ), target="h" + str( i + 10 ) )
             if ping == main.FALSE and count < 5:
                 count += 1
-                #i = 8
-                Ping_Result = main.FALSE
+                # i = 8
+                PingResult = main.FALSE
                 main.log.report( "Ping between h" +
                                  str( i ) +
                                  " and h" +
@@ -519,7 +550,7 @@
                                       10 ) +
                                  "have failed" )
                 i = 19
-                Ping_Result = main.FALSE
+                PingResult = main.FALSE
             elif ping == main.TRUE:
                 main.log.info( "Ping test between h" +
                                str( i ) +
@@ -528,36 +559,38 @@
                                     10 ) +
                                "passed!" )
                 i += 1
-                Ping_Result = main.TRUE
+                PingResult = main.TRUE
             else:
                 main.log.info( "Unknown error" )
-                Ping_Result = main.ERROR
-        if Ping_Result == main.FALSE:
+                PingResult = main.ERROR
+        if PingResult == main.FALSE:
             main.log.report(
                 "Host intents have not ben installed correctly. Cleaning up" )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report( "Host intents have been installed correctly" )
 
-        case6_result = Ping_Result
-        utilities.assert_equals(
+        case6Result = PingResult
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case6_result,
+            actual=case6Result,
             onpass="Host intent addition and Pingall Test successful",
             onfail="Host intent addition and Pingall Test NOT successful" )
 
     def CASE7( self, main ):
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
 
-        link_sleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
+        linkSleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
         main.log.report(
-            "This testscase is killing a link to ensure that link discovery is consistent" )
+            "This testscase is killing a link to" +
+            " ensure that link discovery is consistent" )
         main.log.report( "__________________________________" )
         main.case(
-            "Killing a link to Ensure that Link Discovery is Working Properly" )
+            "Killing a link to Ensure that Link" +
+            " Discovery is Working Properly" )
         main.step( "Start continuous pings" )
 
         main.Mininet2.pingLong(
@@ -602,10 +635,10 @@
             pingTime=500 )
 
         main.step( "Determine the current number of switches and links" )
-        topology_output = main.ONOScli1.topology()
-        topology_result = main.ONOSbench.get_topology( topology_output )
-        activeSwitches = topology_result[ 'devices' ]
-        links = topology_result[ 'links' ]
+        topologyOutput = main.ONOScli1.topology()
+        topologyResult = main.ONOSbench.getTopology( topologyOutput )
+        activeSwitches = topologyResult[ 'devices' ]
+        links = topologyResult[ 'links' ]
         print "activeSwitches = ", type( activeSwitches )
         print "links = ", type( links )
         main.log.info(
@@ -614,42 +647,43 @@
 
         main.step( "Kill Link between s3 and s28" )
         main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
-        time.sleep( link_sleep )
-        topology_output = main.ONOScli2.topology()
-        Link_Down = main.ONOSbench.check_status(
-            topology_output, activeSwitches, str(
+        time.sleep( linkSleep )
+        topologyOutput = main.ONOScli2.topology()
+        LinkDown = main.ONOSbench.checkStatus(
+            topologyOutput, activeSwitches, str(
                 int( links ) - 2 ) )
-        if Link_Down == main.TRUE:
+        if LinkDown == main.TRUE:
             main.log.report( "Link Down discovered properly" )
-        utilities.assert_equals(
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=Link_Down,
+            actual=LinkDown,
             onpass="Link Down discovered properly",
             onfail="Link down was not discovered in " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " seconds" )
 
         main.step( "Bring link between s3 and s28 back up" )
-        Link_Up = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
-        time.sleep( link_sleep )
-        topology_output = main.ONOScli2.topology()
-        Link_Up = main.ONOSbench.check_status(
-            topology_output,
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
+        time.sleep( linkSleep )
+        topologyOutput = main.ONOScli2.topology()
+        LinkUp = main.ONOSbench.checkStatus(
+            topologyOutput,
             activeSwitches,
             str( links ) )
-        if Link_Up == main.TRUE:
+        if LinkUp == main.TRUE:
             main.log.report( "Link up discovered properly" )
-        utilities.assert_equals(
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=Link_Up,
+            actual=LinkUp,
             onpass="Link up discovered properly",
             onfail="Link up was not discovered in " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " seconds" )
 
         main.step( "Compare ONOS Topology to MN Topology" )
         main.case(
-            "Testing Mininet topology with the topology of multi instances ONOS" )
+            "Testing Mininet topology with the" +
+            " topology of multi instances ONOS" )
         main.step( "Collecting topology information from ONOS" )
         devices1 = main.ONOScli1.devices()
         devices2 = main.ONOScli2.devices()
@@ -742,78 +776,83 @@
             ctrls )  # can also add Intent API info for intent operations
         MNTopo = Topo
 
-        Topology_Check = main.TRUE
+        TopologyCheck = main.TRUE
         main.step( "Compare ONOS Topology to MN Topology" )
 
-        switches_results1 = main.Mininet1.compare_switches(
+        switchesResults1 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices1 ) )
-        print "switches_Result1 = ", switches_results1
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results1,
-                                 onpass="ONOS1 Switches view is correct",
-                                 onfail="ONOS1 Switches view is incorrect" )
+        print "switches_Result1 = ", switchesResults1
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults1,
+                                onpass="ONOS1 Switches view is correct",
+                                onfail="ONOS1 Switches view is incorrect" )
 
-        switches_results2 = main.Mininet1.compare_switches(
+        switchesResults2 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results2,
-                                 onpass="ONOS2 Switches view is correct",
-                                 onfail="ONOS2 Switches view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults2,
+                                onpass="ONOS2 Switches view is correct",
+                                onfail="ONOS2 Switches view is incorrect" )
 
-        switches_results3 = main.Mininet1.compare_switches(
+        switchesResults3 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results3,
-                                 onpass="ONOS3 Switches view is correct",
-                                 onfail="ONOS3 Switches view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults3,
+                                onpass="ONOS3 Switches view is correct",
+                                onfail="ONOS3 Switches view is incorrect" )
 
         """
-        ports_results1 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports1 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results1,
+        portsResults1 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports1 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults1,
                 onpass="ONOS1 Ports view is correct",
                 onfail="ONOS1 Ports view is incorrect" )
 
-        ports_results2 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results2,
+        portsResults2 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports2 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults2,
                 onpass="ONOS2 Ports view is correct",
                 onfail="ONOS2 Ports view is incorrect" )
 
-        ports_results3 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results3,
+        portsResults3 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports3 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults3,
                 onpass="ONOS3 Ports view is correct",
                 onfail="ONOS3 Ports view is incorrect" )
         """
-        links_results1 = main.Mininet1.compare_links(
+        linksResults1 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links1 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results1,
-                                 onpass="ONOS1 Links view is correct",
-                                 onfail="ONOS1 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults1,
+                                onpass="ONOS1 Links view is correct",
+                                onfail="ONOS1 Links view is incorrect" )
 
-        links_results2 = main.Mininet1.compare_links(
+        linksResults2 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results2,
-                                 onpass="ONOS2 Links view is correct",
-                                 onfail="ONOS2 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults2,
+                                onpass="ONOS2 Links view is correct",
+                                onfail="ONOS2 Links view is incorrect" )
 
-        links_results3 = main.Mininet1.compare_links(
+        linksResults3 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results3,
-                                 onpass="ONOS2 Links view is correct",
-                                 onfail="ONOS2 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults3,
+                                onpass="ONOS2 Links view is correct",
+                                onfail="ONOS2 Links view is incorrect" )
 
-        #topo_result = switches_results1 and switches_results2 and switches_results3\
-        # and ports_results1 and ports_results2 and ports_results3\
-        # and links_results1 and links_results2 and links_results3
+        # topoResult = switchesResults1 and switchesResults2
+        # and switchesResults3\
+        # and portsResults1 and portsResults2 and portsResults3\
+        # and linksResults1 and linksResults2 and linksResults3
 
-        topo_result = switches_results1 and switches_results2 and switches_results3\
-            and links_results1 and links_results2 and links_results3
+        topoResult = switchesResults1 and switchesResults2\
+                and switchesResults3 and linksResults1 and\
+                linksResults2 and linksResults3
 
-        utilities.assert_equals(
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=topo_result and Link_Up and Link_Down,
+            actual=topoResult and LinkUp and LinkDown,
             onpass="Topology Check Test successful",
             onfail="Topology Check Test NOT successful" )
 
@@ -822,16 +861,16 @@
         Intent removal
         """
         main.log.report(
-            "This testcase removes host any previously added intents" )
+            "This testcase removes any previously added intents" )
         main.log.report( "__________________________________" )
         main.log.info( "Removing any previously installed intents" )
         main.case( "Removing intents" )
         main.step( "Obtain the intent id's" )
-        intent_result = main.ONOScli1.intents( json_format=False )
+        intentResult = main.ONOScli1.intents( jsonFormat=False )
 
-        intent_linewise = intent_result.split( "\n" )
+        intentLinewise = intentResult.split( "\n" )
         intentList = []
-        for line in intent_linewise:
+        for line in intentLinewise:
             if line.startswith( "id=" ):
                 intentList.append( line )
 
@@ -844,14 +883,14 @@
         main.step(
             "Iterate through the intentids list and remove each intent" )
         for id in intentids:
-            main.ONOScli1.remove_intent( intent_id=id )
+            main.ONOScli1.removeIntent( intentId=id )
 
-        intent_result = main.ONOScli1.intents( json_format=False )
-        main.log.info( "intent_result = " + intent_result )
-        case8_result = main.TRUE
+        intentResult = main.ONOScli1.intents( jsonFormat=False )
+        main.log.info( "intent_result = " + intentResult )
+        case8Result = main.TRUE
 
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         while i < 18:
             main.log.info(
                 "\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
@@ -859,227 +898,241 @@
                 src="h" + str( i ), target="h" + str( i + 10 ) )
             if ping == main.TRUE:
                 i = 19
-                Ping_Result = main.TRUE
+                PingResult = main.TRUE
             elif ping == main.FALSE:
                 i += 1
-                Ping_Result = main.FALSE
+                PingResult = main.FALSE
             else:
                 main.log.info( "Unknown error" )
-                Ping_Result = main.ERROR
+                PingResult = main.ERROR
 
         # Note: If the ping result failed, that means the intents have been
         # withdrawn correctly.
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report( "Host intents have not been withdrawn correctly" )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.FALSE:
+        if PingResult == main.FALSE:
             main.log.report( "Host intents have been withdrawn correctly" )
 
-        case8_result = case8_result and Ping_Result
+        case8Result = case8Result and PingResult
 
-        if case8_result == main.FALSE:
+        if case8Result == main.FALSE:
             main.log.report( "Intent removal successful" )
         else:
             main.log.report( "Intent removal failed" )
 
-        utilities.assert_equals( expect=main.FALSE, actual=case8_result,
-                                 onpass="Intent removal test failed",
-                                 onfail="Intent removal test successful" )
+        utilities.assertEquals( expect=main.FALSE, actual=case8Result,
+                                onpass="Intent removal test failed",
+                                onfail="Intent removal test successful" )
 
     def CASE9( self ):
         """
-        This test case adds point intents. Make sure you run test case 8 which is host intent removal before executing this test case.
-        Else the host intent's flows will persist on switches and the pings would work even if there is some issue with the point intent's flows
+        This test case adds point intents. Make sure you run test case 8
+        which is host intent removal before executing this test case.
+        Else the host intent's flows will persist on switches and the pings
+        would work even if there is some issue with the point intent's flows
         """
         main.log.report(
             "This testcase adds point intents and then does pingall" )
         main.log.report( "__________________________________" )
         main.log.info( "Adding point intents" )
         main.case(
-            "Adding bidirectional point for mn hosts(h8-h18,h9-h19,h10-h20,h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
+            "Adding bidirectional point for mn hosts(h8-h18,h9-h19,h10-h20," +
+            "h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
         main.step(
-            "Add point-to-point intents for mininet hosts h8 and h18 or ONOS hosts h8 and h12" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts" +
+            " h8 and h18 or ONOS hosts h8 and h12" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003008/1",
             "of:0000000000006018/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006018/1",
             "of:0000000000003008/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h9 and h19 or ONOS hosts h9 and h13" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts" +
+            " h9 and h19 or ONOS hosts h9 and h13" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003009/1",
             "of:0000000000006019/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006019/1",
             "of:0000000000003009/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h10 and h20 or ONOS hosts hA and h14" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet" +
+            " hosts h10 and h20 or ONOS hosts hA and h14" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003010/1",
             "of:0000000000006020/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006020/1",
             "of:0000000000003010/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h11 and h21 or ONOS hosts hB and h15" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet" +
+            " hosts h11 and h21 or ONOS hosts hB and h15" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003011/1",
             "of:0000000000006021/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006021/1",
             "of:0000000000003011/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h12 and h22 or ONOS hosts hC and h16" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet" +
+            " hosts h12 and h22 or ONOS hosts hC and h16" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003012/1",
             "of:0000000000006022/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006022/1",
             "of:0000000000003012/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h13 and h23 or ONOS hosts hD and h17" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet " +
+            "hosts h13 and h23 or ONOS hosts hD and h17" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003013/1",
             "of:0000000000006023/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006023/1",
             "of:0000000000003013/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h14 and h24 or ONOS hosts hE and h18" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts" +
+            " h14 and h24 or ONOS hosts hE and h18" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003014/1",
             "of:0000000000006024/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006024/1",
             "of:0000000000003014/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h15 and h25 or ONOS hosts hF and h19" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts" +
+            " h15 and h25 or ONOS hosts hF and h19" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003015/1",
             "of:0000000000006025/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006025/1",
             "of:0000000000003015/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h16 and h26 or ONOS hosts h10 and h1A" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts" +
+            " h16 and h26 or ONOS hosts h10 and h1A" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003016/1",
             "of:0000000000006026/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006026/1",
             "of:0000000000003016/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h17 and h27 or ONOS hosts h11 and h1B" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts h17" +
+            " and h27 or ONOS hosts h11 and h1B" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003017/1",
             "of:0000000000006027/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006027/1",
             "of:0000000000003017/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         print(
-            "_______________________________________________________________________________________" )
+            "_______________________________________________________" +
+            "________________________________" )
 
         flowHandle = main.ONOScli1.flows()
         # print "flowHandle = ", flowHandle
@@ -1087,7 +1140,7 @@
 
         count = 1
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         while i < 18:
             main.log.info(
                 "\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
@@ -1095,8 +1148,8 @@
                 src="h" + str( i ), target="h" + str( i + 10 ) )
             if ping == main.FALSE and count < 5:
                 count += 1
-                #i = 8
-                Ping_Result = main.FALSE
+                # i = 8
+                PingResult = main.FALSE
                 main.log.report( "Ping between h" +
                                  str( i ) +
                                  " and h" +
@@ -1114,7 +1167,7 @@
                                       10 ) +
                                  "have failed" )
                 i = 19
-                Ping_Result = main.FALSE
+                PingResult = main.FALSE
             elif ping == main.TRUE:
                 main.log.info( "Ping test between h" +
                                str( i ) +
@@ -1123,98 +1176,104 @@
                                     10 ) +
                                "passed!" )
                 i += 1
-                Ping_Result = main.TRUE
+                PingResult = main.TRUE
             else:
                 main.log.info( "Unknown error" )
-                Ping_Result = main.ERROR
-        if Ping_Result == main.FALSE:
+                PingResult = main.ERROR
+        if PingResult == main.FALSE:
             main.log.report(
-                "Ping all test after Point intents addition failed. Cleaning up" )
+                "Ping all test after Point intents" +
+                " addition failed. Cleaning up" )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report(
                 "Ping all test after Point intents addition successful" )
 
-        case8_result = Ping_Result
-        utilities.assert_equals(
+        case8Result = PingResult
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case8_result,
+            actual=case8Result,
             onpass="Ping all test after Point intents addition successful",
             onfail="Ping all test after Point intents addition failed" )
 
     def CASE31( self ):
         """
-            This test case adds point intent related to SDN-IP matching on ICMP ( ethertype=IPV4, ipProto=1 )
+            This test case adds point intent related to
+            SDN-IP matching on ICMP ( ethertype=IPV4, ipProto=1 )
         """
         import json
 
         main.log.report(
-            "This test case adds point intent related to SDN-IP matching on ICMP" )
+            "This test case adds point intent " +
+            "related to SDN-IP matching on ICMP" )
         main.case(
-            "Adding bidirectional point intent related to SDN-IP matching on ICMP" )
+            "Adding bidirectional point intent related" +
+            " to SDN-IP matching on ICMP" )
         main.step( "Adding bidirectional point intent" )
         # add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32
         # --ethType=IPV4 --ipProto=1  of:0000000000003008/1
         # of:0000000000006018/1
 
-        hosts_json = json.loads( main.ONOScli1.hosts() )
+        hostsJson = json.loads( main.ONOScli1.hosts() )
         for i in range( 8, 11 ):
             main.log.info(
-                "Adding point intent between h" + str( i ) + " and h" + str( i + 10 ) )
+                "Adding point intent between h" + str( i ) +
+                " and h" + str( i + 10 ) )
             host1 = "00:00:00:00:00:" + \
                 str( hex( i )[ 2: ] ).zfill( 2 ).upper()
             host2 = "00:00:00:00:00:" + \
                 str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
-            host1_id = main.ONOScli1.get_host( host1 )[ 'id' ]
-            host2_id = main.ONOScli1.get_host( host2 )[ 'id' ]
-            for host in hosts_json:
-                if host[ 'id' ] == host1_id:
+            host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
+            host2Id = main.ONOScli1.getHost( host2 )[ 'id' ]
+            for host in hostsJson:
+                if host[ 'id' ] == host1Id:
                     ip1 = host[ 'ips' ][ 0 ]
                     ip1 = str( ip1 + "/32" )
                     device1 = host[ 'location' ][ 'device' ]
                     device1 = str( device1 + "/1" )
-                elif host[ 'id' ] == host2_id:
+                elif host[ 'id' ] == host2Id:
                     ip2 = str( host[ 'ips' ][ 0 ] ) + "/32"
                     device2 = host[ 'location' ][ "device" ]
                     device2 = str( device2 + "/1" )
 
-            p_intent_result1 = main.ONOScli1.add_point_intent(
-                ingress_device=device1,
-                egress_device=device2,
+            pIntentResult1 = main.ONOScli1.addPointIntent(
+                ingressDevice=device1,
+                egressDevice=device2,
                 ipSrc=ip1,
                 ipDst=ip2,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'icmpProto' ] )
 
-            get_intent_result = main.ONOScli1.intents( json_format=False )
-            main.log.info( get_intent_result )
+            getIntentResult = main.ONOScli1.intents( jsonFormat=False )
+            main.log.info( getIntentResult )
 
-            p_intent_result2 = main.ONOScli1.add_point_intent(
-                ingress_device=device2,
-                egress_device=device1,
+            pIntentResult2 = main.ONOScli1.addPointIntent(
+                ingressDevice=device2,
+                egressDevice=device1,
                 ipSrc=ip2,
                 ipDst=ip1,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'icmpProto' ] )
 
-            get_intent_result = main.ONOScli1.intents( json_format=False )
-            main.log.info( get_intent_result )
-            if ( p_intent_result1 and p_intent_result2 ) == main.TRUE:
-                #get_intent_result = main.ONOScli1.intents()
-                # main.log.info( get_intent_result )
+            getIntentResult = main.ONOScli1.intents( jsonFormat=False )
+            main.log.info( getIntentResult )
+            if ( pIntentResult1 and pIntentResult2 ) == main.TRUE:
+                # getIntentResult = main.ONOScli1.intents()
+                # main.log.info( getIntentResult )
                 main.log.info(
-                    "Point intent related to SDN-IP matching on ICMP install successful" )
+                    "Point intent related to SDN-IP matching" +
+                    " on ICMP install successful" )
 
         time.sleep( 15 )
-        get_intent_result = main.ONOScli1.intents( json_format=False )
-        main.log.info( "intents = " + get_intent_result )
-        get_flows_result = main.ONOScli1.flows()
-        main.log.info( "flows = " + get_flows_result )
+        getIntentResult = main.ONOScli1.intents( jsonFormat=False )
+        main.log.info( "intents = " + getIntentResult )
+        getFlowsResult = main.ONOScli1.flows()
+        main.log.info( "flows = " + getFlowsResult )
 
         count = 1
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         while i < 11:
             main.log.info(
                 "\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
@@ -1222,8 +1281,8 @@
                 src="h" + str( i ), target="h" + str( i + 10 ) )
             if ping == main.FALSE and count < 3:
                 count += 1
-                #i = 8
-                Ping_Result = main.FALSE
+                # i = 8
+                PingResult = main.FALSE
                 main.log.report( "Ping between h" +
                                  str( i ) +
                                  " and h" +
@@ -1241,7 +1300,7 @@
                                       10 ) +
                                  "have failed" )
                 i = 19
-                Ping_Result = main.FALSE
+                PingResult = main.FALSE
             elif ping == main.TRUE:
                 main.log.info( "Ping test between h" +
                                str( i ) +
@@ -1250,150 +1309,186 @@
                                     10 ) +
                                "passed!" )
                 i += 1
-                Ping_Result = main.TRUE
+                PingResult = main.TRUE
             else:
                 main.log.info( "Unknown error" )
-                Ping_Result = main.ERROR
-        if Ping_Result == main.FALSE:
+                PingResult = main.ERROR
+        if PingResult == main.FALSE:
             main.log.report(
-                "Ping test after Point intents related to SDN-IP matching on ICMP failed." )
+                "Ping test after Point intents related to" +
+                " SDN-IP matching on ICMP failed." )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report(
-                "Ping all test after Point intents related to SDN-IP matching on ICMP successful" )
+                "Ping all test after Point intents related to" +
+                " SDN-IP matching on ICMP successful" )
 
-        case31_result = Ping_Result and p_intent_result1 and p_intent_result2
-        utilities.assert_equals(
+        case31Result = PingResult and pIntentResult1 and pIntentResult2
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case31_result,
-            onpass="Point intent related to SDN-IP matching on ICMP and ping test successful",
-            onfail="Point intent related to SDN-IP matching on ICMP and ping test failed" )
+            actual=case31Result,
+            onpass="Point intent related to SDN-IP " +
+            "matching on ICMP and ping test successful",
+            onfail="Point intent related to SDN-IP" +
+            " matching on ICMP and ping test failed" )
 
     def CASE32( self ):
         """
-            This test case adds point intent related to SDN-IP matching on TCP ( ethertype=IPV4, ipProto=6, DefaultPort for iperf=5001 )
-            Note: Although BGP port is 179, we are using 5001 because iperf is used for verifying and iperf's default port is 5001
+            This test case adds point intent related to SDN-IP matching on TCP
+            ( ethertype=IPV4, ipProto=6, DefaultPort for iperf=5001 )
+            Note: Although BGP port is 179, we are using 5001 because iperf
+            is used for verifying and iperf's default port is 5001
         """
         import json
 
         main.log.report(
-            "This test case adds point intent related to SDN-IP matching on TCP" )
+            "This test case adds point intent" +
+            " related to SDN-IP matching on TCP" )
         main.case(
-            "Adding bidirectional point intent related to SDN-IP matching on TCP" )
+            "Adding bidirectional point intent related" +
+            " to SDN-IP matching on TCP" )
         main.step( "Adding bidirectional point intent" )
         """
-        add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32 --ethType=IPV4 --ipProto=6 --tcpDst=5001  of:0000000000003008/1 of:0000000000006018/1
+        add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32
+        --ethType=IPV4 --ipProto=6 --tcpDst=5001  of:0000000000003008/1
+        of:0000000000006018/1
 
-        add-point-intent --ipSrc=10.0.0.18/32 --ipDst=10.0.0.8/32 --ethType=IPV4 --ipProto=6 --tcpDst=5001  of:0000000000006018/1 of:0000000000003008/1
+        add-point-intent --ipSrc=10.0.0.18/32 --ipDst=10.0.0.8/32
+        --ethType=IPV4 --ipProto=6 --tcpDst=5001  of:0000000000006018/1
+        of:0000000000003008/1
 
-        add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32 --ethType=IPV4 --ipProto=6 --tcpSrc=5001  of:0000000000003008/1 of:0000000000006018/1
+        add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32
+        --ethType=IPV4 --ipProto=6 --tcpSrc=5001  of:0000000000003008/1
+        of:0000000000006018/1
 
-        add-point-intent --ipSrc=10.0.0.18/32 --ipDst=10.0.0.8/32 --ethType=IPV4 --ipProto=6 --tcpSrc=5001  of:0000000000006018/1 of:0000000000003008/1
+        add-point-intent --ipSrc=10.0.0.18/32 --ipDst=10.0.0.8/32
+        --ethType=IPV4 --ipProto=6 --tcpSrc=5001  of:0000000000006018/1
+        of:0000000000003008/1
 
         """
-        hosts_json = json.loads( main.ONOScli1.hosts() )
+        hostsJson = json.loads( main.ONOScli1.hosts() )
         for i in range( 8, 9 ):
             main.log.info(
-                "Adding point intent between h" + str( i ) + " and h" + str( i + 10 ) )
+                "Adding point intent between h" + str( i ) +
+                " and h" + str( i + 10 ) )
             host1 = "00:00:00:00:00:" + \
                 str( hex( i )[ 2: ] ).zfill( 2 ).upper()
             host2 = "00:00:00:00:00:" + \
                 str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
-            host1_id = main.ONOScli1.get_host( host1 )[ 'id' ]
-            host2_id = main.ONOScli1.get_host( host2 )[ 'id' ]
-            for host in hosts_json:
-                if host[ 'id' ] == host1_id:
+            host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
+            host2Id = main.ONOScli1.getHost( host2 )[ 'id' ]
+            for host in hostsJson:
+                if host[ 'id' ] == host1Id:
                     ip1 = host[ 'ips' ][ 0 ]
                     ip1 = str( ip1 + "/32" )
                     device1 = host[ 'location' ][ 'device' ]
                     device1 = str( device1 + "/1" )
-                elif host[ 'id' ] == host2_id:
+                elif host[ 'id' ] == host2Id:
                     ip2 = str( host[ 'ips' ][ 0 ] ) + "/32"
                     device2 = host[ 'location' ][ "device" ]
                     device2 = str( device2 + "/1" )
 
-            p_intent_result1 = main.ONOScli1.add_point_intent(
-                ingress_device=device1,
-                egress_device=device2,
+            pIntentResult1 = main.ONOScli1.addPointIntent(
+                ingressDevice=device1,
+                egressDevice=device2,
                 ipSrc=ip1,
                 ipDst=ip2,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
                 tcpDst=main.params[ 'SDNIP' ][ 'dstPort' ] )
-            p_intent_result2 = main.ONOScli1.add_point_intent(
-                ingress_device=device2,
-                egress_device=device1,
+            pIntentResult2 = main.ONOScli1.addPointIntent(
+                ingressDevice=device2,
+                egressDevice=device1,
                 ipSrc=ip2,
                 ipDst=ip1,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
                 tcpDst=main.params[ 'SDNIP' ][ 'dstPort' ] )
 
-            p_intent_result3 = main.ONOScli1.add_point_intent(
-                ingress_device=device1,
-                egress_device=device2,
+            pIntentResult3 = main.ONOScli1.addPointIntent(
+                ingressDevice=device1,
+                egressDevice=device2,
                 ipSrc=ip1,
                 ipDst=ip2,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
                 tcpSrc=main.params[ 'SDNIP' ][ 'srcPort' ] )
-            p_intent_result4 = main.ONOScli1.add_point_intent(
-                ingress_device=device2,
-                egress_device=device1,
+            pIntentResult4 = main.ONOScli1.addPointIntent(
+                ingressDevice=device2,
+                egressDevice=device1,
                 ipSrc=ip2,
                 ipDst=ip1,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
                 tcpSrc=main.params[ 'SDNIP' ][ 'srcPort' ] )
 
-            p_intent_result = p_intent_result1 and p_intent_result2 and p_intent_result3 and p_intent_result4
-            if p_intent_result == main.TRUE:
-                get_intent_result = main.ONOScli1.intents( json_format=False )
-                main.log.info( get_intent_result )
-                main.log.info(
-                    "Point intent related to SDN-IP matching on TCP install successful" )
+            pIntentResult = pIntentResult1 and pIntentResult2 and\
+                    pIntentResult3 and pIntentResult4
+            if pIntentResult == main.TRUE:
+                getIntentResult = main.ONOScli1.intents( jsonFormat=False )
+                main.log.info( getIntentResult )
+                main.log.report(
+                    "Point intent related to SDN-IP matching" +
+                    " on TCP install successful" )
+            else:
+                main.log.report(
+                    "Point intent related to SDN-IP matching" +
+                    " on TCP install failed" )
 
-        iperf_result = main.Mininet1.iperf( 'h8', 'h18' )
-        if iperf_result == main.TRUE:
+        iperfResult = main.Mininet1.iperf( 'h8', 'h18' )
+        if iperfResult == main.TRUE:
             main.log.report( "iperf test successful" )
         else:
             main.log.report( "iperf test failed" )
 
-        case32_result = p_intent_result and iperf_result
-        utilities.assert_equals(
+        case32Result = pIntentResult and iperfResult
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case32_result,
-            onpass="Ping all test after Point intents addition related to SDN-IP on TCP match successful",
-            onfail="Ping all test after Point intents addition related to SDN-IP on TCP match failed" )
+            actual=case32Result,
+            onpass="Ping all test after Point intents addition related " +
+            "to SDN-IP on TCP match successful",
+            onfail="Ping all test after Point intents addition related " +
+            "to SDN-IP on TCP match failed" )
 
     def CASE33( self ):
         """
-            This test case adds multipoint to singlepoint  intent related to SDN-IP matching on destination ip and the action is to rewrite the mac address
-            Here the mac address to be rewritten is the mac address of the egress device
+            This test case adds multipoint to singlepoint  intent related to
+            SDN-IP matching on destination ip and the action is to rewrite
+            the mac address
+            Here the mac address to be rewritten is the mac address of the
+            egress device
         """
         import json
         import time
 
         main.log.report(
-            "This test case adds multipoint to singlepoint intent related to SDN-IP matching on destination ip and rewrite mac address action" )
+            "This test case adds multipoint to singlepoint intent related to" +
+            " SDN-IP matching on destination ip and " +
+            "rewrite mac address action" )
         main.case(
-            "Adding multipoint to singlepoint intent related to SDN-IP matching on destination ip" )
+            "Adding multipoint to singlepoint intent related to SDN-IP" +
+            " matching on destination ip" )
         main.step( "Adding bidirectional multipoint to singlepoint intent" )
         """
-        add-multi-to-single-intent --ipDst=10.0.3.0/24 --setEthDst=00:00:00:00:00:12 of:0000000000003008/1 0000000000003009/1 of:0000000000006018/1
+        add-multi-to-single-intent --ipDst=10.0.3.0/24
+        --setEthDst=00:00:00:00:00:12 of:0000000000003008/1 0000000000003009/1
+        of:0000000000006018/1
 
-        add-multi-to-single-intent --ipDst=10.0.1.0/24 --setEthDst=00:00:00:00:00:08 of:0000000000006018/1 0000000000003009/1 of:0000000000003008/1
+        add-multi-to-single-intent --ipDst=10.0.1.0/24
+        --setEthDst=00:00:00:00:00:08 of:0000000000006018/1 0000000000003009/1
+        of:0000000000003008/1
         """
         main.case(
-            "Installing multipoint to single point intent with rewrite mac address" )
+            "Installing multipoint to single point " +
+            "intent with rewrite mac address" )
         main.step( "Uninstalling proxy arp app" )
         # Unistall onos-app-proxyarp app to disable reactive forwarding
-        appUninstall_result1 = main.ONOScli1.feature_uninstall(
+        appUninstallResult1 = main.ONOScli1.featureUninstall(
             "onos-app-proxyarp" )
-        appUninstall_result2 = main.ONOScli2.feature_uninstall(
+        appUninstallResult2 = main.ONOScli2.featureUninstall(
             "onos-app-proxyarp" )
-        appUninstall_result3 = main.ONOScli3.feature_uninstall(
+        appUninstallResult3 = main.ONOScli3.featureUninstall(
             "onos-app-proxyarp" )
         main.log.info( "onos-app-proxyarp uninstalled" )
 
@@ -1420,7 +1515,8 @@
         main.Mininet1.changeDefaultGateway( host='h10', newGW='10.0.3.254' )
 
         main.step(
-            "Assigning random mac address to the default gateways since proxyarp app is uninstalled" )
+            "Assigning random mac address to the default gateways " +
+            "since proxyarp app is uninstalled" )
         main.Mininet1.addStaticMACAddress(
             host='h8',
             GW='10.0.1.254',
@@ -1440,37 +1536,37 @@
         main.Mininet1.verifyStaticGWandMAC( host='h10' )
 
         main.step( "Adding multipoint to singlepoint intent" )
-        p_intent_result1 = main.ONOScli1.add_multipoint_to_singlepoint_intent(
-            ingress_device1=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
-            ingress_device2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
-            egress_device=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
+        pIntentResult1 = main.ONOScli1.addMultipointToSinglepointIntent(
+            ingressDevice1=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
+            ingressDevice2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
+            egressDevice=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
             ipDst=main.params[ 'MULTIPOINT_INTENT' ][ 'ip1' ],
             setEthDst=main.params[ 'MULTIPOINT_INTENT' ][ 'mac1' ] )
 
-        p_intent_result2 = main.ONOScli1.add_multipoint_to_singlepoint_intent(
-            ingress_device1=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
-            ingress_device2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
-            egress_device=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
+        pIntentResult2 = main.ONOScli1.addMultipointToSinglepointIntent(
+            ingressDevice1=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
+            ingressDevice2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
+            egressDevice=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
             ipDst=main.params[ 'MULTIPOINT_INTENT' ][ 'ip2' ],
             setEthDst=main.params[ 'MULTIPOINT_INTENT' ][ 'mac2' ] )
 
-        get_intent_result = main.ONOScli1.intents( json_format=False )
-        main.log.info( "intents = " + get_intent_result )
+        getIntentResult = main.ONOScli1.intents( jsonFormat=False )
+        main.log.info( "intents = " + getIntentResult )
 
         time.sleep( 10 )
-        get_flows_result = main.ONOScli1.flows( json_format=False )
-        main.log.info( "flows = " + get_flows_result )
+        getFlowsResult = main.ONOScli1.flows( jsonFormat=False )
+        main.log.info( "flows = " + getFlowsResult )
 
         count = 1
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
 
         main.log.info( "\n\nh" + str( i ) + " is Pinging h" + str( i + 2 ) )
         ping = main.Mininet1.pingHost(
             src="h" + str( i ), target="h" + str( i + 2 ) )
         if ping == main.FALSE and count < 3:
             count += 1
-            Ping_Result = main.FALSE
+            PingResult = main.FALSE
             main.log.report( "Ping between h" +
                              str( i ) +
                              " and h" +
@@ -1487,7 +1583,7 @@
                              str( i +
                                   10 ) +
                              "have failed" )
-            Ping_Result = main.FALSE
+            PingResult = main.FALSE
         elif ping == main.TRUE:
             main.log.info( "Ping test between h" +
                            str( i ) +
@@ -1495,29 +1591,33 @@
                            str( i +
                                 2 ) +
                            "passed!" )
-            Ping_Result = main.TRUE
+            PingResult = main.TRUE
         else:
             main.log.info( "Unknown error" )
-            Ping_Result = main.ERROR
+            PingResult = main.ERROR
 
-        if Ping_Result == main.FALSE:
+        if PingResult == main.FALSE:
             main.log.report( "Ping test failed." )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report( "Ping all successful" )
 
-        p_intent_result = p_intent_result1 and p_intent_result2
-        if p_intent_result == main.TRUE:
+        pIntentResult = pIntentResult1 and pIntentResult2
+        if pIntentResult == main.TRUE:
             main.log.info(
-                "Multi point intent with rewrite mac address installation successful" )
+                "Multi point intent with rewrite mac " +
+                "address installation successful" )
         else:
             main.log.info(
-                "Multi point intent with rewrite mac address installation failed" )
+                "Multi point intent with rewrite mac" +
+                " address installation failed" )
 
-        case33_result = p_intent_result and Ping_Result
-        utilities.assert_equals(
+        case33Result = pIntentResult and PingResult
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case33_result,
-            onpass="Ping all test after multipoint to single point intent addition with rewrite mac address successful",
-            onfail="Ping all test after multipoint to single point intent addition with rewrite mac address failed" )
+            actual=case33Result,
+            onpass="Ping all test after multipoint to single point" +
+            " intent addition with rewrite mac address successful",
+            onfail="Ping all test after multipoint to single point intent" +
+            " addition with rewrite mac address failed" )
diff --git a/TestON/tests/MultiProd/__init__.py b/TestON/tests/MultiProd/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/MultiProd/__init__.py
diff --git a/TestON/tests/MultiProd13/MultiProd13.params b/TestON/tests/MultiProd13/MultiProd13.params
index 8bf1600..6e5c85e 100755
--- a/TestON/tests/MultiProd13/MultiProd13.params
+++ b/TestON/tests/MultiProd13/MultiProd13.params
@@ -1,6 +1,6 @@
 <PARAMS>
     
-    <testcases>1,4,10,5,6,7,8,6,8,9,31,32,8,33</testcases>    
+    <testcases>1,4,10,5,6,7,8,6,8,9,8,31,32,8,33,8</testcases>    
 
     #Environment variables
     <ENV>
diff --git a/TestON/tests/MultiProd13/MultiProd13.py b/TestON/tests/MultiProd13/MultiProd13.py
index f26cd5c..c68640e 100644
--- a/TestON/tests/MultiProd13/MultiProd13.py
+++ b/TestON/tests/MultiProd13/MultiProd13.py
@@ -11,7 +11,6 @@
 
 time.sleep( 1 )
 
-
 class MultiProd13:
 
     def __init__( self ):
@@ -29,13 +28,13 @@
         onos-install -f
         onos-wait-for-start
         """
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS1_port = main.params[ 'CTRL' ][ 'port1' ]
-        ONOS2_port = main.params[ 'CTRL' ][ 'port2' ]
-        ONOS3_port = main.params[ 'CTRL' ][ 'port3' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+        ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
 
         main.case( "Setting up test environment" )
         main.log.report(
@@ -43,190 +42,199 @@
         main.log.report( "__________________________________" )
 
         main.step( "Applying cell variable to environment" )
-        cell_result1 = main.ONOSbench.set_cell( cell_name )
-        #cell_result2 = main.ONOScli1.set_cell( cell_name )
-        #cell_result3 = main.ONOScli2.set_cell( cell_name )
-        #cell_result4 = main.ONOScli3.set_cell( cell_name )
-        verify_result = main.ONOSbench.verify_cell()
-        cell_result = cell_result1
+        cellResult1 = main.ONOSbench.setCell( cellName )
+        # cellResult2 = main.ONOScli1.setCell( cellName )
+        # cellResult3 = main.ONOScli2.setCell( cellName )
+        # cellResult4 = main.ONOScli3.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
+        cellResult = cellResult1
 
         main.step( "Removing raft logs before a clen installation of ONOS" )
-        remove_log_Result = main.ONOSbench.onos_remove_raft_logs()
+        removeLogResult = main.ONOSbench.onosRemoveRaftLogs()
 
-        main.step( "Git checkout and pull master and get version" )
-        main.ONOSbench.git_checkout( "master" )
-        git_pull_result = main.ONOSbench.git_pull()
-        print "git_pull_result = ", git_pull_result
-        version_result = main.ONOSbench.get_version( report=True )
+        main.step( "Git checkout, pull and get version" )
+        #main.ONOSbench.gitCheckout( "master" )
+        gitPullResult = main.ONOSbench.gitPull()
+        main.log.info( "git_pull_result = " + str( gitPullResult ))
+        versionResult = main.ONOSbench.getVersion( report=True )
 
-        if git_pull_result == 1:
+        if gitPullResult == 1:
             main.step( "Using mvn clean & install" )
-            clean_install_result = main.ONOSbench.clean_install()
-            #clean_install_result = main.TRUE
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+            # cleanInstallResult = main.TRUE
 
         main.step( "Creating ONOS package" )
-        package_result = main.ONOSbench.onos_package()
+        packageResult = main.ONOSbench.onosPackage()
 
-        #main.step( "Creating a cell" )
-        # cell_create_result = main.ONOSbench.create_cell_file( **************
+        # main.step( "Creating a cell" )
+        # cellCreateResult = main.ONOSbench.createCellFile( **************
         # )
 
         main.step( "Installing ONOS package" )
-        onos1_install_result = main.ONOSbench.onos_install(
+        onos1InstallResult = main.ONOSbench.onosInstall(
             options="-f",
-            node=ONOS1_ip )
-        onos2_install_result = main.ONOSbench.onos_install(
+            node=ONOS1Ip )
+        onos2InstallResult = main.ONOSbench.onosInstall(
             options="-f",
-            node=ONOS2_ip )
-        onos3_install_result = main.ONOSbench.onos_install(
+            node=ONOS2Ip )
+        onos3InstallResult = main.ONOSbench.onosInstall(
             options="-f",
-            node=ONOS3_ip )
-        onos_install_result = onos1_install_result and onos2_install_result and onos3_install_result
-        if onos_install_result == main.TRUE:
+            node=ONOS3Ip )
+        onosInstallResult = onos1InstallResult and onos2InstallResult and\
+                onos3InstallResult
+        if onosInstallResult == main.TRUE:
             main.log.report( "Installing ONOS package successful" )
         else:
             main.log.report( "Installing ONOS package failed" )
 
-        onos1_isup = main.ONOSbench.isup( ONOS1_ip )
-        onos2_isup = main.ONOSbench.isup( ONOS2_ip )
-        onos3_isup = main.ONOSbench.isup( ONOS3_ip )
-        onos_isup = onos1_isup and onos2_isup and onos3_isup
-        if onos_isup == main.TRUE:
+        onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+        onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+        onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+        onosIsup = onos1Isup and onos2Isup and onos3Isup
+        if onosIsup == main.TRUE:
             main.log.report( "ONOS instances are up and ready" )
         else:
             main.log.report( "ONOS instances may not be up" )
 
         main.step( "Starting ONOS service" )
-        start_result = main.TRUE
-        #start_result = main.ONOSbench.onos_start( ONOS1_ip )
-        startcli1 = main.ONOScli1.start_onos_cli( ONOS_ip=ONOS1_ip )
-        startcli2 = main.ONOScli2.start_onos_cli( ONOS_ip=ONOS2_ip )
-        startcli3 = main.ONOScli3.start_onos_cli( ONOS_ip=ONOS3_ip )
+        startResult = main.TRUE
+        # startResult = main.ONOSbench.onosStart( ONOS1Ip )
+        startcli1 = main.ONOScli1.startOnosCli( ONOSIp=ONOS1Ip )
+        startcli2 = main.ONOScli2.startOnosCli( ONOSIp=ONOS2Ip )
+        startcli3 = main.ONOScli3.startOnosCli( ONOSIp=ONOS3Ip )
         print startcli1
         print startcli2
         print startcli3
 
-        case1_result = ( package_result and
-                         cell_result and verify_result and onos_install_result and
-                         onos_isup and start_result )
-        utilities.assert_equals( expect=main.TRUE, actual=case1_result,
-                                 onpass="Test startup successful",
-                                 onfail="Test startup NOT successful" )
+        # Starting the mininet using the old way
+        main.step( "Starting Mininet ..." )
+        netIsUp = main.Mininet1.startNet()
+        if netIsUp:
+            main.log.info("Mininet CLI is up")
+
+        case1Result = ( packageResult and
+                        cellResult and verifyResult and onosInstallResult and
+                        onosIsup and startResult )
+        utilities.assertEquals( expect=main.TRUE, actual=case1Result,
+                                onpass="Test startup successful",
+                                onfail="Test startup NOT successful" )
 
     def CASE11( self, main ):
         """
         Cleanup sequence:
-        onos-service <node_ip> stop
+        onos-service <nodeIp> stop
         onos-uninstall
 
         TODO: Define rest of cleanup
 
         """
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
 
         main.case( "Cleaning up test environment" )
 
         main.step( "Testing ONOS kill function" )
-        kill_result1 = main.ONOSbench.onos_kill( ONOS1_ip )
-        kill_result2 = main.ONOSbench.onos_kill( ONOS2_ip )
-        kill_result3 = main.ONOSbench.onos_kill( ONOS3_ip )
+        killResult1 = main.ONOSbench.onosKill( ONOS1Ip )
+        killResult2 = main.ONOSbench.onosKill( ONOS2Ip )
+        killResult3 = main.ONOSbench.onosKill( ONOS3Ip )
 
         main.step( "Stopping ONOS service" )
-        stop_result1 = main.ONOSbench.onos_stop( ONOS1_ip )
-        stop_result2 = main.ONOSbench.onos_stop( ONOS2_ip )
-        stop_result3 = main.ONOSbench.onos_stop( ONOS3_ip )
+        stopResult1 = main.ONOSbench.onosStop( ONOS1Ip )
+        stopResult2 = main.ONOSbench.onosStop( ONOS2Ip )
+        stopResult3 = main.ONOSbench.onosStop( ONOS3Ip )
 
         main.step( "Uninstalling ONOS service" )
-        uninstall_result = main.ONOSbench.onos_uninstall()
+        uninstallResult = main.ONOSbench.onosUninstall()
 
     def CASE3( self, main ):
         """
         Test 'onos' command and its functionality in driver
         """
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
 
         main.case( "Testing 'onos' command" )
 
         main.step( "Sending command 'onos -w <onos-ip> system:name'" )
         cmdstr1 = "system:name"
-        cmd_result1 = main.ONOSbench.onos_cli( ONOS1_ip, cmdstr1 )
-        main.log.info( "onos command returned: " + cmd_result1 )
-        cmd_result2 = main.ONOSbench.onos_cli( ONOS2_ip, cmdstr1 )
-        main.log.info( "onos command returned: " + cmd_result2 )
-        cmd_result3 = main.ONOSbench.onos_cli( ONOS3_ip, cmdstr1 )
-        main.log.info( "onos command returned: " + cmd_result3 )
+        cmdResult1 = main.ONOSbench.onosCli( ONOS1Ip, cmdstr1 )
+        main.log.info( "onos command returned: " + cmdResult1 )
+        cmdResult2 = main.ONOSbench.onosCli( ONOS2Ip, cmdstr1 )
+        main.log.info( "onos command returned: " + cmdResult2 )
+        cmdResult3 = main.ONOSbench.onosCli( ONOS3Ip, cmdstr1 )
+        main.log.info( "onos command returned: " + cmdResult3 )
 
         main.step( "Sending command 'onos -w <onos-ip> onos:topology'" )
         cmdstr2 = "onos:topology"
-        cmd_result4 = main.ONOSbench.onos_cli( ONOS1_ip, cmdstr2 )
-        main.log.info( "onos command returned: " + cmd_result4 )
-        cmd_result5 = main.ONOSbench.onos_cli( ONOS2_ip, cmdstr2 )
-        main.log.info( "onos command returned: " + cmd_result5 )
-        cmd_result6 = main.ONOSbench.onos_cli( ONOS6_ip, cmdstr2 )
-        main.log.info( "onos command returned: " + cmd_result6 )
+        cmdResult4 = main.ONOSbench.onosCli( ONOS1Ip, cmdstr2 )
+        main.log.info( "onos command returned: " + cmdResult4 )
+        cmdResult5 = main.ONOSbench.onosCli( ONOS2Ip, cmdstr2 )
+        main.log.info( "onos command returned: " + cmdResult5 )
+        cmdResult6 = main.ONOSbench.onosCli( ONOS6Ip, cmdstr2 )
+        main.log.info( "onos command returned: " + cmdResult6 )
 
     def CASE4( self, main ):
         import re
         import time
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS1_port = main.params[ 'CTRL' ][ 'port1' ]
-        ONOS2_port = main.params[ 'CTRL' ][ 'port2' ]
-        ONOS3_port = main.params[ 'CTRL' ][ 'port3' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+        ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
 
         main.log.report(
-            "This testcase is testing the assignment of all the switches to all controllers and discovering the hosts in reactive mode" )
+            "This testcase is testing the assignment of all the switches" +
+            " to all controllers and discovering the hosts in reactive mode" )
         main.log.report( "__________________________________" )
         main.case( "Pingall Test(No intents are added)" )
         main.step( "Assigning switches to controllers" )
         for i in range( 1, 29 ):  # 1 to ( num of switches +1 )
-            main.Mininet1.assign_sw_controller(
+            main.Mininet1.assignSwController(
                 sw=str( i ),
                 count=3,
-                ip1=ONOS1_ip,
-                port1=ONOS1_port,
-                ip2=ONOS2_ip,
-                port2=ONOS2_port,
-                ip3=ONOS3_ip,
-                port3=ONOS3_port )
+                ip1=ONOS1Ip,
+                port1=ONOS1Port,
+                ip2=ONOS2Ip,
+                port2=ONOS2Port,
+                ip3=ONOS3Ip,
+                port3=ONOS3Port )
 
-        switch_mastership = main.TRUE
+        switchMastership = main.TRUE
         for i in range( 1, 29 ):
-            response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+            response = main.Mininet1.getSwController( "s" + str( i ) )
             print( "Response is " + str( response ) )
-            if re.search( "tcp:" + ONOS1_ip, response ):
-                switch_mastership = switch_mastership and main.TRUE
+            if re.search( "tcp:" + ONOS1Ip, response ):
+                switchMastership = switchMastership and main.TRUE
             else:
-                switch_mastership = main.FALSE
+                switchMastership = main.FALSE
 
-        if switch_mastership == main.TRUE:
+        if switchMastership == main.TRUE:
             main.log.report( "Controller assignment successfull" )
         else:
             main.log.report( "Controller assignment failed" )
         # REACTIVE FWD test
         main.step( "Pingall" )
-        ping_result = main.FALSE
+        pingResult = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall()
         time2 = time.time()
         print "Time for pingall: %2f seconds" % ( time2 - time1 )
 
-        case4_result = switch_mastership and ping_result
-        if ping_result == main.TRUE:
+        case4Result = switchMastership and pingResult
+        if pingResult == main.TRUE:
             main.log.report(
-                "Pingall Test in reactive mode to discover the hosts successful" )
+                "Pingall Test in reactive mode to" +
+                " discover the hosts successful" )
         else:
             main.log.report(
                 "Pingall Test in reactive mode to discover the hosts failed" )
 
-        utilities.assert_equals(
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case4_result,
+            actual=case4Result,
             onpass="Controller assignment and Pingall Test successful",
             onfail="Controller assignment and Pingall Test NOT successful" )
 
@@ -235,15 +243,17 @@
         from subprocess import Popen, PIPE
         # assumes that sts is already in you PYTHONPATH
         from sts.topology.teston_topology import TestONTopology
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
 
         main.log.report(
-            "This testcase is testing if all ONOS nodes are in topology sync with mininet and its peer ONOS nodes" )
+            "This testcase is testing if all ONOS nodes are in topologyi" +
+            " sync with mininet and its peer ONOS nodes" )
         main.log.report( "__________________________________" )
         main.case(
-            "Testing Mininet topology with the topology of multi instances ONOS" )
+            "Testing Mininet topology with the" +
+            " topology of multi instances ONOS" )
         main.step( "Collecting topology information from ONOS" )
         devices1 = main.ONOScli1.devices()
         devices2 = main.ONOScli2.devices()
@@ -336,85 +346,91 @@
             ctrls )  # can also add Intent API info for intent operations
         MNTopo = Topo
 
-        Topology_Check = main.TRUE
+        TopologyCheck = main.TRUE
         main.step( "Compare ONOS Topology to MN Topology" )
 
-        switches_results1 = main.Mininet1.compare_switches(
+        switchesResults1 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices1 ) )
-        print "switches_Result1 = ", switches_results1
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results1,
-                                 onpass="ONOS1 Switches view is correct",
-                                 onfail="ONOS1 Switches view is incorrect" )
+        print "switches_Result1 = ", switchesResults1
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults1,
+                                onpass="ONOS1 Switches view is correct",
+                                onfail="ONOS1 Switches view is incorrect" )
 
-        switches_results2 = main.Mininet1.compare_switches(
+        switchesResults2 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results2,
-                                 onpass="ONOS2 Switches view is correct",
-                                 onfail="ONOS2 Switches view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults2,
+                                onpass="ONOS2 Switches view is correct",
+                                onfail="ONOS2 Switches view is incorrect" )
 
-        switches_results3 = main.Mininet1.compare_switches(
+        switchesResults3 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results3,
-                                 onpass="ONOS3 Switches view is correct",
-                                 onfail="ONOS3 Switches view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults3,
+                                onpass="ONOS3 Switches view is correct",
+                                onfail="ONOS3 Switches view is incorrect" )
 
         """
-        ports_results1 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports1 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results1,
+        portsResults1 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports1 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults1,
                 onpass="ONOS1 Ports view is correct",
                 onfail="ONOS1 Ports view is incorrect" )
 
-        ports_results2 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results2,
+        portsResults2 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports2 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults2,
                 onpass="ONOS2 Ports view is correct",
                 onfail="ONOS2 Ports view is incorrect" )
 
-        ports_results3 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results3,
+        portsResults3 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports3 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults3,
                 onpass="ONOS3 Ports view is correct",
                 onfail="ONOS3 Ports view is incorrect" )
         """
-        links_results1 = main.Mininet1.compare_links(
+        linksResults1 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links1 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results1,
-                                 onpass="ONOS1 Links view is correct",
-                                 onfail="ONOS1 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults1,
+                                onpass="ONOS1 Links view is correct",
+                                onfail="ONOS1 Links view is incorrect" )
 
-        links_results2 = main.Mininet1.compare_links(
+        linksResults2 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results2,
-                                 onpass="ONOS2 Links view is correct",
-                                 onfail="ONOS2 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults2,
+                                onpass="ONOS2 Links view is correct",
+                                onfail="ONOS2 Links view is incorrect" )
 
-        links_results3 = main.Mininet1.compare_links(
+        linksResults3 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results3,
-                                 onpass="ONOS2 Links view is correct",
-                                 onfail="ONOS2 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults3,
+                                onpass="ONOS2 Links view is correct",
+                                onfail="ONOS2 Links view is incorrect" )
 
-        #topo_result = switches_results1 and switches_results2 and switches_results3\
-        # and ports_results1 and ports_results2 and ports_results3\
-        # and links_results1 and links_results2 and links_results3
+        # topoResult = switchesResults1 and switchesResults2
+        # and switchesResults3\
+        # and portsResults1 and portsResults2 and portsResults3\
+        # and linksResults1 and linksResults2 and linksResults3
 
-        topo_result = switches_results1 and switches_results2 and switches_results3\
-            and links_results1 and links_results2 and links_results3
+        topoResult = switchesResults1 and switchesResults2 and\
+                     switchesResults3 and linksResults1 and linksResults2 and\
+                     linksResults3
 
-        if topo_result == main.TRUE:
+        if topoResult == main.TRUE:
             main.log.report(
-                "Topology Check Test with mininet and ONOS instances successful" )
+                "Topology Check Test with mininet" +
+                "and ONOS instances successful" )
         else:
             main.log.report(
                 "Topology Check Test with mininet and ONOS instances failed" )
 
-        utilities.assert_equals( expect=main.TRUE, actual=topo_result,
-                                 onpass="Topology Check Test successful",
-                                 onfail="Topology Check Test NOT successful" )
+        utilities.assertEquals( expect=main.TRUE, actual=topoResult,
+                                onpass="Topology Check Test successful",
+                                onfail="Topology Check Test NOT successful" )
 
     def CASE10( self ):
         main.log.report(
@@ -422,31 +438,34 @@
         main.log.report( "__________________________________" )
         main.case( "Uninstalling reactive forwarding app" )
         # Unistall onos-app-fwd app to disable reactive forwarding
-        appUninstall_result1 = main.ONOScli1.feature_uninstall(
+        appUninstallResult1 = main.ONOScli1.featureUninstall(
             "onos-app-fwd" )
-        appUninstall_result2 = main.ONOScli2.feature_uninstall(
+        appUninstallResult2 = main.ONOScli2.featureUninstall(
             "onos-app-fwd" )
-        appUninstall_result3 = main.ONOScli3.feature_uninstall(
+        appUninstallResult3 = main.ONOScli3.featureUninstall(
             "onos-app-fwd" )
         main.log.info( "onos-app-fwd uninstalled" )
 
-        # After reactive forwarding is disabled, the reactive flows on switches timeout in 10-15s
+        # After reactive forwarding is disabled,
+        # the reactive flows on switches timeout in 10-15s
         # So sleep for 15s
         time.sleep( 15 )
 
         hosts = main.ONOScli1.hosts()
         main.log.info( hosts )
 
-        case10_result = appUninstall_result1 and appUninstall_result2 and appUninstall_result3
-        utilities.assert_equals(
+        case10Result = appUninstallResult1 and\
+                appUninstallResult2 and appUninstallResult3
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case10_result,
+            actual=case10Result,
             onpass="Reactive forwarding app uninstallation successful",
             onfail="Reactive forwarding app uninstallation failed" )
 
     def CASE6( self ):
         main.log.report(
-            "This testcase is testing the addition of host intents and then doing pingall" )
+            "This testcase is testing the addition of" +
+            " host intents and then doing pingall" )
         main.log.report( "__________________________________" )
         main.case( "Obtaining hostsfor adding host intents" )
         main.step( "Get hosts" )
@@ -454,45 +473,57 @@
         main.log.info( hosts )
 
         main.step( "Get all devices id" )
-        devices_id_list = main.ONOScli1.get_all_devices_id()
-        main.log.info( devices_id_list )
+        devicesIdList = main.ONOScli1.getAllDevicesId()
+        main.log.info( devicesIdList )
 
-        # ONOS displays the hosts in hex format unlike mininet which does in decimal format
+        # ONOS displays the hosts in hex format
+        # unlike mininet which does in decimal format
         # So take care while adding intents
 
         """
-        main.step( "Add host intents for mn hosts(h8-h18,h9-h19,h10-h20,h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:08/-1", "00:00:00:00:00:12/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:09/-1", "00:00:00:00:00:13/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0A/-1", "00:00:00:00:00:14/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0B/-1", "00:00:00:00:00:15/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0C/-1", "00:00:00:00:00:16/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0D/-1", "00:00:00:00:00:17/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0E/-1", "00:00:00:00:00:18/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:0F/-1", "00:00:00:00:00:19/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:10/-1", "00:00:00:00:00:1A/-1" )
-        hth_intent_result = main.ONOScli1.add_host_intent( "00:00:00:00:00:11/-1", "00:00:00:00:00:1B/-1" )
+        main.step( "Add host intents for mn hosts(h8-h18,h9-h19,h10-h20,
+        h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:08/-1",
+        "00:00:00:00:00:12/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:09/-1",
+        "00:00:00:00:00:13/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0A/-1",
+        "00:00:00:00:00:14/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0B/-1",
+        "00:00:00:00:00:15/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0C/-1",
+        "00:00:00:00:00:16/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0D/-1",
+        "00:00:00:00:00:17/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0E/-1",
+        "00:00:00:00:00:18/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0F/-1",
+        "00:00:00:00:00:19/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:10/-1",
+        "00:00:00:00:00:1A/-1" )
+        hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:11/-1",
+        "00:00:00:00:00:1B/-1" )
         """
         for i in range( 8, 18 ):
             main.log.info(
-                "Adding host intent between h" + str( i ) + " and h" + str( i + 10 ) )
+                "Adding host intent between h" + str( i ) +
+                " and h" + str( i + 10 ) )
             host1 = "00:00:00:00:00:" + \
                 str( hex( i )[ 2: ] ).zfill( 2 ).upper()
             host2 = "00:00:00:00:00:" + \
                 str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
             # NOTE: get host can return None
             # TODO: handle this
-            host1_id = main.ONOScli1.get_host( host1 )[ 'id' ]
-            host2_id = main.ONOScli1.get_host( host2 )[ 'id' ]
-            tmp_result = main.ONOScli1.add_host_intent( host1_id, host2_id )
+            host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
+            host2Id = main.ONOScli1.getHost( host2 )[ 'id' ]
+            tmpResult = main.ONOScli1.addHostIntent( host1Id, host2Id )
 
         flowHandle = main.ONOScli1.flows()
-        # print "flowHandle = ", flowHandle
         main.log.info( "flows:" + flowHandle )
 
         count = 1
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         while i < 18:
             main.log.info(
                 "\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
@@ -500,8 +531,8 @@
                 src="h" + str( i ), target="h" + str( i + 10 ) )
             if ping == main.FALSE and count < 5:
                 count += 1
-                #i = 8
-                Ping_Result = main.FALSE
+                # i = 8
+                PingResult = main.FALSE
                 main.log.report( "Ping between h" +
                                  str( i ) +
                                  " and h" +
@@ -519,7 +550,7 @@
                                       10 ) +
                                  "have failed" )
                 i = 19
-                Ping_Result = main.FALSE
+                PingResult = main.FALSE
             elif ping == main.TRUE:
                 main.log.info( "Ping test between h" +
                                str( i ) +
@@ -528,36 +559,38 @@
                                     10 ) +
                                "passed!" )
                 i += 1
-                Ping_Result = main.TRUE
+                PingResult = main.TRUE
             else:
                 main.log.info( "Unknown error" )
-                Ping_Result = main.ERROR
-        if Ping_Result == main.FALSE:
+                PingResult = main.ERROR
+        if PingResult == main.FALSE:
             main.log.report(
                 "Host intents have not ben installed correctly. Cleaning up" )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report( "Host intents have been installed correctly" )
 
-        case6_result = Ping_Result
-        utilities.assert_equals(
+        case6Result = PingResult
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case6_result,
+            actual=case6Result,
             onpass="Host intent addition and Pingall Test successful",
             onfail="Host intent addition and Pingall Test NOT successful" )
 
     def CASE7( self, main ):
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
 
-        link_sleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
+        linkSleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
         main.log.report(
-            "This testscase is killing a link to ensure that link discovery is consistent" )
+            "This testscase is killing a link to" +
+            " ensure that link discovery is consistent" )
         main.log.report( "__________________________________" )
         main.case(
-            "Killing a link to Ensure that Link Discovery is Working Properly" )
+            "Killing a link to Ensure that Link" +
+            " Discovery is Working Properly" )
         main.step( "Start continuous pings" )
 
         main.Mininet2.pingLong(
@@ -602,10 +635,10 @@
             pingTime=500 )
 
         main.step( "Determine the current number of switches and links" )
-        topology_output = main.ONOScli1.topology()
-        topology_result = main.ONOSbench.get_topology( topology_output )
-        activeSwitches = topology_result[ 'devices' ]
-        links = topology_result[ 'links' ]
+        topologyOutput = main.ONOScli1.topology()
+        topologyResult = main.ONOSbench.getTopology( topologyOutput )
+        activeSwitches = topologyResult[ 'devices' ]
+        links = topologyResult[ 'links' ]
         print "activeSwitches = ", type( activeSwitches )
         print "links = ", type( links )
         main.log.info(
@@ -614,42 +647,43 @@
 
         main.step( "Kill Link between s3 and s28" )
         main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
-        time.sleep( link_sleep )
-        topology_output = main.ONOScli2.topology()
-        Link_Down = main.ONOSbench.check_status(
-            topology_output, activeSwitches, str(
+        time.sleep( linkSleep )
+        topologyOutput = main.ONOScli2.topology()
+        LinkDown = main.ONOSbench.checkStatus(
+            topologyOutput, activeSwitches, str(
                 int( links ) - 2 ) )
-        if Link_Down == main.TRUE:
+        if LinkDown == main.TRUE:
             main.log.report( "Link Down discovered properly" )
-        utilities.assert_equals(
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=Link_Down,
+            actual=LinkDown,
             onpass="Link Down discovered properly",
             onfail="Link down was not discovered in " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " seconds" )
 
         main.step( "Bring link between s3 and s28 back up" )
-        Link_Up = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
-        time.sleep( link_sleep )
-        topology_output = main.ONOScli2.topology()
-        Link_Up = main.ONOSbench.check_status(
-            topology_output,
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
+        time.sleep( linkSleep )
+        topologyOutput = main.ONOScli2.topology()
+        LinkUp = main.ONOSbench.checkStatus(
+            topologyOutput,
             activeSwitches,
             str( links ) )
-        if Link_Up == main.TRUE:
+        if LinkUp == main.TRUE:
             main.log.report( "Link up discovered properly" )
-        utilities.assert_equals(
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=Link_Up,
+            actual=LinkUp,
             onpass="Link up discovered properly",
             onfail="Link up was not discovered in " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " seconds" )
 
         main.step( "Compare ONOS Topology to MN Topology" )
         main.case(
-            "Testing Mininet topology with the topology of multi instances ONOS" )
+            "Testing Mininet topology with the" +
+            " topology of multi instances ONOS" )
         main.step( "Collecting topology information from ONOS" )
         devices1 = main.ONOScli1.devices()
         devices2 = main.ONOScli2.devices()
@@ -742,78 +776,83 @@
             ctrls )  # can also add Intent API info for intent operations
         MNTopo = Topo
 
-        Topology_Check = main.TRUE
+        TopologyCheck = main.TRUE
         main.step( "Compare ONOS Topology to MN Topology" )
 
-        switches_results1 = main.Mininet1.compare_switches(
+        switchesResults1 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices1 ) )
-        print "switches_Result1 = ", switches_results1
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results1,
-                                 onpass="ONOS1 Switches view is correct",
-                                 onfail="ONOS1 Switches view is incorrect" )
+        print "switches_Result1 = ", switchesResults1
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults1,
+                                onpass="ONOS1 Switches view is correct",
+                                onfail="ONOS1 Switches view is incorrect" )
 
-        switches_results2 = main.Mininet1.compare_switches(
+        switchesResults2 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results2,
-                                 onpass="ONOS2 Switches view is correct",
-                                 onfail="ONOS2 Switches view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults2,
+                                onpass="ONOS2 Switches view is correct",
+                                onfail="ONOS2 Switches view is incorrect" )
 
-        switches_results3 = main.Mininet1.compare_switches(
+        switchesResults3 = main.Mininet1.compareSwitches(
             MNTopo,
             json.loads( devices3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=switches_results3,
-                                 onpass="ONOS3 Switches view is correct",
-                                 onfail="ONOS3 Switches view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=switchesResults3,
+                                onpass="ONOS3 Switches view is correct",
+                                onfail="ONOS3 Switches view is incorrect" )
 
         """
-        ports_results1 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports1 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results1,
+        portsResults1 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports1 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults1,
                 onpass="ONOS1 Ports view is correct",
                 onfail="ONOS1 Ports view is incorrect" )
 
-        ports_results2 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results2,
+        portsResults2 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports2 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults2,
                 onpass="ONOS2 Ports view is correct",
                 onfail="ONOS2 Ports view is incorrect" )
 
-        ports_results3 =  main.Mininet1.compare_ports( MNTopo, json.loads( ports3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=ports_results3,
+        portsResults3 =  main.Mininet1.comparePorts( MNTopo,
+        json.loads( ports3 ) )
+        utilities.assertEquals( expect=main.TRUE, actual=portsResults3,
                 onpass="ONOS3 Ports view is correct",
                 onfail="ONOS3 Ports view is incorrect" )
         """
-        links_results1 = main.Mininet1.compare_links(
+        linksResults1 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links1 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results1,
-                                 onpass="ONOS1 Links view is correct",
-                                 onfail="ONOS1 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults1,
+                                onpass="ONOS1 Links view is correct",
+                                onfail="ONOS1 Links view is incorrect" )
 
-        links_results2 = main.Mininet1.compare_links(
+        linksResults2 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links2 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results2,
-                                 onpass="ONOS2 Links view is correct",
-                                 onfail="ONOS2 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults2,
+                                onpass="ONOS2 Links view is correct",
+                                onfail="ONOS2 Links view is incorrect" )
 
-        links_results3 = main.Mininet1.compare_links(
+        linksResults3 = main.Mininet1.compareLinks(
             MNTopo,
             json.loads( links3 ) )
-        utilities.assert_equals( expect=main.TRUE, actual=links_results3,
-                                 onpass="ONOS2 Links view is correct",
-                                 onfail="ONOS2 Links view is incorrect" )
+        utilities.assertEquals( expect=main.TRUE, actual=linksResults3,
+                                onpass="ONOS2 Links view is correct",
+                                onfail="ONOS2 Links view is incorrect" )
 
-        #topo_result = switches_results1 and switches_results2 and switches_results3\
-        # and ports_results1 and ports_results2 and ports_results3\
-        # and links_results1 and links_results2 and links_results3
+        # topoResult = switchesResults1 and switchesResults2
+        # and switchesResults3\
+        # and portsResults1 and portsResults2 and portsResults3\
+        # and linksResults1 and linksResults2 and linksResults3
 
-        topo_result = switches_results1 and switches_results2 and switches_results3\
-            and links_results1 and links_results2 and links_results3
+        topoResult = switchesResults1 and switchesResults2\
+                and switchesResults3 and linksResults1 and\
+                linksResults2 and linksResults3
 
-        utilities.assert_equals(
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=topo_result and Link_Up and Link_Down,
+            actual=topoResult and LinkUp and LinkDown,
             onpass="Topology Check Test successful",
             onfail="Topology Check Test NOT successful" )
 
@@ -822,16 +861,16 @@
         Intent removal
         """
         main.log.report(
-            "This testcase removes host any previously added intents" )
+            "This testcase removes any previously added intents" )
         main.log.report( "__________________________________" )
         main.log.info( "Removing any previously installed intents" )
         main.case( "Removing intents" )
         main.step( "Obtain the intent id's" )
-        intent_result = main.ONOScli1.intents( json_format=False )
+        intentResult = main.ONOScli1.intents( jsonFormat=False )
 
-        intent_linewise = intent_result.split( "\n" )
+        intentLinewise = intentResult.split( "\n" )
         intentList = []
-        for line in intent_linewise:
+        for line in intentLinewise:
             if line.startswith( "id=" ):
                 intentList.append( line )
 
@@ -844,14 +883,14 @@
         main.step(
             "Iterate through the intentids list and remove each intent" )
         for id in intentids:
-            main.ONOScli1.remove_intent( intent_id=id )
+            main.ONOScli1.removeIntent( intentId=id )
 
-        intent_result = main.ONOScli1.intents( json_format=False )
-        main.log.info( "intent_result = " + intent_result )
-        case8_result = main.TRUE
+        intentResult = main.ONOScli1.intents( jsonFormat=False )
+        main.log.info( "intent_result = " + intentResult )
+        case8Result = main.TRUE
 
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         while i < 18:
             main.log.info(
                 "\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
@@ -859,227 +898,241 @@
                 src="h" + str( i ), target="h" + str( i + 10 ) )
             if ping == main.TRUE:
                 i = 19
-                Ping_Result = main.TRUE
+                PingResult = main.TRUE
             elif ping == main.FALSE:
                 i += 1
-                Ping_Result = main.FALSE
+                PingResult = main.FALSE
             else:
                 main.log.info( "Unknown error" )
-                Ping_Result = main.ERROR
+                PingResult = main.ERROR
 
         # Note: If the ping result failed, that means the intents have been
         # withdrawn correctly.
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report( "Host intents have not been withdrawn correctly" )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.FALSE:
+        if PingResult == main.FALSE:
             main.log.report( "Host intents have been withdrawn correctly" )
 
-        case8_result = case8_result and Ping_Result
+        case8Result = case8Result and PingResult
 
-        if case8_result == main.FALSE:
+        if case8Result == main.FALSE:
             main.log.report( "Intent removal successful" )
         else:
             main.log.report( "Intent removal failed" )
 
-        utilities.assert_equals( expect=main.FALSE, actual=case8_result,
-                                 onpass="Intent removal test failed",
-                                 onfail="Intent removal test successful" )
+        utilities.assertEquals( expect=main.FALSE, actual=case8Result,
+                                onpass="Intent removal test failed",
+                                onfail="Intent removal test successful" )
 
     def CASE9( self ):
         """
-        This test case adds point intents. Make sure you run test case 8 which is host intent removal before executing this test case.
-        Else the host intent's flows will persist on switches and the pings would work even if there is some issue with the point intent's flows
+        This test case adds point intents. Make sure you run test case 8
+        which is host intent removal before executing this test case.
+        Else the host intent's flows will persist on switches and the pings
+        would work even if there is some issue with the point intent's flows
         """
         main.log.report(
             "This testcase adds point intents and then does pingall" )
         main.log.report( "__________________________________" )
         main.log.info( "Adding point intents" )
         main.case(
-            "Adding bidirectional point for mn hosts(h8-h18,h9-h19,h10-h20,h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
+            "Adding bidirectional point for mn hosts(h8-h18,h9-h19,h10-h20," +
+            "h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
         main.step(
-            "Add point-to-point intents for mininet hosts h8 and h18 or ONOS hosts h8 and h12" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts" +
+            " h8 and h18 or ONOS hosts h8 and h12" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003008/1",
             "of:0000000000006018/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006018/1",
             "of:0000000000003008/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h9 and h19 or ONOS hosts h9 and h13" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts" +
+            " h9 and h19 or ONOS hosts h9 and h13" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003009/1",
             "of:0000000000006019/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006019/1",
             "of:0000000000003009/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h10 and h20 or ONOS hosts hA and h14" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet" +
+            " hosts h10 and h20 or ONOS hosts hA and h14" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003010/1",
             "of:0000000000006020/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006020/1",
             "of:0000000000003010/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h11 and h21 or ONOS hosts hB and h15" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet" +
+            " hosts h11 and h21 or ONOS hosts hB and h15" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003011/1",
             "of:0000000000006021/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006021/1",
             "of:0000000000003011/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h12 and h22 or ONOS hosts hC and h16" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet" +
+            " hosts h12 and h22 or ONOS hosts hC and h16" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003012/1",
             "of:0000000000006022/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006022/1",
             "of:0000000000003012/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h13 and h23 or ONOS hosts hD and h17" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet " +
+            "hosts h13 and h23 or ONOS hosts hD and h17" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003013/1",
             "of:0000000000006023/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006023/1",
             "of:0000000000003013/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h14 and h24 or ONOS hosts hE and h18" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts" +
+            " h14 and h24 or ONOS hosts hE and h18" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003014/1",
             "of:0000000000006024/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006024/1",
             "of:0000000000003014/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h15 and h25 or ONOS hosts hF and h19" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts" +
+            " h15 and h25 or ONOS hosts hF and h19" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003015/1",
             "of:0000000000006025/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006025/1",
             "of:0000000000003015/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h16 and h26 or ONOS hosts h10 and h1A" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts" +
+            " h16 and h26 or ONOS hosts h10 and h1A" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003016/1",
             "of:0000000000006026/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006026/1",
             "of:0000000000003016/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         main.step(
-            "Add point-to-point intents for mininet hosts h17 and h27 or ONOS hosts h11 and h1B" )
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+            "Add point-to-point intents for mininet hosts h17" +
+            " and h27 or ONOS hosts h11 and h1B" )
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000003017/1",
             "of:0000000000006027/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOScli1.add_point_intent(
+        ptpIntentResult = main.ONOScli1.addPointIntent(
             "of:0000000000006027/1",
             "of:0000000000003017/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOScli1.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOScli1.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
         print(
-            "_______________________________________________________________________________________" )
+            "_______________________________________________________" +
+            "________________________________" )
 
         flowHandle = main.ONOScli1.flows()
         # print "flowHandle = ", flowHandle
@@ -1087,7 +1140,7 @@
 
         count = 1
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         while i < 18:
             main.log.info(
                 "\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
@@ -1095,8 +1148,8 @@
                 src="h" + str( i ), target="h" + str( i + 10 ) )
             if ping == main.FALSE and count < 5:
                 count += 1
-                #i = 8
-                Ping_Result = main.FALSE
+                # i = 8
+                PingResult = main.FALSE
                 main.log.report( "Ping between h" +
                                  str( i ) +
                                  " and h" +
@@ -1114,7 +1167,7 @@
                                       10 ) +
                                  "have failed" )
                 i = 19
-                Ping_Result = main.FALSE
+                PingResult = main.FALSE
             elif ping == main.TRUE:
                 main.log.info( "Ping test between h" +
                                str( i ) +
@@ -1123,98 +1176,104 @@
                                     10 ) +
                                "passed!" )
                 i += 1
-                Ping_Result = main.TRUE
+                PingResult = main.TRUE
             else:
                 main.log.info( "Unknown error" )
-                Ping_Result = main.ERROR
-        if Ping_Result == main.FALSE:
+                PingResult = main.ERROR
+        if PingResult == main.FALSE:
             main.log.report(
-                "Ping all test after Point intents addition failed. Cleaning up" )
+                "Ping all test after Point intents" +
+                " addition failed. Cleaning up" )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report(
                 "Ping all test after Point intents addition successful" )
 
-        case8_result = Ping_Result
-        utilities.assert_equals(
+        case8Result = PingResult
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case8_result,
+            actual=case8Result,
             onpass="Ping all test after Point intents addition successful",
             onfail="Ping all test after Point intents addition failed" )
 
     def CASE31( self ):
         """
-            This test case adds point intent related to SDN-IP matching on ICMP ( ethertype=IPV4, ipProto=1 )
+            This test case adds point intent related to
+            SDN-IP matching on ICMP ( ethertype=IPV4, ipProto=1 )
         """
         import json
 
         main.log.report(
-            "This test case adds point intent related to SDN-IP matching on ICMP" )
+            "This test case adds point intent " +
+            "related to SDN-IP matching on ICMP" )
         main.case(
-            "Adding bidirectional point intent related to SDN-IP matching on ICMP" )
+            "Adding bidirectional point intent related" +
+            " to SDN-IP matching on ICMP" )
         main.step( "Adding bidirectional point intent" )
         # add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32
         # --ethType=IPV4 --ipProto=1  of:0000000000003008/1
         # of:0000000000006018/1
 
-        hosts_json = json.loads( main.ONOScli1.hosts() )
+        hostsJson = json.loads( main.ONOScli1.hosts() )
         for i in range( 8, 11 ):
             main.log.info(
-                "Adding point intent between h" + str( i ) + " and h" + str( i + 10 ) )
+                "Adding point intent between h" + str( i ) +
+                " and h" + str( i + 10 ) )
             host1 = "00:00:00:00:00:" + \
                 str( hex( i )[ 2: ] ).zfill( 2 ).upper()
             host2 = "00:00:00:00:00:" + \
                 str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
-            host1_id = main.ONOScli1.get_host( host1 )[ 'id' ]
-            host2_id = main.ONOScli1.get_host( host2 )[ 'id' ]
-            for host in hosts_json:
-                if host[ 'id' ] == host1_id:
+            host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
+            host2Id = main.ONOScli1.getHost( host2 )[ 'id' ]
+            for host in hostsJson:
+                if host[ 'id' ] == host1Id:
                     ip1 = host[ 'ips' ][ 0 ]
                     ip1 = str( ip1 + "/32" )
                     device1 = host[ 'location' ][ 'device' ]
                     device1 = str( device1 + "/1" )
-                elif host[ 'id' ] == host2_id:
+                elif host[ 'id' ] == host2Id:
                     ip2 = str( host[ 'ips' ][ 0 ] ) + "/32"
                     device2 = host[ 'location' ][ "device" ]
                     device2 = str( device2 + "/1" )
 
-            p_intent_result1 = main.ONOScli1.add_point_intent(
-                ingress_device=device1,
-                egress_device=device2,
+            pIntentResult1 = main.ONOScli1.addPointIntent(
+                ingressDevice=device1,
+                egressDevice=device2,
                 ipSrc=ip1,
                 ipDst=ip2,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'icmpProto' ] )
 
-            get_intent_result = main.ONOScli1.intents( json_format=False )
-            main.log.info( get_intent_result )
+            getIntentResult = main.ONOScli1.intents( jsonFormat=False )
+            main.log.info( getIntentResult )
 
-            p_intent_result2 = main.ONOScli1.add_point_intent(
-                ingress_device=device2,
-                egress_device=device1,
+            pIntentResult2 = main.ONOScli1.addPointIntent(
+                ingressDevice=device2,
+                egressDevice=device1,
                 ipSrc=ip2,
                 ipDst=ip1,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'icmpProto' ] )
 
-            get_intent_result = main.ONOScli1.intents( json_format=False )
-            main.log.info( get_intent_result )
-            if ( p_intent_result1 and p_intent_result2 ) == main.TRUE:
-                #get_intent_result = main.ONOScli1.intents()
-                # main.log.info( get_intent_result )
+            getIntentResult = main.ONOScli1.intents( jsonFormat=False )
+            main.log.info( getIntentResult )
+            if ( pIntentResult1 and pIntentResult2 ) == main.TRUE:
+                # getIntentResult = main.ONOScli1.intents()
+                # main.log.info( getIntentResult )
                 main.log.info(
-                    "Point intent related to SDN-IP matching on ICMP install successful" )
+                    "Point intent related to SDN-IP matching" +
+                    " on ICMP install successful" )
 
         time.sleep( 15 )
-        get_intent_result = main.ONOScli1.intents( json_format=False )
-        main.log.info( "intents = " + get_intent_result )
-        get_flows_result = main.ONOScli1.flows()
-        main.log.info( "flows = " + get_flows_result )
+        getIntentResult = main.ONOScli1.intents( jsonFormat=False )
+        main.log.info( "intents = " + getIntentResult )
+        getFlowsResult = main.ONOScli1.flows()
+        main.log.info( "flows = " + getFlowsResult )
 
         count = 1
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         while i < 11:
             main.log.info(
                 "\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
@@ -1222,8 +1281,8 @@
                 src="h" + str( i ), target="h" + str( i + 10 ) )
             if ping == main.FALSE and count < 3:
                 count += 1
-                #i = 8
-                Ping_Result = main.FALSE
+                # i = 8
+                PingResult = main.FALSE
                 main.log.report( "Ping between h" +
                                  str( i ) +
                                  " and h" +
@@ -1241,7 +1300,7 @@
                                       10 ) +
                                  "have failed" )
                 i = 19
-                Ping_Result = main.FALSE
+                PingResult = main.FALSE
             elif ping == main.TRUE:
                 main.log.info( "Ping test between h" +
                                str( i ) +
@@ -1250,150 +1309,186 @@
                                     10 ) +
                                "passed!" )
                 i += 1
-                Ping_Result = main.TRUE
+                PingResult = main.TRUE
             else:
                 main.log.info( "Unknown error" )
-                Ping_Result = main.ERROR
-        if Ping_Result == main.FALSE:
+                PingResult = main.ERROR
+        if PingResult == main.FALSE:
             main.log.report(
-                "Ping test after Point intents related to SDN-IP matching on ICMP failed." )
+                "Ping test after Point intents related to" +
+                " SDN-IP matching on ICMP failed." )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report(
-                "Ping all test after Point intents related to SDN-IP matching on ICMP successful" )
+                "Ping all test after Point intents related to" +
+                " SDN-IP matching on ICMP successful" )
 
-        case31_result = Ping_Result and p_intent_result1 and p_intent_result2
-        utilities.assert_equals(
+        case31Result = PingResult and pIntentResult1 and pIntentResult2
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case31_result,
-            onpass="Point intent related to SDN-IP matching on ICMP and ping test successful",
-            onfail="Point intent related to SDN-IP matching on ICMP and ping test failed" )
+            actual=case31Result,
+            onpass="Point intent related to SDN-IP " +
+            "matching on ICMP and ping test successful",
+            onfail="Point intent related to SDN-IP" +
+            " matching on ICMP and ping test failed" )
 
     def CASE32( self ):
         """
-            This test case adds point intent related to SDN-IP matching on TCP ( ethertype=IPV4, ipProto=6, DefaultPort for iperf=5001 )
-            Note: Although BGP port is 179, we are using 5001 because iperf is used for verifying and iperf's default port is 5001
+            This test case adds point intent related to SDN-IP matching on TCP
+            ( ethertype=IPV4, ipProto=6, DefaultPort for iperf=5001 )
+            Note: Although BGP port is 179, we are using 5001 because iperf
+            is used for verifying and iperf's default port is 5001
         """
         import json
 
         main.log.report(
-            "This test case adds point intent related to SDN-IP matching on TCP" )
+            "This test case adds point intent" +
+            " related to SDN-IP matching on TCP" )
         main.case(
-            "Adding bidirectional point intent related to SDN-IP matching on TCP" )
+            "Adding bidirectional point intent related" +
+            " to SDN-IP matching on TCP" )
         main.step( "Adding bidirectional point intent" )
         """
-        add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32 --ethType=IPV4 --ipProto=6 --tcpDst=5001  of:0000000000003008/1 of:0000000000006018/1
+        add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32
+        --ethType=IPV4 --ipProto=6 --tcpDst=5001  of:0000000000003008/1
+        of:0000000000006018/1
 
-        add-point-intent --ipSrc=10.0.0.18/32 --ipDst=10.0.0.8/32 --ethType=IPV4 --ipProto=6 --tcpDst=5001  of:0000000000006018/1 of:0000000000003008/1
+        add-point-intent --ipSrc=10.0.0.18/32 --ipDst=10.0.0.8/32
+        --ethType=IPV4 --ipProto=6 --tcpDst=5001  of:0000000000006018/1
+        of:0000000000003008/1
 
-        add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32 --ethType=IPV4 --ipProto=6 --tcpSrc=5001  of:0000000000003008/1 of:0000000000006018/1
+        add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32
+        --ethType=IPV4 --ipProto=6 --tcpSrc=5001  of:0000000000003008/1
+        of:0000000000006018/1
 
-        add-point-intent --ipSrc=10.0.0.18/32 --ipDst=10.0.0.8/32 --ethType=IPV4 --ipProto=6 --tcpSrc=5001  of:0000000000006018/1 of:0000000000003008/1
+        add-point-intent --ipSrc=10.0.0.18/32 --ipDst=10.0.0.8/32
+        --ethType=IPV4 --ipProto=6 --tcpSrc=5001  of:0000000000006018/1
+        of:0000000000003008/1
 
         """
-        hosts_json = json.loads( main.ONOScli1.hosts() )
+        hostsJson = json.loads( main.ONOScli1.hosts() )
         for i in range( 8, 9 ):
             main.log.info(
-                "Adding point intent between h" + str( i ) + " and h" + str( i + 10 ) )
+                "Adding point intent between h" + str( i ) +
+                " and h" + str( i + 10 ) )
             host1 = "00:00:00:00:00:" + \
                 str( hex( i )[ 2: ] ).zfill( 2 ).upper()
             host2 = "00:00:00:00:00:" + \
                 str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
-            host1_id = main.ONOScli1.get_host( host1 )[ 'id' ]
-            host2_id = main.ONOScli1.get_host( host2 )[ 'id' ]
-            for host in hosts_json:
-                if host[ 'id' ] == host1_id:
+            host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
+            host2Id = main.ONOScli1.getHost( host2 )[ 'id' ]
+            for host in hostsJson:
+                if host[ 'id' ] == host1Id:
                     ip1 = host[ 'ips' ][ 0 ]
                     ip1 = str( ip1 + "/32" )
                     device1 = host[ 'location' ][ 'device' ]
                     device1 = str( device1 + "/1" )
-                elif host[ 'id' ] == host2_id:
+                elif host[ 'id' ] == host2Id:
                     ip2 = str( host[ 'ips' ][ 0 ] ) + "/32"
                     device2 = host[ 'location' ][ "device" ]
                     device2 = str( device2 + "/1" )
 
-            p_intent_result1 = main.ONOScli1.add_point_intent(
-                ingress_device=device1,
-                egress_device=device2,
+            pIntentResult1 = main.ONOScli1.addPointIntent(
+                ingressDevice=device1,
+                egressDevice=device2,
                 ipSrc=ip1,
                 ipDst=ip2,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
                 tcpDst=main.params[ 'SDNIP' ][ 'dstPort' ] )
-            p_intent_result2 = main.ONOScli1.add_point_intent(
-                ingress_device=device2,
-                egress_device=device1,
+            pIntentResult2 = main.ONOScli1.addPointIntent(
+                ingressDevice=device2,
+                egressDevice=device1,
                 ipSrc=ip2,
                 ipDst=ip1,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
                 tcpDst=main.params[ 'SDNIP' ][ 'dstPort' ] )
 
-            p_intent_result3 = main.ONOScli1.add_point_intent(
-                ingress_device=device1,
-                egress_device=device2,
+            pIntentResult3 = main.ONOScli1.addPointIntent(
+                ingressDevice=device1,
+                egressDevice=device2,
                 ipSrc=ip1,
                 ipDst=ip2,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
                 tcpSrc=main.params[ 'SDNIP' ][ 'srcPort' ] )
-            p_intent_result4 = main.ONOScli1.add_point_intent(
-                ingress_device=device2,
-                egress_device=device1,
+            pIntentResult4 = main.ONOScli1.addPointIntent(
+                ingressDevice=device2,
+                egressDevice=device1,
                 ipSrc=ip2,
                 ipDst=ip1,
                 ethType=main.params[ 'SDNIP' ][ 'ethType' ],
                 ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
                 tcpSrc=main.params[ 'SDNIP' ][ 'srcPort' ] )
 
-            p_intent_result = p_intent_result1 and p_intent_result2 and p_intent_result3 and p_intent_result4
-            if p_intent_result == main.TRUE:
-                get_intent_result = main.ONOScli1.intents( json_format=False )
-                main.log.info( get_intent_result )
-                main.log.info(
-                    "Point intent related to SDN-IP matching on TCP install successful" )
+            pIntentResult = pIntentResult1 and pIntentResult2 and\
+                    pIntentResult3 and pIntentResult4
+            if pIntentResult == main.TRUE:
+                getIntentResult = main.ONOScli1.intents( jsonFormat=False )
+                main.log.info( getIntentResult )
+                main.log.report(
+                    "Point intent related to SDN-IP matching" +
+                    " on TCP install successful" )
+            else:
+                main.log.report(
+                    "Point intent related to SDN-IP matching" +
+                    " on TCP install failed" )
 
-        iperf_result = main.Mininet1.iperf( 'h8', 'h18' )
-        if iperf_result == main.TRUE:
+        iperfResult = main.Mininet1.iperf( 'h8', 'h18' )
+        if iperfResult == main.TRUE:
             main.log.report( "iperf test successful" )
         else:
             main.log.report( "iperf test failed" )
 
-        case32_result = p_intent_result and iperf_result
-        utilities.assert_equals(
+        case32Result = pIntentResult and iperfResult
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case32_result,
-            onpass="Ping all test after Point intents addition related to SDN-IP on TCP match successful",
-            onfail="Ping all test after Point intents addition related to SDN-IP on TCP match failed" )
+            actual=case32Result,
+            onpass="Ping all test after Point intents addition related " +
+            "to SDN-IP on TCP match successful",
+            onfail="Ping all test after Point intents addition related " +
+            "to SDN-IP on TCP match failed" )
 
     def CASE33( self ):
         """
-            This test case adds multipoint to singlepoint  intent related to SDN-IP matching on destination ip and the action is to rewrite the mac address
-            Here the mac address to be rewritten is the mac address of the egress device
+            This test case adds multipoint to singlepoint  intent related to
+            SDN-IP matching on destination ip and the action is to rewrite
+            the mac address
+            Here the mac address to be rewritten is the mac address of the
+            egress device
         """
         import json
         import time
 
         main.log.report(
-            "This test case adds multipoint to singlepoint intent related to SDN-IP matching on destination ip and rewrite mac address action" )
+            "This test case adds multipoint to singlepoint intent related to" +
+            " SDN-IP matching on destination ip and " +
+            "rewrite mac address action" )
         main.case(
-            "Adding multipoint to singlepoint intent related to SDN-IP matching on destination ip" )
+            "Adding multipoint to singlepoint intent related to SDN-IP" +
+            " matching on destination ip" )
         main.step( "Adding bidirectional multipoint to singlepoint intent" )
         """
-        add-multi-to-single-intent --ipDst=10.0.3.0/24 --setEthDst=00:00:00:00:00:12 of:0000000000003008/1 0000000000003009/1 of:0000000000006018/1
+        add-multi-to-single-intent --ipDst=10.0.3.0/24
+        --setEthDst=00:00:00:00:00:12 of:0000000000003008/1 0000000000003009/1
+        of:0000000000006018/1
 
-        add-multi-to-single-intent --ipDst=10.0.1.0/24 --setEthDst=00:00:00:00:00:08 of:0000000000006018/1 0000000000003009/1 of:0000000000003008/1
+        add-multi-to-single-intent --ipDst=10.0.1.0/24
+        --setEthDst=00:00:00:00:00:08 of:0000000000006018/1 0000000000003009/1
+        of:0000000000003008/1
         """
         main.case(
-            "Installing multipoint to single point intent with rewrite mac address" )
+            "Installing multipoint to single point " +
+            "intent with rewrite mac address" )
         main.step( "Uninstalling proxy arp app" )
         # Unistall onos-app-proxyarp app to disable reactive forwarding
-        appUninstall_result1 = main.ONOScli1.feature_uninstall(
+        appUninstallResult1 = main.ONOScli1.featureUninstall(
             "onos-app-proxyarp" )
-        appUninstall_result2 = main.ONOScli2.feature_uninstall(
+        appUninstallResult2 = main.ONOScli2.featureUninstall(
             "onos-app-proxyarp" )
-        appUninstall_result3 = main.ONOScli3.feature_uninstall(
+        appUninstallResult3 = main.ONOScli3.featureUninstall(
             "onos-app-proxyarp" )
         main.log.info( "onos-app-proxyarp uninstalled" )
 
@@ -1420,7 +1515,8 @@
         main.Mininet1.changeDefaultGateway( host='h10', newGW='10.0.3.254' )
 
         main.step(
-            "Assigning random mac address to the default gateways since proxyarp app is uninstalled" )
+            "Assigning random mac address to the default gateways " +
+            "since proxyarp app is uninstalled" )
         main.Mininet1.addStaticMACAddress(
             host='h8',
             GW='10.0.1.254',
@@ -1440,37 +1536,37 @@
         main.Mininet1.verifyStaticGWandMAC( host='h10' )
 
         main.step( "Adding multipoint to singlepoint intent" )
-        p_intent_result1 = main.ONOScli1.add_multipoint_to_singlepoint_intent(
-            ingress_device1=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
-            ingress_device2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
-            egress_device=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
+        pIntentResult1 = main.ONOScli1.addMultipointToSinglepointIntent(
+            ingressDevice1=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
+            ingressDevice2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
+            egressDevice=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
             ipDst=main.params[ 'MULTIPOINT_INTENT' ][ 'ip1' ],
             setEthDst=main.params[ 'MULTIPOINT_INTENT' ][ 'mac1' ] )
 
-        p_intent_result2 = main.ONOScli1.add_multipoint_to_singlepoint_intent(
-            ingress_device1=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
-            ingress_device2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
-            egress_device=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
+        pIntentResult2 = main.ONOScli1.addMultipointToSinglepointIntent(
+            ingressDevice1=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
+            ingressDevice2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
+            egressDevice=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
             ipDst=main.params[ 'MULTIPOINT_INTENT' ][ 'ip2' ],
             setEthDst=main.params[ 'MULTIPOINT_INTENT' ][ 'mac2' ] )
 
-        get_intent_result = main.ONOScli1.intents( json_format=False )
-        main.log.info( "intents = " + get_intent_result )
+        getIntentResult = main.ONOScli1.intents( jsonFormat=False )
+        main.log.info( "intents = " + getIntentResult )
 
         time.sleep( 10 )
-        get_flows_result = main.ONOScli1.flows( json_format=False )
-        main.log.info( "flows = " + get_flows_result )
+        getFlowsResult = main.ONOScli1.flows( jsonFormat=False )
+        main.log.info( "flows = " + getFlowsResult )
 
         count = 1
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
 
         main.log.info( "\n\nh" + str( i ) + " is Pinging h" + str( i + 2 ) )
         ping = main.Mininet1.pingHost(
             src="h" + str( i ), target="h" + str( i + 2 ) )
         if ping == main.FALSE and count < 3:
             count += 1
-            Ping_Result = main.FALSE
+            PingResult = main.FALSE
             main.log.report( "Ping between h" +
                              str( i ) +
                              " and h" +
@@ -1487,7 +1583,7 @@
                              str( i +
                                   10 ) +
                              "have failed" )
-            Ping_Result = main.FALSE
+            PingResult = main.FALSE
         elif ping == main.TRUE:
             main.log.info( "Ping test between h" +
                            str( i ) +
@@ -1495,29 +1591,33 @@
                            str( i +
                                 2 ) +
                            "passed!" )
-            Ping_Result = main.TRUE
+            PingResult = main.TRUE
         else:
             main.log.info( "Unknown error" )
-            Ping_Result = main.ERROR
+            PingResult = main.ERROR
 
-        if Ping_Result == main.FALSE:
+        if PingResult == main.FALSE:
             main.log.report( "Ping test failed." )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report( "Ping all successful" )
 
-        p_intent_result = p_intent_result1 and p_intent_result2
-        if p_intent_result == main.TRUE:
+        pIntentResult = pIntentResult1 and pIntentResult2
+        if pIntentResult == main.TRUE:
             main.log.info(
-                "Multi point intent with rewrite mac address installation successful" )
+                "Multi point intent with rewrite mac " +
+                "address installation successful" )
         else:
             main.log.info(
-                "Multi point intent with rewrite mac address installation failed" )
+                "Multi point intent with rewrite mac" +
+                " address installation failed" )
 
-        case33_result = p_intent_result and Ping_Result
-        utilities.assert_equals(
+        case33Result = pIntentResult and PingResult
+        utilities.assertEquals(
             expect=main.TRUE,
-            actual=case33_result,
-            onpass="Ping all test after multipoint to single point intent addition with rewrite mac address successful",
-            onfail="Ping all test after multipoint to single point intent addition with rewrite mac address failed" )
+            actual=case33Result,
+            onpass="Ping all test after multipoint to single point" +
+            " intent addition with rewrite mac address successful",
+            onfail="Ping all test after multipoint to single point intent" +
+            " addition with rewrite mac address failed" )
diff --git a/TestON/tests/MultiProd13/__init__.py b/TestON/tests/MultiProd13/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/MultiProd13/__init__.py
diff --git a/TestON/tests/OnosCHO/OnosCHO.params b/TestON/tests/OnosCHO/OnosCHO.params
index c0325a9..edc7540 100644
--- a/TestON/tests/OnosCHO/OnosCHO.params
+++ b/TestON/tests/OnosCHO/OnosCHO.params
@@ -1,5 +1,5 @@
 <PARAMS>
-    #CHO sequence : 1,2,3,[4,5,6,5,7,8,5,10,5,9,5,7,8,5,10,5]*2
+    #CHO sequence : 1,2,3,[4,5,6,5,70,80,5,10,5,9,5,71,81,5,10,5]*100
     # 1. ONOS brinup Test case
     # 2. Assign and Balance all Mininet switches across controllers
     # 3. Collect reference toplogy for topo compare
@@ -10,41 +10,56 @@
     # 8. Bring core links Up that were down and verify pingall
     # 9. Install 114 point intents and verify ping all
     # 10. Remove all intents on ONOS
-    # 1,2,3,[4,5,6,5,7,8,5,10,5,9,5,7,8,5,10,5]*2
+    # 1,2,3,[4,5,6,5,70,80,5,10,5,9,5,71,81,5,10,5]*100
+    # 1,2,3,4,5,6,10,12,3,4,5,6,10,13,3,4,5,6,10
 
-    <testcases>1,2,3,[4,5,6,5,70,80,5,10,5,9,5,71,81,5,10,5]*100</testcases>
+    <testcases>1,2,3,4,5,6,10</testcases>
     <ENV>
-        <cellName>choTest5</cellName>
+        <cellName>fiveNodes</cellName>
     </ENV>
     <GIT>
         #autoPull 'on' or 'off'
-        <autoPull>on</autoPull>
+        <autoPull>off</autoPull>
         <branch>master</branch>
     </GIT>
+    <TOPO1>
+	<topo>~/mininet/custom/topoAtt.py</topo>
+	<numSwitches>25</numSwitches>
+	<numHosts>25</numHosts>
+	<numLinks>114</numLinks>
+	<numPaths>1</numPaths>
+    </TOPO1>
+    <TOPO2>
+	<topo>~/mininet/custom/topoChordal.py</topo>
+	<numSwitches>25</numSwitches>
+	<numHosts>25</numHosts>
+	<numLinks>600</numLinks>
+	<numPaths>1</numPaths>
+    </TOPO2>
+    <TOPO3>
+	<topo>~/mininet/custom/topoSpine.py</topo>
+	<numSwitches>78</numSwitches>
+	<numHosts>68</numHosts>
+	<numLinks>284</numLinks>
+	<numPaths>1</numPaths>
+    </TOPO3>
     <CTRL>
 	<numCtrl>5</numCtrl>
-        <ip1>10.128.40.41</ip1>
+        <ip1>10.128.10.21</ip1>
 	<port1>6633</port1>
-	<ip2>10.128.40.42</ip2>
+	<ip2>10.128.10.22</ip2>
 	<port2>6633</port2>
-	<ip3>10.128.40.43</ip3>
+	<ip3>10.128.10.23</ip3>
 	<port3>6633</port3>
-        <ip4>10.128.40.44</ip4>
+        <ip4>10.128.10.24</ip4>
 	<port4>6633</port4>
-	<ip5>10.128.40.45</ip5>
+	<ip5>10.128.10.25</ip5>
 	<port5>6633</port5>
     </CTRL>
     <HOSTS>
 	<startMAC>00:00:00:00:00:01</startMAC>
 	<endMAC>00:00:00:00:00:19</endMAC>
     </HOSTS>
-    <ONOSTOPO>
-	<numDevices>25</numDevices>
-	<numLinks>114</numLinks>
-	<numHosts>25</numHosts>
-	<numIntents>300</numIntents>
-	<numPaths>1360</numPaths>
-    </ONOSTOPO>
     <CORELINKS>
         <toggleLinks>3</toggleLinks>
 	
diff --git a/TestON/tests/OnosCHO/OnosCHO.py b/TestON/tests/OnosCHO/OnosCHO.py
index 3be5cbb..955d996 100644
--- a/TestON/tests/OnosCHO/OnosCHO.py
+++ b/TestON/tests/OnosCHO/OnosCHO.py
@@ -11,13 +11,6 @@
 
     def __init__( self ):
         self.default = ''
-        global deviceDPIDs
-        global hostMACs
-        global deviceLinks
-        global deviceActiveLinksCount
-        global devicePortsEnabledCount
-        global installedIntents
-        global randomLink1, randomLink2, randomLink3, numSwitches, numLinks
 
     def CASE1( self, main ):
         """
@@ -31,19 +24,39 @@
         onos-wait-for-start
         """
         import time
+
+        global intentState
+        main.threadID = 0
+        main.pingTimeout = 300
+        main.numCtrls = main.params[ 'CTRL' ][ 'numCtrl' ]
+        main.ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
+        main.ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
+        main.ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
+        main.ONOS4_ip = main.params[ 'CTRL' ][ 'ip4' ]
+        main.ONOS5_ip = main.params[ 'CTRL' ][ 'ip5' ]
+        main.ONOS1_port = main.params[ 'CTRL' ][ 'port1' ]
+        main.ONOS2_port = main.params[ 'CTRL' ][ 'port2' ]
+        main.ONOS3_port = main.params[ 'CTRL' ][ 'port3' ]
+        main.ONOS4_port = main.params[ 'CTRL' ][ 'port4' ]
+        main.ONOS5_port = main.params[ 'CTRL' ][ 'port5' ]
         cell_name = main.params[ 'ENV' ][ 'cellName' ]
         git_pull = main.params[ 'GIT' ][ 'autoPull' ]
-        numCtrls = main.params[ 'CTRL' ][ 'numCtrl' ]
         git_branch = main.params[ 'GIT' ][ 'branch' ]
-
+        
+        main.CLIs = []
+        main.nodes = []
+        for i in range( 1, int(main.numCtrls) + 1 ):
+            main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+            main.nodes.append( getattr( main, 'ONOS' + str( i ) ) )
+        
         main.case( "Set up test environment" )
         main.log.report( "Set up test environment" )
         main.log.report( "_______________________" )
 
         main.step( "Git checkout and pull " + git_branch )
         if git_pull == 'on':
-            checkout_result = main.ONOSbench.git_checkout( git_branch )
-            pull_result = main.ONOSbench.git_pull()
+            checkout_result = main.ONOSbench.gitCheckout( git_branch )
+            pull_result = main.ONOSbench.gitPull()
             cp_result = ( checkout_result and pull_result )
         else:
             checkout_result = main.TRUE
@@ -55,45 +68,49 @@
                                  onfail="Test step FAIL" )
 
         main.step( "mvn clean & install" )
-        mvn_result = main.ONOSbench.clean_install()
-        utilities.assert_equals( expect=main.TRUE, actual=mvn_result,
+        if git_pull == 'on':
+            mvn_result = main.ONOSbench.cleanInstall()
+            utilities.assert_equals( expect=main.TRUE, actual=mvn_result,
                                  onpass="Test step PASS",
                                  onfail="Test step FAIL" )
+        else:
+            mvn_result = main.TRUE
+            main.log.info("Skipped mvn clean install as git pull is disabled in params file")
 
-        main.ONOSbench.get_version( report=True )
+        main.ONOSbench.getVersion( report=True )
 
         main.step( "Apply Cell environment for ONOS" )
-        cell_result = main.ONOSbench.set_cell( cell_name )
+        cell_result = main.ONOSbench.setCell( cell_name )
         utilities.assert_equals( expect=main.TRUE, actual=cell_result,
                                  onpass="Test step PASS",
                                  onfail="Test step FAIL" )
 
         main.step( "Create ONOS package" )
-        packageResult = main.ONOSbench.onos_package()
+        packageResult = main.ONOSbench.onosPackage()
         utilities.assert_equals( expect=main.TRUE, actual=packageResult,
                                  onpass="Test step PASS",
                                  onfail="Test step FAIL" )
 
         main.step( "Uninstall ONOS package on all Nodes" )
         uninstallResult = main.TRUE
-        for i in range( 1, int( numCtrls ) + 1 ):
+        for i in range( 1, int( main.numCtrls ) + 1 ):
             ONOS_ip = main.params[ 'CTRL' ][ 'ip' + str( i ) ]
-            main.log.info( "Unintsalling package on ONOS Node IP: " + ONOS_ip )
-            u_result = main.ONOSbench.onos_uninstall( ONOS_ip )
+            main.log.info( "Uninstalling package on ONOS Node IP: " + ONOS_ip )
+            u_result = main.ONOSbench.onosUninstall( ONOS_ip )
             utilities.assert_equals( expect=main.TRUE, actual=u_result,
                                      onpass="Test step PASS",
                                      onfail="Test step FAIL" )
             uninstallResult = ( uninstallResult and u_result )
 
         main.step( "Removing copy-cat logs from ONOS nodes" )
-        main.ONOSbench.onos_remove_raft_logs()
+        main.ONOSbench.onosRemoveRaftLogs()
 
         main.step( "Install ONOS package on all Nodes" )
         installResult = main.TRUE
-        for i in range( 1, int( numCtrls ) + 1 ):
+        for i in range( 1, int( main.numCtrls ) + 1 ):
             ONOS_ip = main.params[ 'CTRL' ][ 'ip' + str( i ) ]
             main.log.info( "Intsalling package on ONOS Node IP: " + ONOS_ip )
-            i_result = main.ONOSbench.onos_install( node=ONOS_ip )
+            i_result = main.ONOSbench.onosInstall( node=ONOS_ip )
             utilities.assert_equals( expect=main.TRUE, actual=i_result,
                                      onpass="Test step PASS",
                                      onfail="Test step FAIL" )
@@ -101,10 +118,10 @@
 
         main.step( "Verify ONOS nodes UP status" )
         statusResult = main.TRUE
-        for i in range( 1, int( numCtrls ) + 1 ):
+        for i in range( 1, int( main.numCtrls ) + 1 ):
             ONOS_ip = main.params[ 'CTRL' ][ 'ip' + str( i ) ]
             main.log.info( "ONOS Node " + ONOS_ip + " status:" )
-            onos_status = main.ONOSbench.onos_status( node=ONOS_ip )
+            onos_status = main.ONOSbench.onosStatus( node=ONOS_ip )
             utilities.assert_equals( expect=main.TRUE, actual=onos_status,
                                      onpass="Test step PASS",
                                      onfail="Test step FAIL" )
@@ -115,44 +132,49 @@
         karafTimeout = "3600000"
         # need to wait here for sometime. This will be removed once ONOS is
         # stable enough
-        time.sleep( 15 )
-        for i in range( 1, int( numCtrls ) + 1 ):
-            ONOS_ip = main.params[ 'CTRL' ][ 'ip' + str( i ) ]
-            ONOScli = 'ONOScli' + str( i )
-            main.log.info( "ONOS Node " + ONOS_ip + " cli start:" )
-            exec "startcli=main." + ONOScli + \
-                ".start_onos_cli(ONOS_ip, karafTimeout=karafTimeout)"
-            utilities.assert_equals( expect=main.TRUE, actual=startcli,
-                                     onpass="Test step PASS",
-                                     onfail="Test step FAIL" )
-            cliResult = ( cliResult and startcli )
-
-        case1Result = ( cp_result and cell_result
-                        and packageResult and installResult and statusResult and cliResult )
+        time.sleep( 25 )
+        main.log.step(" Start ONOS cli using thread ")
+        startCliResult  = main.TRUE
+        pool = []
+        time1 = time.time()
+        for i in range( int( main.numCtrls) ):
+            t = main.Thread( target=main.CLIs[i].startOnosCli,
+                             threadID=main.threadID,
+                             name="startOnosCli",
+                             args=[ main.nodes[i].ip_address ] )
+            pool.append(t)
+            t.start()
+            main.threadID = main.threadID + 1
+        for t in pool:
+            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()
+                main.exit()
+        else:
+            main.log.info("Successful CLI startup")
+            startCliResult = main.TRUE
+        case1Result = installResult and uninstallResult and statusResult and startCliResult
+        
+        main.log.info("Time for connecting to CLI: %2f seconds" %(time2-time1))
         utilities.assert_equals( expect=main.TRUE, actual=case1Result,
                                  onpass="Set up test environment PASS",
                                  onfail="Set up test environment FAIL" )
 
     def CASE2( self, main ):
         """
-        This test script still needs more refactoring
+        This test loads a Topology (ATT) on Mininet and balances all switches.
         """
         import re
         import time
         import copy
-        numCtrls = main.params[ 'CTRL' ][ 'numCtrl' ]
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS4_ip = main.params[ 'CTRL' ][ 'ip4' ]
-        ONOS5_ip = main.params[ 'CTRL' ][ 'ip5' ]
-        ONOS1_port = main.params[ 'CTRL' ][ 'port1' ]
-        ONOS2_port = main.params[ 'CTRL' ][ 'port2' ]
-        ONOS3_port = main.params[ 'CTRL' ][ 'port3' ]
-        ONOS4_port = main.params[ 'CTRL' ][ 'port4' ]
-        ONOS5_port = main.params[ 'CTRL' ][ 'port5' ]
-
-        numCtrls = main.params[ 'CTRL' ][ 'numCtrl' ]
+        main.numMNswitches = int ( main.params[ 'TOPO1' ][ 'numSwitches' ] )
+        main.numMNlinks = int ( main.params[ 'TOPO1' ][ 'numLinks' ] )
+        main.numMNhosts = int ( main.params[ 'TOPO1' ][ 'numHosts' ] )
+        main.pingTimeout = 60
         main.log.report(
             "Assign and Balance all Mininet switches across controllers" )
         main.log.report(
@@ -163,26 +185,27 @@
         main.case(
             "Assign and Balance all Mininet switches across controllers" )
         main.step( "Assign switches to controllers" )
-        for i in range( 1, 26 ):  # 1 to ( num of switches +1 )
-            main.Mininet1.assign_sw_controller(
+        netStatus = main.Mininet1.startNet()
+        for i in range( 1, ( main.numMNswitches + 1 ) ):  # 1 to ( num of switches +1 )
+            main.Mininet1.assignSwController(
                 sw=str( i ),
-                count=int( numCtrls ),
-                ip1=ONOS1_ip,
-                port1=ONOS1_port,
-                ip2=ONOS2_ip,
-                port2=ONOS2_port,
-                ip3=ONOS3_ip,
-                port3=ONOS3_port,
-                ip4=ONOS4_ip,
-                port4=ONOS4_port,
-                ip5=ONOS5_ip,
-                port5=ONOS5_port )
+                count=int( main.numCtrls ),
+                ip1=main.ONOS1_ip,
+                port1=main.ONOS1_port,
+                ip2=main.ONOS2_ip,
+                port2=main.ONOS2_port,
+                ip3=main.ONOS3_ip,
+                port3=main.ONOS3_port,
+                ip4=main.ONOS4_ip,
+                port4=main.ONOS4_port,
+                ip5=main.ONOS5_ip,
+                port5=main.ONOS5_port )
 
         switch_mastership = main.TRUE
-        for i in range( 1, 26 ):
-            response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+        for i in range( 1, ( main.numMNswitches + 1 ) ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
             print( "Response is " + str( response ) )
-            if re.search( "tcp:" + ONOS1_ip, response ):
+            if re.search( "tcp:" + main.ONOS1_ip, response ):
                 switch_mastership = switch_mastership and main.TRUE
             else:
                 switch_mastership = main.FALSE
@@ -191,19 +214,19 @@
             main.log.report( "Controller assignment successfull" )
         else:
             main.log.report( "Controller assignment failed" )
-        time.sleep( 5 )
+        time.sleep( 15 )
 
-        main.step( "Balance devices across controllers" )
-        for i in range( int( numCtrls ) ):
-            balanceResult = main.ONOScli1.balance_masters()
+        #main.step( "Balance devices across controllers" )
+        #for i in range( int( main.numCtrls ) ):
+        #    balanceResult = main.ONOScli1.balanceMasters()
             # giving some breathing time for ONOS to complete re-balance
-            time.sleep( 3 )
+        #    time.sleep( 3 )
 
-        utilities.assert_equals(
-            expect=main.TRUE,
-            actual=balanceResult,
-            onpass="Assign and Balance devices test PASS",
-            onfail="Assign and Balance devices test FAIL" )
+        #utilities.assert_equals(
+         #   expect=main.TRUE,
+          #  actual=balanceResult,
+           # onpass="Assign and Balance devices test PASS",
+            #onfail="Assign and Balance devices test FAIL" )
 
     def CASE3( self, main ):
         """
@@ -212,77 +235,106 @@
         """
         import re
         import copy
-        deviceDPIDs = []
-        hostMACs = []
-        deviceLinks = []
-        deviceActiveLinksCount = []
-        devicePortsEnabledCount = []
-
+        main.deviceDPIDs = []
+        main.hostMACs = []
+        main.deviceLinks = []
+        main.deviceActiveLinksCount = []
+        main.devicePortsEnabledCount = []
+        
         main.log.report(
             "Collect and Store topology details from ONOS before running any Tests" )
         main.log.report(
             "____________________________________________________________________" )
         main.case( "Collect and Store Topology Deatils from ONOS" )
-
         main.step( "Collect and store current number of switches and links" )
         topology_output = main.ONOScli1.topology()
-        topology_result = main.ONOSbench.get_topology( topology_output )
-        numSwitches = topology_result[ 'devices' ]
-        numLinks = topology_result[ 'links' ]
-        main.log.info(
-            "Currently there are %s switches and %s links" %
-            ( str( numSwitches ), str( numLinks ) ) )
+        topology_result = main.ONOSbench.getTopology( topology_output )
+        numOnosDevices = topology_result[ 'devices' ]
+        numOnosLinks = topology_result[ 'links' ]
 
-        main.step( "Store Device DPIDs" )
-        for i in range( 1, 26 ):
-            deviceDPIDs.append( "of:00000000000000" + format( i, '02x' ) )
-        print "Device DPIDs in Store: \n", str( deviceDPIDs )
+        if ( ( main.numMNswitches == int(numOnosDevices) ) and ( main.numMNlinks >= int(numOnosLinks) ) ):
+            main.step( "Store Device DPIDs" )
+            for i in range( 1, (main.numMNswitches+1) ):
+                main.deviceDPIDs.append( "of:00000000000000" + format( i, '02x' ) )
+            print "Device DPIDs in Store: \n", str( main.deviceDPIDs )
 
-        main.step( "Store Host MACs" )
-        for i in range( 1, 26 ):
-            hostMACs.append( "00:00:00:00:00:" + format( i, '02x' ) + "/-1" )
-        print "Host MACs in Store: \n", str( hostMACs )
+            main.step( "Store Host MACs" )
+            for i in range( 1, ( main.numMNhosts + 1 ) ):
+                main.hostMACs.append( "00:00:00:00:00:" + format( i, '02x' ) + "/-1" )
+            print "Host MACs in Store: \n", str( main.hostMACs )
 
-        main.step( "Collect and store all Devices Links" )
-        linksResult = main.ONOScli1.links( json_format=False )
-        ansi_escape = re.compile( r'\x1b[^m]*m' )
-        linksResult = ansi_escape.sub( '', linksResult )
-        linksResult = linksResult.replace( " links", "" ).replace( "\r\r", "" )
-        linksResult = linksResult.splitlines()
-        linksResult = linksResult[ 1: ]
-        deviceLinks = copy.copy( linksResult )
-        print "Device Links Stored: \n", str( deviceLinks )
-        # this will be asserted to check with the params provided count of
-        # links
-        print "Length of Links Store", len( deviceLinks )
+            main.step( "Collect and store all Devices Links" )
+            linksResult = main.ONOScli1.links( jsonFormat=False )
+            ansi_escape = re.compile( r'\x1b[^m]*m' )
+            linksResult = ansi_escape.sub( '', linksResult )
+            linksResult = linksResult.replace( " links", "" ).replace( "\r\r", "" )
+            linksResult = linksResult.splitlines()
+            linksResult = linksResult[ 1: ]
+            main.deviceLinks = copy.copy( linksResult )
+            print "Device Links Stored: \n", str( main.deviceLinks )
+            # this will be asserted to check with the params provided count of
+            # links
+            print "Length of Links Store", len( main.deviceLinks )
 
-        main.step( "Collect and store each Device ports enabled Count" )
-        for i in range( 1, 26 ):
-            portResult = main.ONOScli1.getDevicePortsEnabledCount(
-                "of:00000000000000" +
-                format(
-                    i,
-                    '02x' ) )
-            portTemp = re.split( r'\t+', portResult )
-            portCount = portTemp[ 1 ].replace( "\r\r\n\x1b[32m", "" )
-            devicePortsEnabledCount.append( portCount )
-        print "Device Enabled Port Counts Stored: \n", str( devicePortsEnabledCount )
+            main.step( "Collect and store each Device ports enabled Count" )
+            time1 = time.time()
+            for i in xrange(1,(main.numMNswitches + 1), int( main.numCtrls ) ):
+                pool = []
+                for cli in main.CLIs:
+                    dpid = "of:00000000000000" + format( i,'02x' )
+                    t = main.Thread(target = cli.getDevicePortsEnabledCount,threadID = main.threadID, name = "getDevicePortsEnabledCount",args = [dpid])
+                    t.start()
+                    pool.append(t)
+                    i = i + 1
+                    main.threadID = main.threadID + 1
+                for thread in pool:
+                    thread.join()
+                    portResult = thread.result
+                    portTemp = re.split( r'\t+', portResult )
+                    portCount = portTemp[ 1 ].replace( "\r\r\n\x1b[32m", "" )
+                    main.devicePortsEnabledCount.append( portCount )
+            print "Device Enabled Port Counts Stored: \n", str( main.devicePortsEnabledCount )
+            time2 = time.time()
+            main.log.info("Time for counting enabled ports of the switches: %2f seconds" %(time2-time1))
 
-        main.step( "Collect and store each Device active links Count" )
-        for i in range( 1, 26 ):
-            linkCountResult = main.ONOScli1.getDeviceLinksActiveCount(
-                "of:00000000000000" +
-                format(
-                    i,
-                    '02x' ) )
-            linkCountTemp = re.split( r'\t+', linkCountResult )
-            linkCount = linkCountTemp[ 1 ].replace( "\r\r\n\x1b[32m", "" )
-            deviceActiveLinksCount.append( linkCount )
-        print "Device Active Links Count Stored: \n", str( deviceActiveLinksCount )
+            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:
+                    dpid = "of:00000000000000" + format( i,'02x' )
+                    t = main.Thread( target = cli.getDeviceLinksActiveCount,
+                                     threadID = main.threadID,
+                                     name = "getDevicePortsEnabledCount",
+                                     args = [dpid])
+                    t.start()
+                    pool.append(t)
+                    i = i + 1
+                    main.threadID = main.threadID + 1
+                for thread in pool:
+                    thread.join()
+                    linkCountResult = thread.result
+                    linkCountTemp = re.split( r'\t+', linkCountResult )
+                    linkCount = linkCountTemp[ 1 ].replace( "\r\r\n\x1b[32m", "" )
+                    main.deviceActiveLinksCount.append( linkCount )
+                print "Device Active Links Count Stored: \n", str( main.deviceActiveLinksCount )
+            time2 = time.time()
+            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" % 
+                    ( 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...")
+            #time.sleep(300)
+            main.cleanup()
+            main.exit()
 
         # just returning TRUE for now as this one just collects data
-        caseResult = main.TRUE
-        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+        case3Result = main.TRUE
+        utilities.assert_equals( expect=main.TRUE, actual=case3Result,
                                  onpass="Saving ONOS topology data test PASS",
                                  onfail="Saving ONOS topology data test FAIL" )
 
@@ -293,27 +345,44 @@
         import re
         import copy
         import time
-        numCtrls = main.params[ 'CTRL' ][ 'numCtrl' ]
         main.log.report( "Enable Reactive forwarding and Verify ping all" )
         main.log.report( "______________________________________________" )
         main.case( "Enable Reactive forwarding and Verify ping all" )
         main.step( "Enable Reactive forwarding" )
         installResult = main.TRUE
-        for i in range( 1, int( numCtrls ) + 1 ):
-            onosFeature = 'onos-app-fwd'
-            ONOS_ip = main.params[ 'CTRL' ][ 'ip' + str( i ) ]
-            ONOScli = 'ONOScli' + str( i )
-            main.log.info( "Enabling Reactive mode on ONOS Node " + ONOS_ip )
-            exec "inResult=main." + ONOScli + ".feature_install(onosFeature)"
-            time.sleep( 3 )
-            installResult = inResult and installResult
-
+        feature = "onos-app-fwd"
+        
+        pool = []
+        time1 = time.time()
+        for cli in main.CLIs:
+            t = main.Thread( target=cli.featureInstall,
+                    threadID=main.threadID,
+                    name="featureInstall",
+                    args=['onos-app-fwd'])
+            pool.append(t)
+            t.start()
+            main.threadID = main.threadID + 1
+            
+        installResult = main.TRUE
+        for t in pool:
+            t.join()
+            installResult = installResult and t.result
+        time2 = time.time()
+        
+        if not installResult:
+                main.log.info("Did not install onos-app-fwd feature properly")
+                main.cleanup()
+                main.exit()
+        else:
+            main.log.info("Successful feature:install onos-app-fwd")
+        main.log.info("Time for feature:install onos-app-fwd: %2f seconds" %(time2-time1))
+        
         time.sleep( 5 )
 
         main.step( "Verify Pingall" )
         ping_result = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        ping_result = main.Mininet1.pingall(timeout=main.pingTimeout)
         time2 = time.time()
         timeDiff = round( ( time2 - time1 ), 2 )
         main.log.report(
@@ -328,19 +397,33 @@
 
         main.step( "Disable Reactive forwarding" )
         uninstallResult = main.TRUE
-        for i in range( 1, int( numCtrls ) + 1 ):
-            onosFeature = 'onos-app-fwd'
-            ONOS_ip = main.params[ 'CTRL' ][ 'ip' + str( i ) ]
-            ONOScli = 'ONOScli' + str( i )
-            main.log.info( "Disabling Reactive mode on ONOS Node " + ONOS_ip )
-            exec "unResult=main." + ONOScli + ".feature_uninstall(onosFeature)"
-            uninstallResult = unResult and uninstallResult
+        pool = []
+        time1 = time.time()
+        for cli in main.CLIs:
+            t = main.Thread( target=cli.featureUninstall,
+                             threadID=main.threadID,
+                             name="featureUninstall",
+                             args=['onos-app-fwd'])
+            pool.append(t)
+            t.start()
+            main.threadID = main.threadID + 1
+        for t in pool:
+            t.join()
+            uninstallResult = uninstallResult and t.result
+        time2 = time.time()
+        
+        if not uninstallResult:
+                main.log.info("Did not uninstall onos-app-fwd feature properly")
+                main.cleanup()
+                main.exit()
+        else:
+            main.log.info("Successful feature:uninstall onos-app-fwd")
+        main.log.info("Time for feature:uninstall onos-app-fwd: %2f seconds" %(time2-time1))
 
         # Waiting for reative flows to be cleared.
-        time.sleep( 10 )
-
-        case3Result = installResult and ping_result and uninstallResult
-        utilities.assert_equals( expect=main.TRUE, actual=case3Result,
+        time.sleep( 5 )
+        case4Result =  installResult and uninstallResult and ping_result
+        utilities.assert_equals( expect=main.TRUE, actual=case4Result,
                                  onpass="Reactive Mode Pingall test PASS",
                                  onfail="Reactive Mode Pingall test FAIL" )
 
@@ -349,11 +432,12 @@
         Compare current ONOS topology with reference data
         """
         import re
-        devicesDPID_tmp = []
-        hostMACs_tmp = []
-        deviceLinks_tmp = []
-        deviceActiveLinksCount_tmp = []
-        devicePortsEnabledCount_tmp = []
+        
+        devicesDPIDTemp = []
+        hostMACsTemp = []
+        deviceLinksTemp = []
+        deviceActiveLinksCountTemp = []
+        devicePortsEnabledCountTemp = []
 
         main.log.report(
             "Compare ONOS topology with reference data in Stores" )
@@ -361,60 +445,82 @@
         main.case( "Compare ONOS topology with reference data" )
 
         main.step( "Compare current Device ports enabled with reference" )
-        for i in range( 1, 26 ):
-            portResult = main.ONOScli1.getDevicePortsEnabledCount(
-                "of:00000000000000" +
-                format(
-                    i,
-                    '02x' ) )
-            portTemp = re.split( r'\t+', portResult )
-            portCount = portTemp[ 1 ].replace( "\r\r\n\x1b[32m", "" )
-            devicePortsEnabledCount_tmp.append( portCount )
-            time.sleep( 2 )
-        print (
-            "Device Enabled ports EXPECTED: \n" +
-            str( devicePortsEnabledCount ) )
-        print (
-            "Device Enabled ports ACTUAL: \n" +
-            str( devicePortsEnabledCount_tmp ) )
-        if ( cmp( devicePortsEnabledCount,
-                  devicePortsEnabledCount_tmp ) == 0 ):
+        time1 = time.time()
+        for i in xrange( 1,(main.numMNswitches + 1), int( main.numCtrls ) ):
+            pool = []
+            for cli in main.CLIs:
+                dpid = "of:00000000000000" + format( i,'02x' )
+                t = main.Thread(target = cli.getDevicePortsEnabledCount,
+                        threadID = main.threadID,
+                        name = "getDevicePortsEnabledCount",
+                        args = [dpid])
+                t.start()
+                pool.append(t)
+                i = i + 1
+                main.threadID = main.threadID + 1
+            for thread in pool:
+                thread.join()
+                portResult = thread.result
+                portTemp = re.split( r'\t+', portResult )
+                portCount = portTemp[ 1 ].replace( "\r\r\n\x1b[32m", "" )
+                devicePortsEnabledCountTemp.append( portCount )
+        print "Device Enabled Port Counts Stored: \n", str( main.devicePortsEnabledCount )
+        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 ) )
+        main.log.info (
+            "Device Enabled ports ACTUAL: %s" % 
+            str( devicePortsEnabledCountTemp ) )
+        
+        if ( cmp( main.devicePortsEnabledCount,
+                  devicePortsEnabledCountTemp ) == 0 ):
             stepResult1 = main.TRUE
         else:
             stepResult1 = main.FALSE
 
         main.step( "Compare Device active links with reference" )
-        for i in range( 1, 26 ):
-            linkResult = main.ONOScli1.getDeviceLinksActiveCount(
-                "of:00000000000000" +
-                format(
-                    i,
-                    '02x' ) )
-            linkTemp = re.split( r'\t+', linkResult )
-            linkCount = linkTemp[ 1 ].replace( "\r\r\n\x1b[32m", "" )
-            deviceActiveLinksCount_tmp.append( linkCount )
-            time.sleep( 3 )
-        print (
-            "Device Active links EXPECTED: \n" +
-            str( deviceActiveLinksCount ) )
-        print (
-            "Device Active links ACTUAL: \n" +
-            str( deviceActiveLinksCount_tmp ) )
-        if ( cmp( deviceActiveLinksCount, deviceActiveLinksCount_tmp ) == 0 ):
+        time1 = time.time()
+        for i in xrange( 1, ( main.numMNswitches + 1) , int( main.numCtrls ) ):
+            pool = []
+            for cli in main.CLIs:
+                dpid = "of:00000000000000" + format( i,'02x' )
+                t = main.Thread(target = cli.getDeviceLinksActiveCount,
+                        threadID = main.threadID,
+                        name = "getDevicePortsEnabledCount",
+                        args = [dpid])
+                t.start()
+                pool.append(t)
+                i = i + 1
+                main.threadID = main.threadID + 1
+            for thread in pool:
+                thread.join()
+                linkCountResult = thread.result
+                linkCountTemp = re.split( r'\t+', linkCountResult )
+                linkCount = linkCountTemp[ 1 ].replace( "\r\r\n\x1b[32m", "" )
+                deviceActiveLinksCountTemp.append( linkCount )
+            print "Device Active Links Count Stored: \n", str( main.deviceActiveLinksCount )
+        time2 = time.time()
+        main.log.info("Time for counting all enabled links of the switches: %2f seconds" %(time2-time1))
+        main.log.info (
+            "Device Active links EXPECTED: %s" %
+              str( main.deviceActiveLinksCount ) )
+        main.log.info (
+            "Device Active links ACTUAL: %s" % str( deviceActiveLinksCountTemp ) )
+        if ( cmp( main.deviceActiveLinksCount, deviceActiveLinksCountTemp ) == 0 ):
             stepResult2 = main.TRUE
         else:
             stepResult2 = main.FALSE
 
         """
-        place holder for comparing devices, hosts and paths if required.
+        place holder for comparing devices, hosts, paths and intents if required.
         Links and ports data would be incorrect with out devices anyways.
         """
-        caseResult = ( stepResult1 and stepResult2 )
-        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+        case5Result = ( stepResult1 and stepResult2 )
+        utilities.assert_equals( expect=main.TRUE, actual=case5Result,
                                  onpass="Compare Topology test PASS",
                                  onfail="Compare Topology test FAIL" )
-        if caseResult == main.TRUE:
-            main.log.report( "Compare Topology test Pass" )
 
     def CASE6( self ):
         """
@@ -423,20 +529,42 @@
         main.log.report( "Add 300 host intents and verify pingall" )
         main.log.report( "_______________________________________" )
         import itertools
+        
         main.case( "Install 300 host intents" )
         main.step( "Add host Intents" )
         intentResult = main.TRUE
-        hostCombos = list( itertools.combinations( hostMACs, 2 ) )
-        for i in range( len( hostCombos ) ):
-            iResult = main.ONOScli1.add_host_intent(
-                hostCombos[ i ][ 0 ],
-                hostCombos[ i ][ 1 ] )
-            intentResult = ( intentResult and iResult )
+        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:
+                if i >= len( hostCombos ):
+                    break
+                t = main.Thread( target=cli.addHostIntent,
+                        threadID=main.threadID,
+                        name="addHostIntent",
+                        args=[hostCombos[i][0],hostCombos[i][1]])
+                pool.append(t)
+                t.start()
+                i = i + 1
+                main.threadID = main.threadID + 1
+            for thread in pool:
+                thread.join()
+                intentIdList.append(thread.result)
+        time2 = time.time()
+        main.log.info("Time for adding host intents: %2f seconds" %(time2-time1))
+        intentResult = main.TRUE
+        intentsJson = main.ONOScli2.intents()
+        getIntentStateResult = main.ONOScli1.getIntentState(intentsId = intentIdList,
+                intentsJson = intentsJson)
+        print getIntentStateResult
 
         main.step( "Verify Ping across all hosts" )
         pingResult = main.FALSE
         time1 = time.time()
-        pingResult = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall(timeout=main.pingTimeout)
         time2 = time.time()
         timeDiff = round( ( time2 - time1 ), 2 )
         main.log.report(
@@ -447,10 +575,11 @@
                                  onpass="PING ALL PASS",
                                  onfail="PING ALL FAIL" )
 
-        case4Result = ( intentResult and pingResult )
+        case6Result = ( intentResult and pingResult )
+        
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=case4Result,
+            actual=case6Result,
             onpass="Install 300 Host Intents and Ping All test PASS",
             onfail="Install 300 Host Intents and Ping All test FAIL" )
 
@@ -459,7 +588,9 @@
         Randomly bring some core links down and verify ping all ( Host Intents Scenario )
         """
         import random
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
+        main.randomLink1 = []
+        main.randomLink2 = []
+        main.randomLink3 = []
         link1End1 = main.params[ 'CORELINKS' ][ 'linkS3a' ]
         link1End2 = main.params[ 'CORELINKS' ][ 'linkS3b' ].split( ',' )
         link2End1 = main.params[ 'CORELINKS' ][ 'linkS14a' ]
@@ -469,47 +600,41 @@
         switchLinksToToggle = main.params[ 'CORELINKS' ][ 'toggleLinks' ]
         link_sleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        main.log.report(
-            "Host intents - Randomly bring some core links down and verify ping all" )
-        main.log.report(
-            "_________________________________________________________________" )
-        main.case(
-            "Host intents - Randomly bring some core links down and verify ping all" )
-        main.step(
-            "Verify number of Switch links to toggle on each Core Switch are between 1 - 5" )
+        main.log.report( "Host intents - Randomly bring some core links down and verify ping all" )
+        main.log.report( "_________________________________________________________________" )
+        main.case( "Host intents - Randomly bring some core links down and verify ping all" )
+        main.step( "Verify number of Switch links to toggle on each Core Switch are between 1 - 5" )
         if ( int( switchLinksToToggle ) ==
              0 or int( switchLinksToToggle ) > 5 ):
-            main.log.info(
-                "Please check you PARAMS file. Valid range for number of switch links to toggle is between 1 to 5" )
+            main.log.info( "Please check your PARAMS file. Valid range for number of switch links to toggle is between 1 to 5" )
             main.cleanup()
             main.exit()
         else:
-            main.log.info(
-                "User provided Core switch links range to toggle is correct, proceeding to run the test" )
+            main.log.info( "User provided Core switch links range to toggle is correct, proceeding to run the test" )
 
         main.step( "Cut links on Core devices using user provided range" )
-        randomLink1 = random.sample( link1End2, int( switchLinksToToggle ) )
-        randomLink2 = random.sample( link2End2, int( switchLinksToToggle ) )
-        randomLink3 = random.sample( link3End2, int( switchLinksToToggle ) )
+        main.randomLink1 = random.sample( link1End2, int( switchLinksToToggle ) )
+        main.randomLink2 = random.sample( link2End2, int( switchLinksToToggle ) )
+        main.randomLink3 = random.sample( link3End2, int( switchLinksToToggle ) )
         for i in range( int( switchLinksToToggle ) ):
             main.Mininet1.link(
                 END1=link1End1,
-                END2=randomLink1[ i ],
+                END2=main.randomLink1[ i ],
                 OPTION="down" )
             main.Mininet1.link(
                 END1=link2End1,
-                END2=randomLink2[ i ],
+                END2=main.randomLink2[ i ],
                 OPTION="down" )
             main.Mininet1.link(
                 END1=link3End1,
-                END2=randomLink3[ i ],
+                END2=main.randomLink3[ i ],
                 OPTION="down" )
         time.sleep( link_sleep )
 
         topology_output = main.ONOScli2.topology()
-        linkDown = main.ONOSbench.check_status(
-            topology_output, numSwitches, str(
-                int( numLinks ) - int( switchLinksToToggle ) * 6 ) )
+        linkDown = main.ONOSbench.checkStatus(
+            topology_output, main.numMNswitches, str(
+                int( main.numMNlinks ) - int( switchLinksToToggle ) * 6 ) )
         utilities.assert_equals(
             expect=main.TRUE,
             actual=linkDown,
@@ -521,7 +646,7 @@
         main.step( "Verify Ping across all hosts" )
         pingResultLinkDown = main.FALSE
         time1 = time.time()
-        pingResultLinkDown = main.Mininet1.pingall()
+        pingResultLinkDown = main.Mininet1.pingall(timeout=main.pingTimeout)
         time2 = time.time()
         timeDiff = round( ( time2 - time1 ), 2 )
         main.log.report(
@@ -532,8 +657,8 @@
                                  onpass="PING ALL PASS",
                                  onfail="PING ALL FAIL" )
 
-        caseResult7 = linkDown and pingResultLinkDown
-        utilities.assert_equals( expect=main.TRUE, actual=caseResult7,
+        caseResult70 = linkDown and pingResultLinkDown
+        utilities.assert_equals( expect=main.TRUE, actual=caseResult70,
                                  onpass="Random Link cut Test PASS",
                                  onfail="Random Link cut Test FAIL" )
 
@@ -542,7 +667,6 @@
         Bring the core links up that are down and verify ping all ( Host Intents Scenario )
         """
         import random
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
         link1End1 = main.params[ 'CORELINKS' ][ 'linkS3a' ]
         link2End1 = main.params[ 'CORELINKS' ][ 'linkS14a' ]
         link3End1 = main.params[ 'CORELINKS' ][ 'linkS18a' ]
@@ -559,23 +683,23 @@
         for i in range( int( switchLinksToToggle ) ):
             main.Mininet1.link(
                 END1=link1End1,
-                END2=randomLink1[ i ],
+                END2=main.randomLink1[ i ],
                 OPTION="up" )
             main.Mininet1.link(
                 END1=link2End1,
-                END2=randomLink2[ i ],
+                END2=main.randomLink2[ i ],
                 OPTION="up" )
             main.Mininet1.link(
                 END1=link3End1,
-                END2=randomLink3[ i ],
+                END2=main.randomLink3[ i ],
                 OPTION="up" )
         time.sleep( link_sleep )
 
         topology_output = main.ONOScli2.topology()
-        linkUp = main.ONOSbench.check_status(
+        linkUp = main.ONOSbench.checkStatus(
             topology_output,
-            numSwitches,
-            str( numLinks ) )
+            main.numMNswitches,
+            str( main.numMNlinks ) )
         utilities.assert_equals(
             expect=main.TRUE,
             actual=linkUp,
@@ -598,8 +722,8 @@
                                  onpass="PING ALL PASS",
                                  onfail="PING ALL FAIL" )
 
-        caseResult8 = linkUp and pingResultLinkUp
-        utilities.assert_equals( expect=main.TRUE, actual=caseResult8,
+        caseResult80 = linkUp and pingResultLinkUp
+        utilities.assert_equals( expect=main.TRUE, actual=caseResult80,
                                  onpass="Link Up Test PASS",
                                  onfail="Link Up Test FAIL" )
 
@@ -608,7 +732,9 @@
         Randomly bring some core links down and verify ping all ( Point Intents Scenario )
         """
         import random
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
+        main.randomLink1 = []
+        main.randomLink2 = []
+        main.randomLink3 = []
         link1End1 = main.params[ 'CORELINKS' ][ 'linkS3a' ]
         link1End2 = main.params[ 'CORELINKS' ][ 'linkS3b' ].split( ',' )
         link2End1 = main.params[ 'CORELINKS' ][ 'linkS14a' ]
@@ -618,14 +744,10 @@
         switchLinksToToggle = main.params[ 'CORELINKS' ][ 'toggleLinks' ]
         link_sleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        main.log.report(
-            "Point Intents - Randomly bring some core links down and verify ping all" )
-        main.log.report(
-            "__________________________________________________________________" )
-        main.case(
-            "Point Intents - Randomly bring some core links down and verify ping all" )
-        main.step(
-            "Verify number of Switch links to toggle on each Core Switch are between 1 - 5" )
+        main.log.report( "Point Intents - Randomly bring some core links down and verify ping all" )
+        main.log.report( "__________________________________________________________________" )
+        main.case( "Point Intents - Randomly bring some core links down and verify ping all" )
+        main.step( "Verify number of Switch links to toggle on each Core Switch are between 1 - 5" )
         if ( int( switchLinksToToggle ) ==
              0 or int( switchLinksToToggle ) > 5 ):
             main.log.info(
@@ -643,22 +765,22 @@
         for i in range( int( switchLinksToToggle ) ):
             main.Mininet1.link(
                 END1=link1End1,
-                END2=randomLink1[ i ],
+                END2=main.randomLink1[ i ],
                 OPTION="down" )
             main.Mininet1.link(
                 END1=link2End1,
-                END2=randomLink2[ i ],
+                END2=main.randomLink2[ i ],
                 OPTION="down" )
             main.Mininet1.link(
                 END1=link3End1,
-                END2=randomLink3[ i ],
+                END2=main.randomLink3[ i ],
                 OPTION="down" )
         time.sleep( link_sleep )
 
         topology_output = main.ONOScli2.topology()
-        linkDown = main.ONOSbench.check_status(
-            topology_output, numSwitches, str(
-                int( numLinks ) - int( switchLinksToToggle ) * 6 ) )
+        linkDown = main.ONOSbench.checkStatus(
+            topology_output, main.numSwitches, str(
+                int( main.numLinks ) - int( switchLinksToToggle ) * 6 ) )
         utilities.assert_equals(
             expect=main.TRUE,
             actual=linkDown,
@@ -691,7 +813,6 @@
         Bring the core links up that are down and verify ping all ( Point Intents Scenario )
         """
         import random
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
         link1End1 = main.params[ 'CORELINKS' ][ 'linkS3a' ]
         link2End1 = main.params[ 'CORELINKS' ][ 'linkS14a' ]
         link3End1 = main.params[ 'CORELINKS' ][ 'linkS18a' ]
@@ -708,23 +829,23 @@
         for i in range( int( switchLinksToToggle ) ):
             main.Mininet1.link(
                 END1=link1End1,
-                END2=randomLink1[ i ],
+                END2=main.randomLink1[ i ],
                 OPTION="up" )
             main.Mininet1.link(
                 END1=link2End1,
-                END2=randomLink2[ i ],
+                END2=main.randomLink2[ i ],
                 OPTION="up" )
             main.Mininet1.link(
                 END1=link3End1,
-                END2=randomLink3[ i ],
+                END2=main.randomLink3[ i ],
                 OPTION="up" )
         time.sleep( link_sleep )
 
         topology_output = main.ONOScli2.topology()
-        linkUp = main.ONOSbench.check_status(
+        linkUp = main.ONOSbench.checkStatus(
             topology_output,
-            numSwitches,
-            str( numLinks ) )
+            main.numMNswitches,
+            str( main.numMNlinks ) )
         utilities.assert_equals(
             expect=main.TRUE,
             actual=linkUp,
@@ -747,8 +868,8 @@
                                  onpass="PING ALL PASS",
                                  onfail="PING ALL FAIL" )
 
-        caseResult8 = linkUp and pingResultLinkUp
-        utilities.assert_equals( expect=main.TRUE, actual=caseResult8,
+        caseResult81 = linkUp and pingResultLinkUp
+        utilities.assert_equals( expect=main.TRUE, actual=caseResult81,
                                  onpass="Link Up Test PASS",
                                  onfail="Link Up Test FAIL" )
 
@@ -760,18 +881,18 @@
         main.log.report( "Install 114 point intents and verify Ping all" )
         main.log.report( "___________________________________________" )
         main.case( "Install 114 point intents and Ping all" )
-        deviceLinks_copy = copy.copy( deviceLinks )
+        deviceLinksCopy = copy.copy( main.deviceLinks )
         main.step( "Install 114 point intents" )
-        for i in range( len( deviceLinks_copy ) ):
+        for i in range( len( deviceLinksCopy ) ):
             pointLink = str(
-                deviceLinks_copy[ i ] ).replace(
+                deviceLinksCopy[ i ] ).replace(
                 "src=",
                 "" ).replace(
                 "dst=",
                 "" ).split( ',' )
             point1 = pointLink[ 0 ].split( '/' )
             point2 = pointLink[ 1 ].split( '/' )
-            installResult = main.ONOScli1.add_point_intent(
+            installResult = main.ONOScli1.addPointIntent(
                 point1[ 0 ], point2[ 0 ], int(
                     point1[ 1 ] ), int(
                     point2[ 1 ] ) )
@@ -820,6 +941,7 @@
             onfail="Ping all test after Point intents addition failed" )
 
     def CASE10( self ):
+        import time
         """
          Remove all Intents
         """
@@ -847,10 +969,30 @@
                 intentsTemp = intentsList[ i ].split( ',' )
                 intentIdList.append( intentsTemp[ 0 ] )
             print "Intent IDs: ", intentIdList
-            for id in range( len( intentIdList ) ):
-                print "Removing intent id (round 1) :", intentIdList[ id ]
-                main.ONOScli1.remove_intent( intent_id=intentIdList[ id ] )
-                time.sleep( 1 )
+            
+            results = main.TRUE
+            time1 = time.time()
+            
+            for i in xrange(0,len( intentIdList ), int(main.numCtrls)):
+                pool = []
+                for cli in main.CLIs:
+                    if i >= len(intentIdList):
+                        break
+                    print "Removing intent id (round 1) :", intentIdList[ i ]
+                    t = main.Thread(target=cli.removeIntent,
+                            threadID=main.threadID,
+                            name="removeIntent",
+                            args=[intentIdList[i],'org.onosproject.cli',False,False])
+                    pool.append(t)
+                    t.start()
+                    i = i + 1
+                    main.threadID = main.threadID + 1
+                for t in pool:
+                    t.join()
+                    results = results and t.result
+                
+            time2 = time.time()
+            main.log.info("Time for feature:install onos-app-fwd: %2f seconds" %(time2-time1))
 
             main.log.info(
                 "Verify all intents are removed and if any leftovers try remove one more time" )
@@ -866,26 +1008,513 @@
                 "" )
             intentsList1 = intentsList1.splitlines()
             intentsList1 = intentsList1[ 1: ]
+            
             print "Round 2 (leftover) intents to remove: ", intentsList1
             intentIdList1 = []
             if ( len( intentsList1 ) > 1 ):
                 for i in range( len( intentsList1 ) ):
-                    intentsTemp1 = intentsList[ i ].split( ',' )
-                    intentIdList1.append( intentsTemp1[ 0 ] )
+                    intentsTemp1 = intentsList1[ i ].split( ',' )
+                    intentIdList1.append( intentsTemp1[ 0 ].split('=')[1] )
                 print "Leftover Intent IDs: ", intentIdList1
-                for id in range( len( intentIdList1 ) ):
-                    print "Removing intent id (round 2):", intentIdList1[ id ]
-                    main.ONOScli1.remove_intent(
-                        intent_id=intentIdList1[ id ] )
-                    time.sleep( 2 )
+                for i in xrange(0, len( intentIdList1 ), int(main.numCtrls)):
+                    pool = []
+                    for cli in main.CLIs:
+                        if i >= len(intentIdList1):
+                            break
+                        print "Removing intent id (round 2) :", intentIdList1[ i ]
+                        t = main.Thread(target=cli.removeIntent,threadID=main.threadID,
+                                name="removeIntent",
+                                args=[intentIdList1[i],'org.onosproject.cli',True,False])
+                        pool.append(t)
+                        t.start()
+                        i = i + 1
+                        main.threadID = main.threadID + 1
+                        
+                    for t in pool:
+                        t.join()
+                        results = results and t.result
+                step1Result = results
             else:
                 print "There are no more intents that need to be removed"
                 step1Result = main.TRUE
         else:
             print "No Intent IDs found in Intents list: ", intentsList
             step1Result = main.FALSE
-
-        caseResult7 = step1Result
-        utilities.assert_equals( expect=main.TRUE, actual=caseResult7,
+        
+        print main.ONOScli1.intents()
+        caseResult10 = step1Result
+        utilities.assert_equals( expect=main.TRUE, actual=caseResult10,
                                  onpass="Intent removal test successful",
                                  onfail="Intent removal test failed" )
+
+    def CASE11( self, main ):
+        """
+        Enable onos-app-ifwd, Verify Intent based Reactive forwarding through ping all and Disable it
+        """
+        import re
+        import copy
+        import time
+
+        Thread = imp.load_source('Thread','/home/admin/ONLabTest/TestON/tests/OnosCHO/Thread.py')
+        threadID = 0
+
+        main.log.report( "Enable Intent based Reactive forwarding and Verify ping all" )
+        main.log.report( "_____________________________________________________" )
+        main.case( "Enable Intent based Reactive forwarding and Verify ping all" )
+        main.step( "Enable intent based Reactive forwarding" )
+        installResult = main.FALSE
+        feature = "onos-app-ifwd"
+        
+        pool = []
+        time1 = time.time()
+        for cli,feature in main.CLIs:
+            t = main.Thread(target=cli,threadID=threadID,
+                    name="featureInstall",args=[feature])
+            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()
+                main.exit()
+        else:
+            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()
+        ping_result = main.Mininet1.pingall(timeout=600)
+        time2 = time.time()
+        timeDiff = round( ( time2 - time1 ), 2 )
+        main.log.report(
+            "Time taken for Ping All: " +
+            str( timeDiff ) +
+            " seconds" )
+        
+        if ping_result == main.TRUE:
+            main.log.report( "Pingall Test in Reactive mode successful" )
+        else:
+            main.log.report( "Pingall Test in Reactive mode failed" )
+
+        main.step( "Disable Intent based Reactive forwarding" )
+        uninstallResult = main.FALSE
+        
+        pool = []
+        time1 = time.time()
+        for cli,feature in main.CLIs:
+            t = main.Thread(target=cli,threadID=threadID,
+                    name="featureUninstall",args=[feature])
+            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")
+                main.cleanup()
+                main.exit()
+        else:
+            main.log.info("Successful feature:uninstall onos-app-ifwd")
+            uninstallResult = main.TRUE
+        main.log.info("Time for feature:uninstall onos-app-ifwd: %2f seconds" %(time2-time1))
+
+        # Waiting for reative flows to be cleared.
+        time.sleep( 10 )
+
+        case11Result = installResult and ping_result and uninstallResult
+        utilities.assert_equals( expect=main.TRUE, actual=case11Result,
+                                 onpass="Intent based Reactive forwarding Pingall test PASS",
+                                 onfail="Intent based Reactive forwarding Pingall test FAIL" )
+
+    def CASE12( self, main ):
+        """
+        This test script Loads a new Topology (Chordal) on CHO setup and balances all switches
+        """
+        import re
+        import time
+        import copy
+        
+
+        Thread = imp.load_source('Thread','/home/admin/ONLabTest/TestON/tests/OnosCHO/Thread.py')
+        newTopo = main.params['TOPO2']['topo']
+        main.numMNswitches = int ( main.params[ 'TOPO2' ][ 'numSwitches' ] )
+        main.numMNlinks = int ( main.params[ 'TOPO2' ][ 'numLinks' ] )
+        main.numMNhosts = int ( main.params[ 'TOPO2' ][ 'numHosts' ] )
+        main.pingTimeout = 60
+        main.log.report(
+            "Load Chordal topology and Balance all Mininet switches across controllers" )
+        main.log.report(
+            "________________________________________________________________________" )
+        # need to wait here for sometime until ONOS bootup
+        time.sleep( 15 )
+        main.case(
+            "Assign and Balance all Mininet switches across controllers" )
+        main.step( "Stop any previous Mininet network topology" )
+        stopStatus = main.Mininet1.stopNet()
+
+        # WORK AROUND FOR ONOS-581. STOP ONOS BEFORE ASSIGNING CONTROLLERS AT MININET & START ONCE DONE
+        main.step( "Stop ONOS on all Nodes" )
+        stopResult = main.TRUE
+        for i in range( 1, int( main.numCtrls ) + 1 ):
+            ONOS_ip = main.params[ 'CTRL' ][ 'ip' + str( i ) ]
+            main.log.info( "Stopping ONOS Node IP: " + ONOS_ip )
+            sresult = main.ONOSbench.onosStop( ONOS_ip )
+            utilities.assert_equals( expect=main.TRUE, actual=sresult,
+                                     onpass="Test step PASS",
+                                     onfail="Test step FAIL" )
+            stopResult = ( stopResult and sresult )
+
+        main.step( "Start Mininet with Chordal topology" )
+        startStatus = main.Mininet1.startNet(topoFile = newTopo)
+
+        main.step( "Assign switches to controllers" )
+        for i in range( 1, ( main.numMNswitches + 1 ) ):  # 1 to ( num of switches +1 )
+            main.Mininet1.assignSwController(
+                sw=str( i ),
+                count=int( main.numCtrls ),
+                ip1=main.ONOS1_ip,
+                port1=main.ONOS1_port,
+                ip2=main.ONOS2_ip,
+                port2=main.ONOS2_port,
+                ip3=main.ONOS3_ip,
+                port3=main.ONOS3_port,
+                ip4=main.ONOS4_ip,
+                port4=main.ONOS4_port,
+                ip5=main.ONOS5_ip,
+                port5=main.ONOS5_port )
+
+        switch_mastership = main.TRUE
+        for i in range( 1, ( main.numMNswitches + 1 ) ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
+            print( "Response is " + str( response ) )
+            if re.search( "tcp:" + main.ONOS1_ip, response ):
+                switch_mastership = switch_mastership and main.TRUE
+            else:
+                switch_mastership = main.FALSE
+
+        if switch_mastership == main.TRUE:
+            main.log.report( "Controller assignment successfull" )
+        else:
+            main.log.report( "Controller assignment failed" )
+        time.sleep( 5 )
+
+        main.step( "Start ONOS on all Nodes" )
+        startResult = main.TRUE
+        for i in range( 1, int( main.numCtrls ) + 1 ):
+            ONOS_ip = main.params[ 'CTRL' ][ 'ip' + str( i ) ]
+            main.log.info( "Starting ONOS Node IP: " + ONOS_ip )
+            sresult = main.ONOSbench.onosStart( ONOS_ip )
+            utilities.assert_equals( expect=main.TRUE, actual=sresult,
+                                     onpass="Test step PASS",
+                                     onfail="Test step FAIL" )
+            startResult = ( startResult and sresult )
+
+        main.step( "Start ONOS CLI on all nodes" )
+        cliResult = main.TRUE
+        #karafTimeout = "3600000" # This is not needed here as it is already set before.
+        # need to wait here sometime for ONOS to bootup.
+        time.sleep( 30 )
+
+        main.log.step(" Start ONOS cli using thread ")
+        pool = []
+        time1 = time.time()
+        for i in range( int( main.numCtrls ) ):
+            t = main.Thread(target=cli.startOnosCli,
+                    threadID=main.threadID,
+                    name="startOnosCli",
+                    args=[nodes[i].ip_address])
+            pool.append(t)
+            t.start()
+            main.threadID = main.threadID + 1
+        for t in pool:
+            t.join()
+            cliResult = cliResult and t.result
+        time2 = time.time()
+        
+        if not cliResult:
+                main.log.info("ONOS CLI did not start up properly")
+                main.cleanup()
+                main.exit()
+        else:
+            main.log.info("Successful CLI startup")
+        main.log.info("Time for connecting to CLI: %2f seconds" %(time2-time1))
+
+        main.step( "Balance devices across controllers" )
+        for i in range( int( main.numCtrls ) ):
+            balanceResult = main.ONOScli1.balanceMasters()
+            # giving some breathing time for ONOS to complete re-balance
+            time.sleep( 3 )
+
+        case12Result = ( startResult and cliResult )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=case12Result,
+            onpass="Starting new Chordal topology test PASS",
+            onfail="Starting new Chordal topology test FAIL" )
+
+    def CASE13( self, main ):
+        """
+        This test script Loads a new Topology (Spine) on CHO setup and balances all switches
+        """
+        import re
+        import time
+        import copy
+
+        newTopo = main.params['TOPO3']['topo']
+        main.numMNswitches = int ( main.params[ 'TOPO3' ][ 'numSwitches' ] )
+        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(
+            "________________________________________________________________________" )
+        # need to wait here for sometime until ONOS bootup
+        time.sleep( 15 )
+        main.case(
+            "Assign and Balance all Mininet switches across controllers" )
+        main.step( "Stop any previous Mininet network topology" )
+        stopStatus = main.Mininet1.stopNet()
+
+        # WORK AROUND FOR ONOS-581. STOP ONOS BEFORE ASSIGNING CONTROLLERS AT MININET & START ONCE DONE
+        main.step( "Stop ONOS on all Nodes" )
+        stopResult = main.TRUE
+        for i in range( 1, int( main.numCtrls ) + 1 ):
+            ONOS_ip = main.params[ 'CTRL' ][ 'ip' + str( i ) ]
+            main.log.info( "Stopping ONOS Node IP: " + ONOS_ip )
+            sresult = main.ONOSbench.onosStop( ONOS_ip )
+            utilities.assert_equals( expect=main.TRUE, actual=sresult,
+                                     onpass="Test step PASS",
+                                     onfail="Test step FAIL" )
+            stopResult = ( stopResult and sresult )
+
+        main.step( "Start Mininet with Spine topology" )
+        startStatus = main.Mininet1.startNet(topoFile = newTopo)
+
+        main.step( "Assign switches to controllers" )
+        for i in range( 1, ( main.numMNswitches + 1 ) ):  # 1 to ( num of switches +1 )
+            main.Mininet1.assignSwController(
+                sw=str( i ),
+                count=int( main.numCtrls ),
+                ip1=main.ONOS1_ip,
+                port1=main.ONOS1_port,
+                ip2=main.ONOS2_ip,
+                port2=main.ONOS2_port,
+                ip3=main.ONOS3_ip,
+                port3=main.ONOS3_port,
+                ip4=main.ONOS4_ip,
+                port4=main.ONOS4_port,
+                ip5=main.ONOS5_ip,
+                port5=main.ONOS5_port )
+
+        switch_mastership = main.TRUE
+        for i in range( 1, ( main.numMNswitches + 1 ) ):
+            response = main.Mininet1.getSwController( "s" + str( i ) )
+            print( "Response is " + str( response ) )
+            if re.search( "tcp:" + main.ONOS1_ip, response ):
+                switch_mastership = switch_mastership and main.TRUE
+            else:
+                switch_mastership = main.FALSE
+
+        if switch_mastership == main.TRUE:
+            main.log.report( "Controller assignment successfull" )
+        else:
+            main.log.report( "Controller assignment failed" )
+        time.sleep( 5 )
+
+        main.step( "Start ONOS on all Nodes" )
+        startResult = main.TRUE
+        for i in range( 1, int( main.numCtrls ) + 1 ):
+            ONOS_ip = main.params[ 'CTRL' ][ 'ip' + str( i ) ]
+            main.log.info( "Starting ONOS Node IP: " + ONOS_ip )
+            sresult = main.ONOSbench.onosStart( ONOS_ip )
+            utilities.assert_equals( expect=main.TRUE, actual=sresult,
+                                     onpass="Test step PASS",
+                                     onfail="Test step FAIL" )
+            startResult = ( startResult and sresult )
+
+        main.step( "Start ONOS CLI on all nodes" )
+        cliResult = main.TRUE
+        #karafTimeout = "3600000" # This is not needed here as it is already set before.
+        # need to wait here sometime for ONOS to bootup.
+        time.sleep( 30 )
+        
+        main.log.step(" Start ONOS cli using thread ")
+        pool = []
+        for i in range( int( main.numCtrls ) ):
+            t = main.Thread(target=cli.startOnosCli,
+                    threadID=main.threadID,
+                    name="startOnosCli",
+                    args=[nodes[i].ip_address])
+            pool.append(t)
+            t.start()
+            main.threadID = main.threadID + 1
+        for t in pool:
+            t.join()
+            cliResult = cliResult and t.result
+        time2 = time.time()
+        
+        if not cliResult:
+                main.log.info("ONOS CLI did not start up properly")
+                main.cleanup()
+                main.exit()
+        else:
+            main.log.info("Successful CLI startup")
+        main.log.info("Time for connecting to CLI: %2f seconds" %(time2-time1))
+
+        main.step( "Balance devices across controllers" )
+        for i in range( int( main.numCtrls ) ):
+            balanceResult = main.ONOScli1.balanceMasters()
+            # giving some breathing time for ONOS to complete re-balance
+            time.sleep( 3 )
+
+        main.step( "Balance devices across controllers" )
+        for i in range( int( main.numCtrls ) ):
+            balanceResult = main.ONOScli1.balanceMasters()
+            # giving some breathing time for ONOS to complete re-balance
+            time.sleep( 3 )
+
+        case13Result = ( startResult and cliResult )
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=case13Result,
+            onpass="Starting new Spine topology test PASS",
+            onfail="Starting new Spine topology test FAIL" )
+
+    def CASE14( self ):
+        """
+        Install 300 host intents and verify ping all for Chordal Topology
+        """
+        main.log.report( "Add 300 host intents and verify pingall" )
+        main.log.report( "_______________________________________" )
+        import itertools
+        
+        main.case( "Install 300 host intents" )
+        main.step( "Add host Intents" )
+        intentResult = main.TRUE
+        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:
+                if i >= len( hostCombos ):
+                    break
+                t = main.Thread( target=cli.addHostIntent,
+                        threadID=main.threadID,
+                        name="addHostIntent",
+                        args=[hostCombos[i][0],hostCombos[i][1]])
+                pool.append(t)
+                t.start()
+                i = i + 1
+                main.threadID = main.threadID + 1
+            for thread in pool:
+                thread.join()
+                intentIdList.append(thread.result)
+        time2 = time.time()
+        main.log.info("Time for adding host intents: %2f seconds" %(time2-time1))
+        intentResult = main.TRUE
+        intentsJson = main.ONOScli2.intents()
+        getIntentStateResult = main.ONOScli1.getIntentState(intentsId = intentIdList,
+                intentsJson = intentsJson)
+        print getIntentStateResult
+
+        main.step( "Verify Ping across all hosts" )
+        pingResult = main.FALSE
+        time1 = time.time()
+        pingResult = main.Mininet1.pingall(timeout=main.pingTimeout)
+        time2 = time.time()
+        timeDiff = round( ( time2 - time1 ), 2 )
+        main.log.report(
+            "Time taken for Ping All: " +
+            str( timeDiff ) +
+            " seconds" )
+        utilities.assert_equals( expect=main.TRUE, actual=pingResult,
+                                 onpass="PING ALL PASS",
+                                 onfail="PING ALL FAIL" )
+
+        case14Result = ( intentResult and pingResult )
+        
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=case14Result,
+            onpass="Install 300 Host Intents and Ping All test PASS",
+            onfail="Install 300 Host Intents and Ping All test FAIL" )
+
+    def CASE15( self ):
+        """
+        Install 300 host intents and verify ping all for Spine Topology
+        """
+        main.log.report( "Add 300 host intents and verify pingall" )
+        main.log.report( "_______________________________________" )
+        import itertools
+        
+        main.case( "Install 300 host intents" )
+        main.step( "Add host Intents" )
+        intentResult = main.TRUE
+        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:
+                if i >= len( hostCombos ):
+                    break
+                t = main.Thread( target=cli.addHostIntent,
+                        threadID=main.threadID,
+                        name="addHostIntent",
+                        args=[hostCombos[i][0],hostCombos[i][1]])
+                pool.append(t)
+                t.start()
+                i = i + 1
+                main.threadID = main.threadID + 1
+            for thread in pool:
+                thread.join()
+                intentIdList.append(thread.result)
+        time2 = time.time()
+        main.log.info("Time for adding host intents: %2f seconds" %(time2-time1))
+        intentResult = main.TRUE
+        intentsJson = main.ONOScli2.intents()
+        getIntentStateResult = main.ONOScli1.getIntentState(intentsId = intentIdList,
+                intentsJson = intentsJson)
+        print getIntentStateResult
+
+        main.step( "Verify Ping across all hosts" )
+        pingResult = main.FALSE
+        time1 = time.time()
+        pingResult = main.Mininet1.pingall(timeout=main.pingTimeout)
+        time2 = time.time()
+        timeDiff = round( ( time2 - time1 ), 2 )
+        main.log.report(
+            "Time taken for Ping All: " +
+            str( timeDiff ) +
+            " seconds" )
+        utilities.assert_equals( expect=main.TRUE, actual=pingResult,
+                                 onpass="PING ALL PASS",
+                                 onfail="PING ALL FAIL" )
+
+        case15Result = ( intentResult and pingResult )
+        
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=case15Result,
+            onpass="Install 300 Host Intents and Ping All test PASS",
+            onfail="Install 300 Host Intents and Ping All test FAIL" )
+
diff --git a/TestON/tests/OnosCHO/OnosCHO.topo b/TestON/tests/OnosCHO/OnosCHO.topo
index 2a79611..53de6dc 100644
--- a/TestON/tests/OnosCHO/OnosCHO.topo
+++ b/TestON/tests/OnosCHO/OnosCHO.topo
@@ -2,16 +2,18 @@
     <COMPONENT>
 
         <ONOSbench>
-            <host>10.128.40.40</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosDriver</type>
             <connect_order>1</connect_order>
-            <COMPONENTS> </COMPONENTS>
+            <COMPONENTS>
+                <home>~/onos</home>
+            </COMPONENTS>
         </ONOSbench>
 
         <ONOScli1>
-            <host>10.128.40.40</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -20,7 +22,7 @@
         </ONOScli1>
 
 	 <ONOScli2>
-            <host>10.128.40.40</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -29,7 +31,7 @@
         </ONOScli2>
 
 	 <ONOScli3>
-            <host>10.128.40.40</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -38,7 +40,7 @@
         </ONOScli3>
 
         <ONOScli4>
-            <host>10.128.40.40</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -47,7 +49,7 @@
         </ONOScli4>
 
 	 <ONOScli5>
-            <host>10.128.40.40</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -56,7 +58,7 @@
         </ONOScli5>
 	
         <ONOS1>
-            <host>10.128.40.40</host>
+            <host>10.128.10.21</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -65,7 +67,7 @@
         </ONOS1>
 
 	<ONOS2>
-            <host>10.128.40.40</host>
+            <host>10.128.10.22</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -74,7 +76,7 @@
         </ONOS2>
 	
 	<ONOS3>
-            <host>10.128.40.40</host>
+            <host>10.128.10.23</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -83,7 +85,7 @@
         </ONOS3>
 
         <ONOS4>
-            <host>10.128.40.40</host>
+            <host>10.128.10.24</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -92,7 +94,7 @@
         </ONOS4>
 
 	<ONOS5>
-            <host>10.128.40.40</host>
+            <host>10.128.10.25</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -101,7 +103,7 @@
         </ONOS5>
 	
         <Mininet1>
-            <host>10.128.40.40</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>MininetCliDriver</type>
@@ -116,7 +118,7 @@
         </Mininet1>
 
         <Mininet2>
-            <host>10.128.40.40</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>RemoteMininetDriver</type>
diff --git a/TestON/tests/OpticalFunc13/OpticalFunc13.params b/TestON/tests/OpticalFunc13/OpticalFunc13.params
new file mode 100755
index 0000000..173d48b
--- /dev/null
+++ b/TestON/tests/OpticalFunc13/OpticalFunc13.params
@@ -0,0 +1,47 @@
+<PARAMS>
+    
+    <testcases>1,21,22,23</testcases>
+
+    #Environment variables
+    <ENV>
+        <cellName>driver_test</cellName>
+    </ENV>
+
+    <CTRL>
+        <ip1>10.128.20.11</ip1>
+        <port1>6633</port1>
+    </CTRL>
+
+    <PING>
+        <source1>h8</source1>
+        <source2>h9</source2>
+        <source3>h10</source3>
+        <source4>h11</source4>
+        <source5>h12</source5>
+        <source6>h13</source6>
+        <source7>h14</source7>
+        <source8>h15</source8>
+        <source9>h16</source9>
+        <source10>h17</source10>
+        <target1>10.0.0.18</target1>
+        <target2>10.0.0.19</target2>
+        <target3>10.0.0.20</target3>
+        <target4>10.0.0.21</target4>
+        <target5>10.0.0.22</target5>
+        <target6>10.0.0.23</target6>
+        <target7>10.0.0.24</target7>
+        <target8>10.0.0.25</target8>
+        <target9>10.0.0.26</target9>
+        <target10>10.0.0.27</target10>
+    </PING>
+
+    <timers>
+        <LinkDiscovery>5</LinkDiscovery>
+        <SwitchDiscovery>31</SwitchDiscovery>
+    </timers>
+
+    <OPTICAL>
+        <jsonfile> /home/admin/ONOS/tools/test/topos/oe-nonlinear-4.json </jsonfile>
+    </OPTICAL>    
+
+</PARAMS>
diff --git a/TestON/tests/OpticalFunc13/OpticalFunc13.py b/TestON/tests/OpticalFunc13/OpticalFunc13.py
new file mode 100755
index 0000000..7ddd532
--- /dev/null
+++ b/TestON/tests/OpticalFunc13/OpticalFunc13.py
@@ -0,0 +1,248 @@
+
+#Testing the basic functionality of ONOS Next
+#For sanity and driver functionality excercises only.
+
+import time
+import sys
+import os
+import re
+import time
+import json
+
+time.sleep(1)
+class OpticalFunc13:
+    def __init__(self):
+        self.default = ''
+
+    def CASE1(self, main):
+        '''
+        Startup sequence:
+        git pull
+        mvn clean install
+        onos-package
+        cell <name>
+        onos-verify-cell
+        onos-install -f
+        onos-wait-for-start
+        '''
+        
+        cell_name = main.params['ENV']['cellName']
+        ONOS1_ip = main.params['CTRL']['ip1']
+        ONOS1_port = main.params['CTRL']['port1']
+        
+        main.case("Setting up test environment")
+        
+        main.step("Git checkout and pull master and get version")
+        main.ONOSbench.git_checkout("master")
+        git_pull_result = main.ONOSbench.git_pull()
+        print "git_pull_result = ", git_pull_result
+        version_result = main.ONOSbench.get_version()
+        main.log.report(main.ONOSbench.get_version())
+        if git_pull_result == 1:
+            main.step("Using mvn clean & install")
+            clean_install_result = main.ONOSbench.clean_install()
+            #clean_install_result = main.TRUE
+
+        main.step("Applying cell variable to environment")
+        cell_result1 = main.ONOSbench.set_cell(cell_name)
+        verify_result = main.ONOSbench.verify_cell()
+        cell_result2 = main.ONOS2.set_cell(cell_name)
+        #verify_result = main.ONOS2.verify_cell()
+        main.ONOS2.start_onos_cli(ONOS_ip=main.params['CTRL']['ip1'])
+        
+        cell_result = cell_result1 and cell_result2
+
+        main.step("Creating ONOS package")
+        package_result = main.ONOSbench.onos_package()
+
+        #main.step("Creating a cell")
+        #cell_create_result = main.ONOSbench.create_cell_file(**************)
+
+        main.step("Installing ONOS package")
+        onos_install_result = main.ONOSbench.onos_install()
+        onos1_isup = main.ONOSbench.isup()
+   
+        main.step("Starting ONOS service")
+        start_result = main.ONOSbench.onos_start(ONOS1_ip)
+
+        case1_result = (package_result and\
+                cell_result and verify_result and onos_install_result and\
+                onos1_isup and start_result )
+        utilities.assert_equals(expect=main.TRUE, actual=case1_result,
+                onpass="Test startup successful",
+                onfail="Test startup NOT successful")
+
+    def CASE11(self, main):
+        '''
+        Cleanup sequence:
+        onos-service <node_ip> stop
+        onos-uninstall
+
+        TODO: Define rest of cleanup
+        
+        '''
+
+        ONOS1_ip = main.params['CTRL']['ip1']
+
+        main.case("Cleaning up test environment")
+
+        main.step("Testing ONOS kill function")
+        kill_result = main.ONOSbench.onos_kill(ONOS1_ip)
+
+        main.step("Stopping ONOS service")
+        stop_result = main.ONOSbench.onos_stop(ONOS1_ip)
+
+        main.step("Uninstalling ONOS service") 
+        uninstall_result = main.ONOSbench.onos_uninstall()
+
+
+    def CASE21(self, main):
+        import time
+        '''
+            On ONOS bench, run this command: ./~/ONOS/tools/test/bin/onos-topo-cfg
+            which starts the rest and copies the links json file to the onos instance
+            Note that in case of Packet Optical, the links are not learnt from the topology, instead the links are learnt 
+            from the json config file
+        '''
+        main.log.report("This testcase starts the packet layer topology and REST")
+        main.log.report("_____________________________________________")
+        sart_console_result = main.LincOE1.start_console()
+        optical_mn_script = main.LincOE2.run_optical_mn_script()
+        onos_topo_cfg_result = main.ONOSbench.run_onos_topo_cfg(instance_name = main.params['CTRL']['ip1'], json_file = main.params['OPTICAL']['jsonfile'])
+         
+
+
+    def CASE22(self, main):
+        '''
+            Curretly we use, 4 linear switch optical topology and 2 packet layer mininet switches each with one host.
+             Therefore, the roadmCount variable = 4, packetLayerSWCount variable = 2, hostCount =2
+            and this is hardcoded in the testcase. If the topology changes, these hardcoded values need to be changed
+        '''
+
+        main.log.report("This testcase compares the optical+packet topology against what is expected")
+        main.ONOS2.start_onos_cli(ONOS_ip=main.params['CTRL']['ip1'])
+        devices_result = main.ONOS2.devices(json_format = False)
+
+        print "devices_result = ", devices_result
+        devices_linewise = devices_result.split("\n")
+        devices_linewise = devices_linewise[1:-1]
+        roadmCount = 0
+        packetLayerSWCount = 0
+        for line in devices_linewise:
+            components = line.split(",")
+            availability = components[1].split("=")[1]
+            type = components[3].split("=")[1]
+            if availability == 'true' and type == 'ROADM':
+                roadmCount += 1
+            elif availability == 'true' and type =='SWITCH':
+                packetLayerSWCount += 1
+        if roadmCount == 4:
+            print "Number of Optical Switches = %d and is correctly detected" %roadmCount
+            main.log.info ("Number of Optical Switches = " +str(roadmCount) +" and is correctly detected")
+            opticalSW_result = main.TRUE
+        else:
+            print "Number of Optical Switches = %d and is wrong" %roadCount
+            main.log.info ("Number of Optical Switches = " +str(roadmCount) +" and is wrong")
+            opticalSW_result = main.FALSE
+
+        if packetLayerSWCount == 2:
+            print "Number of Packet layer or mininet Switches = %d and is correctly detected" %packetLayerSWCount
+            main.log.info("Number of Packet layer or mininet Switches = " +str(packetLayerSWCount) + " and is correctly detected")
+            packetSW_result = main.TRUE
+        else:
+            print "Number of Packet layer or mininet Switches = %d and is wrong" %packetLayerSWCount
+            main.log.info("Number of Packet layer or mininet Switches = " +str(packetLayerSWCount) + " and is wrong")
+            packetSW_result = main.FALSE
+        print "_________________________________"
+        
+        links_result = main.ONOS2.links(json_format = False)
+        print "links_result = ", links_result
+        print "_________________________________"
+        
+
+
+        #Discover hosts using pingall
+        pingall_result = main.LincOE2.pingall()    
+    
+        hosts_result = main.ONOS2.hosts(json_format = False)
+        print "hosts_result = ", hosts_result   
+        print "_________________________________"
+        hosts_linewise = hosts_result.split("\n")
+        hosts_linewise = hosts_linewise[1:-1]
+        hostCount = 0
+        for line in hosts_linewise:
+            hostid = line.split(",")[0].split("=")[1]
+            hostCount +=1
+        if hostCount ==2:
+            print "Number of hosts = %d and is correctly detected" %hostCount
+            main.log.info("Number of hosts = " + str(hostCount) +" and is correctly detected")
+            hostDiscovery = main.TRUE
+        else:
+            print "Number of hosts = %d and is wrong" %hostCount
+            main.log.info("Number of hosts = " + str(hostCount) +" and is wrong")
+            hostDiscovery = main.FALSE
+        
+        case22_result = opticalSW_result and packetSW_result and hostDiscovery
+        utilities.assert_equals(expect=main.TRUE, actual=case22_result,
+                onpass="Packet optical topology discovery successful",
+                onfail="Packet optical topology discovery failed")
+
+    def CASE23(self, main):
+        import time
+        '''
+            Add bidirectional point intents between 2 packet layer(mininet) devices and 
+            ping mininet hosts
+        '''
+        main.log.report("This testcase adds bidirectional point intents between 2 packet layer(mininet) devices and ping mininet hosts")
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000ffffffff0001", 1, "of:0000ffffffff0002", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+
+        ptp_intent_result = main.ONOS2.add_point_intent("of:0000ffffffff0002", 1, "of:0000ffffffff0001", 1)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+
+        time.sleep(10)
+        flowHandle = main.ONOS2.flows()
+        #print "flowHandle = ", flowHandle
+        main.log.info("flows :" + flowHandle)
+        intentHandle = main.ONOS2.intents()        
+        main.log.info("intents :" + intentHandle)        
+ 
+        Ping_Result = main.TRUE
+        count = 1
+        main.log.info("\n\nh1 is Pinging h2")
+        ping = main.LincOE2.pingHostOptical(src="h1", target="h2")
+        #ping = main.LincOE2.pinghost()
+        if ping == main.FALSE and count<5:
+            count+=1
+            Ping_Result = main.FALSE
+            main.log.report("Ping between h1 and h2  failed. Making attempt number "+str(count) + " in 2 seconds")
+            time.sleep(2)
+            ping = main.LincOE2.pingHostOptical(src="h1", target="h2")
+            #ping = main.LincOE2.pinghost()
+        elif ping==main.FALSE:
+            main.log.report("All ping attempts between h1 and h2 have failed")
+            Ping_Result = main.FALSE
+        elif ping==main.TRUE:
+            main.log.info("Ping test between h1 and h2 passed!")
+            Ping_Result = main.TRUE
+        else:
+            main.log.info("Unknown error")
+            Ping_Result = main.ERROR
+        
+        if Ping_Result==main.FALSE:
+            main.log.report("Point intents for packet optical have not ben installed correctly. Cleaning up")
+        if Ping_Result==main.TRUE:
+            main.log.report("Point Intents for packet optical have been installed correctly")
+
+        case23_result = Ping_Result
+        utilities.assert_equals(expect=main.TRUE, actual=case23_result,
+                onpass="Point intents addition for packet optical and Pingall Test successful",
+                onfail="Point intents addition for packet optical and Pingall Test NOT successful")
+
+
diff --git a/TestON/tests/OpticalFunc13/OpticalFunc13.topo b/TestON/tests/OpticalFunc13/OpticalFunc13.topo
new file mode 100755
index 0000000..a3d6cfd
--- /dev/null
+++ b/TestON/tests/OpticalFunc13/OpticalFunc13.topo
@@ -0,0 +1,94 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOSbench>
+
+        <ONOS1>
+            <host>10.128.10.11</host>
+            <user>sdn</user>
+            <password>sdn</password>
+            <type>OnosDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOS2>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS2>
+
+        <Mininet1>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>MininetCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS>
+                #Specify the Option for mininet
+                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
+                <arg2> --topo mytopo </arg2>
+                <arg3> --switch ovs,protocols=OpenFlow13 </arg3>
+                <controller> remote </controller>
+            </COMPONENTS>
+        </Mininet1>
+
+        <Mininet2>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>RemoteMininetDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                #Specify the Option for mininet
+                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
+                <arg2> --topo mytopo </arg2>
+                <arg3> --switch ovs,protocols=OpenFlow13 </arg3>
+                <controller> remote </controller>
+            </COMPONENTS>
+        </Mininet2>
+
+         <LincOE1>
+            <host>10.128.20.30</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>LincOEDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS>
+                <arg1> </arg1>
+            </COMPONENTS>
+        </LincOE1>
+
+         <LincOE2>
+            <host>10.128.20.30</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>RemoteMininetDriver</type>
+            <connect_order>7</connect_order>
+            <COMPONENTS>
+                <arg1> sudo python /home/admin/optical.py </arg1>
+                <arg2> </arg2>
+            </COMPONENTS>
+        </LincOE2>
+
+        <LincOE3>
+            <host>10.128.20.30</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>RemoteMininetDriver</type>
+            <connect_order>8</connect_order>
+        </LincOE3>
+ 
+    
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/OpticalFunc13/__init__.py b/TestON/tests/OpticalFunc13/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/OpticalFunc13/__init__.py
diff --git a/TestON/tests/PingallExample/PingallExample.params b/TestON/tests/PingallExample/PingallExample.params
index aecaab6..12bebcd 100644
--- a/TestON/tests/PingallExample/PingallExample.params
+++ b/TestON/tests/PingallExample/PingallExample.params
@@ -1,12 +1,12 @@
 <PARAMS>
     <testcases>1,2,3</testcases>
     <ENV>
-        <cellName>HA</cellName>
+        <cellName>kelvin</cellName>
     </ENV>
-    <Git>True</Git>
+    <Git>xe</Git>
 
     <CTRL>
-        <ip1>10.128.30.11</ip1>
+        <ip1>10.128.10.21</ip1>
         <port1>6633</port1>
     </CTRL>
 </PARAMS>
diff --git a/TestON/tests/PingallExample/PingallExample.py b/TestON/tests/PingallExample/PingallExample.py
index bb2b1cf..dab380f 100644
--- a/TestON/tests/PingallExample/PingallExample.py
+++ b/TestON/tests/PingallExample/PingallExample.py
@@ -94,6 +94,14 @@
         if case1Result == main.FALSE:
             main.cleanup()
             main.exit()
+        
+        # Starting the mininet using the old way
+        main.step( "Starting Mininet ..." )
+        netIsUp = main.Mininet1.startNet()
+        if netIsUp:
+            main.log.info("Mininet CLI is up")
+        else:
+            main.log.info("Mininet CLI is down")
 
     def CASE2( self, main ):
         """
@@ -119,7 +127,7 @@
             response = main.Mininet1.getSwController( "s" + str( i ) )
             try:
                 main.log.info( str( response ) )
-            except:
+            except Exception:
                 main.log.info( repr( response ) )
             if re.search( "tcp:" + ONOS1Ip, response ):
                 mastershipCheck = mastershipCheck and main.TRUE
diff --git a/TestON/tests/PingallExample/PingallExample.topo b/TestON/tests/PingallExample/PingallExample.topo
index 1712756..dba7a5d 100644
--- a/TestON/tests/PingallExample/PingallExample.topo
+++ b/TestON/tests/PingallExample/PingallExample.topo
@@ -2,7 +2,7 @@
     <COMPONENT>
 
         <ONOSbench>
-            <host>10.128.30.10</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password></password>
             <type>OnosDriver</type>
@@ -11,7 +11,7 @@
         </ONOSbench>
 
         <ONOScli1>
-            <host>10.128.30.10</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password></password>
             <type>OnosCliDriver</type>
@@ -20,16 +20,16 @@
         </ONOScli1>
 
         <ONOS1>
-            <host>10.128.30.11</host>
-            <user>sdn</user>
-            <password>rocks</password>
+            <host>10.128.10.21</host>
+            <user>admin</user>
+            <password></password>
             <type>OnosDriver</type>
             <connect_order>3</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS1>
 
         <Mininet1>
-            <host>10.128.30.9</host>
+            <host>10.128.10.20</host>
             <user>admin</user>
             <password></password>
             <type>MininetCliDriver</type>
diff --git a/TestON/tests/ProdFunc/ProdFunc.params b/TestON/tests/ProdFunc/ProdFunc.params
index 5de8118..c02cbd0 100755
--- a/TestON/tests/ProdFunc/ProdFunc.params
+++ b/TestON/tests/ProdFunc/ProdFunc.params
@@ -1,6 +1,6 @@
 <PARAMS>
     
-    <testcases>1,4,10,5,6,7,8,9,2,8,20,21,22,10,23,24</testcases>
+    <testcases>1,4,11,10,8,12,5,6</testcases>
 
     #Environment variables
     <ENV>
diff --git a/TestON/tests/ProdFunc/ProdFunc.py b/TestON/tests/ProdFunc/ProdFunc.py
old mode 100755
new mode 100644
index 6f4b72b..fdba3ad
--- a/TestON/tests/ProdFunc/ProdFunc.py
+++ b/TestON/tests/ProdFunc/ProdFunc.py
@@ -17,6 +17,7 @@
         self.default = ''
 
     def CASE1( self, main ):
+        import time
         """
         Startup sequence:
         cell <name>
@@ -43,10 +44,10 @@
         main.step( "Removing raft logs before a clen installation of ONOS" )
         main.ONOSbench.onosRemoveRaftLogs()
 
-        main.step( "Git checkout and pull master and get version" )
-        main.ONOSbench.gitCheckout( "master" )
+        main.step( "Git checkout and get version" )
+        #main.ONOSbench.gitCheckout( "master" )
         gitPullResult = main.ONOSbench.gitPull()
-        main.log.info( "git_pull_result = " + gitPullResult )
+        main.log.info( "git_pull_result = " + str( gitPullResult ))
         main.ONOSbench.getVersion( report=True )
 
         if gitPullResult == 1:
@@ -78,14 +79,21 @@
         startResult = main.ONOSbench.onosStart( ONOS1Ip )
 
         main.ONOS2.startOnosCli( ONOSIp=main.params[ 'CTRL' ][ 'ip1' ] )
-
+        main.step( "Starting Mininet CLI..." )
+        
+        # Starting the mininet using the old way
+        main.step( "Starting Mininet ..." )
+        netIsUp = main.Mininet1.startNet()
+        if netIsUp:
+            main.log.info("Mininet CLI is up")
+        
         case1Result = ( packageResult and
                         cellResult and verifyResult
                         and onosInstallResult and
                         onos1Isup and startResult )
         utilities.assert_equals( expect=main.TRUE, actual=case1Result,
-                                onpass="Test startup successful",
-                                onfail="Test startup NOT successful" )
+                                 onpass="Test startup successful",
+                                 onfail="Test startup NOT successful" )
 
     def CASE2( self, main ):
         """
@@ -122,10 +130,10 @@
         else:
             case2Result = main.TRUE
         utilities.assert_equals( expect=main.TRUE, actual=case2Result,
-                                onpass="Switch down discovery successful",
-                                onfail="Switch down discovery failed" )
+                                 onpass="Switch down discovery successful",
+                                 onfail="Switch down discovery failed" )
 
-    def CASE11( self, main ):
+    def CASE101( self, main ):
         """
         Cleanup sequence:
         onos-service <nodeIp> stop
@@ -149,8 +157,8 @@
 
         case11Result = killResult and stopResult and uninstallResult
         utilities.assert_equals( expect=main.TRUE, actual=case11Result,
-                                onpass="Cleanup successful",
-                                onfail="Cleanup failed" )
+                                 onpass="Cleanup successful",
+                                 onfail="Cleanup failed" )
 
     def CASE3( self, main ):
         """
@@ -178,12 +186,13 @@
         cellName = main.params[ 'ENV' ][ 'cellName' ]
         ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
 
-        main.log.report( "This testcase exits the mininet cli and reinstalls\
-                        ONOS to switch over to Packet Optical topology" )
+        main.log.report( "This testcase exits the mininet cli and reinstalls" +
+                         "ONOS to switch over to Packet Optical topology" )
         main.log.report( "_____________________________________________" )
         main.case( "Disconnecting mininet and restarting ONOS" )
         main.step( "Disconnecting mininet and restarting ONOS" )
         mininetDisconnect = main.Mininet1.disconnect()
+        print "mininetDisconnect = ", mininetDisconnect        
 
         main.step( "Removing raft logs before a clen installation of ONOS" )
         main.ONOSbench.onosRemoveRaftLogs()
@@ -214,10 +223,10 @@
         utilities.assert_equals(
             expect=main.TRUE,
             actual=case20Result,
-            onpass="Exiting functionality mininet topology and reinstalling \
-                    ONOS successful",
-            onfail="Exiting functionality mininet topology and reinstalling \
-                    ONOS failed" )
+            onpass= "Exiting functionality mininet topology and reinstalling" +
+                    " ONOS successful",
+            onfail= "Exiting functionality mininet topology and reinstalling" +
+                    " ONOS failed" )
 
     def CASE21( self, main ):
         """
@@ -262,8 +271,8 @@
             these hardcoded values need to be changed
         """
         main.log.report(
-            "This testcase compares the optical+packet topology against what\
-             is expected" )
+            "This testcase compares the optical+packet topology against what" +
+            " is expected" )
         main.case( "Topology comparision" )
         main.step( "Topology comparision" )
         main.ONOS3.startOnosCli( ONOSIp=main.params[ 'CTRL' ][ 'ip1' ] )
@@ -271,7 +280,7 @@
 
         print "devices_result = ", devicesResult
         devicesLinewise = devicesResult.split( "\n" )
-        devicesLinewise = devicesLinewise[ 1:-1 ]
+        devicesLinewise = devicesLinewise[ 1: ]
         roadmCount = 0
         packetLayerSWCount = 0
         for line in devicesLinewise:
@@ -283,8 +292,8 @@
             elif availability == 'true' and type == 'SWITCH':
                 packetLayerSWCount += 1
         if roadmCount == 4:
-            print "Number of Optical Switches = %d and is \
-                    correctly detected" % roadmCount
+            print "Number of Optical Switches = %d and is" % roadmCount +\
+                  " correctly detected"
             main.log.info(
                 "Number of Optical Switches = " +
                 str( roadmCount ) +
@@ -299,16 +308,16 @@
             opticalSWResult = main.FALSE
 
         if packetLayerSWCount == 2:
-            print "Number of Packet layer or mininet Switches = %d and \
-                    is correctly detected" % packetLayerSWCount
+            print "Number of Packet layer or mininet Switches = %d "\
+                    % packetLayerSWCount + "and is correctly detected"
             main.log.info(
                 "Number of Packet layer or mininet Switches = " +
                 str( packetLayerSWCount ) +
                 " and is correctly detected" )
             packetSWResult = main.TRUE
         else:
-            print "Number of Packet layer or mininet Switches = %d and \
-                    is wrong" % packetLayerSWCount
+            print "Number of Packet layer or mininet Switches = %d and"\
+                    % packetLayerSWCount + " is wrong"
             main.log.info(
                 "Number of Packet layer or mininet Switches = " +
                 str( packetLayerSWCount ) +
@@ -362,8 +371,8 @@
             ping mininet hosts
         """
         main.log.report(
-            "This testcase adds bidirectional point intents between 2 \
-                packet layer( mininet ) devices and ping mininet hosts" )
+            "This testcase adds bidirectional point intents between 2 " +
+            "packet layer( mininet ) devices and ping mininet hosts" )
         main.case( "Topology comparision" )
         main.step( "Adding point intents" )
         ptpIntentResult = main.ONOS3.addPointIntent(
@@ -414,21 +423,21 @@
 
         if PingResult == main.FALSE:
             main.log.report(
-                "Point intents for packet optical have not ben installed\
-                correctly. Cleaning up" )
+                "Point intents for packet optical have not ben installed" +
+                " correctly. Cleaning up" )
         if PingResult == main.TRUE:
             main.log.report(
-                "Point Intents for packet optical have been\
-                installed correctly" )
+                "Point Intents for packet optical have been " +
+                "installed correctly" )
 
         case23Result = PingResult
         utilities.assert_equals(
             expect=main.TRUE,
             actual=case23Result,
-            onpass="Point intents addition for packet optical and\
-                    Pingall Test successful",
-            onfail="Point intents addition for packet optical and\
-                    Pingall Test NOT successful" )
+            onpass= "Point intents addition for packet optical and" +
+                    "Pingall Test successful",
+            onfail= "Point intents addition for packet optical and" +
+                    "Pingall Test NOT successful" )
 
     def CASE24( self, main ):
         import time
@@ -461,11 +470,11 @@
                     linksState = item[ 'state' ]
                     if linksState == "INACTIVE":
                         main.log.info(
-                            "Links state is inactive as expected due to one \
-                            of the ports being down" )
+                            "Links state is inactive as expected due to one" +
+                            " of the ports being down" )
                         main.log.report(
-                            "Links state is inactive as expected due to one \
-                            of the ports being down" )
+                            "Links state is inactive as expected due to one" +
+                            " of the ports being down" )
                         linksStateResult = main.TRUE
                         break
                     else:
@@ -511,15 +520,15 @@
 
         case24Result = PingResult and linksStateResult
         utilities.assert_equals( expect=main.TRUE, actual=case24Result,
-                                onpass="Packet optical rerouting successful",
-                                onfail="Packet optical rerouting failed" )
+                                 onpass="Packet optical rerouting successful",
+                                 onfail="Packet optical rerouting failed" )
 
     def CASE4( self, main ):
         import re
         import time
-        main.log.report( "This testcase is testing the assignment of \
-                         all the switches to all the controllers and \
-                         discovering the hists in reactive mode" )
+        main.log.report( "This testcase is testing the assignment of" +
+                         " all the switches to all the controllers and" +
+                         " discovering the hosts in reactive mode" )
         main.log.report( "__________________________________" )
         main.case( "Pingall Test" )
         main.step( "Assigning switches to controllers" )
@@ -631,11 +640,10 @@
 
         main.step( "Pingall" )
         pingResult = main.FALSE
-        while pingResult == main.FALSE:
-            time1 = time.time()
-            pingResult = main.Mininet1.pingall()
-            time2 = time.time()
-            print "Time for pingall: %2f seconds" % ( time2 - time1 )
+        time1 = time.time()
+        pingResult = main.Mininet1.pingall()
+        time2 = time.time()
+        print "Time for pingall: %2f seconds" % ( time2 - time1 )
 
         # Start onos cli again because u might have dropped out of
         # onos prompt to the shell prompt
@@ -644,11 +652,11 @@
 
         case4Result = SwitchMastership and pingResult
         if pingResult == main.TRUE:
-            main.log.report( "Pingall Test in reactive mode to \
-                             discover the hosts successful" )
+            main.log.report( "Pingall Test in reactive mode to" +
+                             " discover the hosts successful" )
         else:
-            main.log.report( "Pingall Test in reactive mode to \
-                              discover the hosts failed" )
+            main.log.report( "Pingall Test in reactive mode to" +
+                             " discover the hosts failed" )
 
         utilities.assert_equals(
             expect=main.TRUE,
@@ -680,9 +688,115 @@
             onpass="Reactive forwarding app uninstallation successful",
             onfail="Reactive forwarding app uninstallation failed" )
 
+
+    def CASE11( self ):
+        # NOTE: This testcase require reactive forwarding mode enabled
+        # NOTE: in the beginning and then uninstall it before adding 
+        # NOTE: point intents. Again the app is installed so that 
+        # NOTE: testcase 10 can be ran successively
+        import time
+        main.log.report(
+            "This testcase moves a host from one switch to another to add" +
+            "point intents between them and then perform ping" )
+        main.log.report( "__________________________________" )
+        main.log.info( "Moving host from one switch to another" )
+        main.case( "Moving host from a device and attach it to another device" )
+        main.step( "Moving host h9 from device s9 and attach it to s8" )
+        main.Mininet1.moveHost(host = 'h9', oldSw = 's9', newSw = 's8')
+
+        time.sleep(15) #Time delay to have all the flows ready
+        main.step( "Pingall" )
+        pingResult = main.FALSE
+        time1 = time.time()
+        pingResult = main.Mininet1.pingall()
+        time2 = time.time()
+        print "Time for pingall: %2f seconds" % ( time2 - time1 )
+
+        hosts = main.ONOS2.hosts( jsonFormat = False )
+        main.log.info( hosts )
+        
+        main.case( "Uninstalling reactive forwarding app" )
+        # Unistall onos-app-fwd app to disable reactive forwarding
+        appUninstallResult = main.ONOS2.featureUninstall( "onos-app-fwd" )
+        main.log.info( "onos-app-fwd uninstalled" )
+
+        main.step( "Add point intents between hosts on the same device")
+        ptpIntentResult = main.ONOS2.addPointIntent(
+            "of:0000000000003008/1",
+            "of:0000000000003008/3" )
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
+            main.log.info( "Point to point intent install successful" )
+            # main.log.info( getIntentResult )
+
+        ptpIntentResult = main.ONOS2.addPointIntent(
+            "of:0000000000003008/3",
+            "of:0000000000003008/1" )
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
+            main.log.info( "Point to point intent install successful" )
+            # main.log.info( getIntentResult )
+
+        main.case( "Ping hosts on the same devices" )
+        ping = main.Mininet1.pingHost( src = 'h8', target = 'h9' )
+
+        '''
+        main.case( "Installing reactive forwarding app" )
+        # Install onos-app-fwd app to enable reactive forwarding
+        appUninstallResult = main.ONOS2.featureInstall( "onos-app-fwd" )
+        main.log.info( "onos-app-fwd installed" )
+        '''
+
+        if ping == main.FALSE:
+            main.log.report(
+                "Point intents for hosts on same devices haven't" +
+                " been installed correctly. Cleaning up" )
+        if ping == main.TRUE:
+            main.log.report(
+                "Point intents for hosts on same devices" +
+                "installed correctly. Cleaning up" )
+
+        case11Result = ping and pingResult
+        utilities.assert_equals(
+            expect = main.TRUE,
+            actual = case11Result,
+            onpass = "Point intents for hosts on same devices" +
+                    "Ping Test successful",
+            onfail = "Point intents for hosts on same devices" +
+                    "Ping Test NOT successful" )
+
+
+    def CASE12( self ):
+        """
+        Verify the default flows on each switch
+        """
+        main.log.report( "This testcase is verifying num of default" +
+                         " flows on each switch" )
+        main.log.report( "__________________________________" )
+        main.case( "Verify num of default flows on each switch" )
+        main.step( "Obtaining the device id's and flowrule count on them" )
+
+        case12Result = main.TRUE
+        idList = main.ONOS2.getAllDevicesId()
+        for id in idList:
+            count = main.ONOS2.FlowAddedCount( id )
+            main.log.info("count = " +count)
+            if int(count) != 3:
+                case12Result = main.FALSE
+                break
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=case12Result,
+            onpass = "Expected default num of flows exist",
+            onfail = "Expected default num of flows do not exist")
+    
+    
+        
+
     def CASE6( self ):
-        main.log.report( "This testcase is testing the addition of \
-                         host intents and then does pingall" )
+        import time
+        main.log.report( "This testcase is testing the addition of" +
+                         " host intents and then does pingall" )
         main.log.report( "__________________________________" )
         main.case( "Obtaining host id's" )
         main.step( "Get hosts" )
@@ -732,13 +846,15 @@
             # NOTE: get host can return None
             # TODO: handle this
             host1Id = main.ONOS2.getHost( host1 )[ 'id' ]
+      
             host2Id = main.ONOS2.getHost( host2 )[ 'id' ]
             main.ONOS2.addHostIntent( host1Id, host2Id )
 
         time.sleep( 10 )
         hIntents = main.ONOS2.intents( jsonFormat=False )
         main.log.info( "intents:" + hIntents )
-        main.ONOS2.flows()
+        flows = main.ONOS2.flows()
+        main.log.info( "flows:" + flows )     
 
         count = 1
         i = 8
@@ -785,7 +901,7 @@
                 PingResult = main.ERROR
         if PingResult == main.FALSE:
             main.log.report(
-                "Ping all test after Host intent addition failed. Cleaning up" )
+                "Ping all test after Host intent addition failed.Cleaning up" )
             # main.cleanup()
             # main.exit()
         if PingResult == main.TRUE:
@@ -802,10 +918,10 @@
     def CASE5( self, main ):
         import json
         # assumes that sts is already in you PYTHONPATH
-        from sts.topology.testonTopology import TestONTopology
+        from sts.topology.teston_topology import TestONTopology
         # main.ONOS2.startOnosCli( ONOSIp=main.params[ 'CTRL' ][ 'ip1' ] )
-        main.log.report( "This testcase is testing if all ONOS nodes \
-                         are in topology sync with mininet" )
+        main.log.report( "This testcase is testing if all ONOS nodes" +
+                         " are in topology sync with mininet" )
         main.log.report( "__________________________________" )
         main.case( "Comparing Mininet topology with the topology of ONOS" )
         main.step( "Start continuous pings" )
@@ -912,17 +1028,17 @@
             onfail="Topology checks failed" )
 
     def CASE7( self, main ):
-        from sts.topology.testonTopology import TestONTopology
+        from sts.topology.teston_topology import TestONTopology
 
         linkSleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        main.log.report( "This testscase is killing a link to ensure that \
-                         link discovery is consistent" )
+        main.log.report( "This testscase is killing a link to ensure that" +
+                         " link discovery is consistent" )
         main.log.report( "__________________________________" )
-        main.log.report( "Killing a link to ensure that link discovery \
-                         is consistent" )
-        main.case( "Killing a link to Ensure that Link Discovery \
-                   is Working Properly" )
+        main.log.report( "Killing a link to ensure that link discovery" +
+                         " is consistent" )
+        main.case( "Killing a link to Ensure that Link Discovery" +
+                   "is Working Properly" )
         """
         main.step( "Start continuous pings" )
 
@@ -1050,31 +1166,28 @@
 
         result = LinkDown and LinkUp and TopologyCheck
         utilities.assert_equals( expect=main.TRUE, actual=result,
-                                onpass="Link failure is discovered correctly",
-                                onfail="Link Discovery failed" )
+                                 onpass="Link failure is discovered correctly",
+                                 onfail="Link Discovery failed" )
 
     def CASE8( self ):
         """
-        Host intents removal
+        Intent removal
         """
-        main.log.report( "This testcase removes any previously added intents \
-                         before adding the same intents or point intents" )
+        import time
+        main.log.report( "This testcase removes any previously added intents" +
+                         " before adding any new set of intents" )
         main.log.report( "__________________________________" )
-        main.log.info( "Host intents removal" )
-        main.case( "Removing host intents" )
+        main.log.info( "intent removal" )
+        main.case( "Removing installed intents" )
         main.step( "Obtain the intent id's" )
         intentResult = main.ONOS2.intents( jsonFormat=False )
         main.log.info( "intent_result = " + intentResult )
-
         intentLinewise = intentResult.split( "\n" )
-        intentList = []
-        for line in intentLinewise:
-            if line.startswith( "id=" ):
-                intentList.append( line )
 
-        intentids = []
-        for line in intentList:
-            intentids.append( line.split( "," )[ 0 ].split( "=" )[ 1 ] )
+        intentList = [line for line in intentLinewise \
+            if line.startswith( "id=")]
+        intentids = [line.split( "," )[ 0 ].split( "=" )[ 1 ] for line in \
+            intentList]
         for id in intentids:
             print "id = ", id
 
@@ -1085,8 +1198,20 @@
 
         intentResult = main.ONOS2.intents( jsonFormat=False )
         main.log.info( "intent_result = " + intentResult )
-
-        case8Result = main.TRUE
+        
+        intentList = [line for line in intentResult.split( "\n" ) \
+            if line.startswith( "id=")]
+        intentState = [line.split( "," )[ 1 ].split( "=" )[ 1 ] for line in \
+            intentList]
+        for state in intentState:
+            print state
+        
+        case8Result = main.TRUE        
+        for state in intentState:
+            if state != 'WITHDRAWN':
+                case8Result = main.FALSE
+                break
+                
         if case8Result == main.TRUE:
             main.log.report( "Intent removal successful" )
         else:
@@ -1113,11 +1238,11 @@
             # Note: If the ping result failed, that means the intents have been
             # withdrawn correctly.
         if PingResult == main.TRUE:
-            main.log.report( "Host intents have not been withdrawn correctly" )
+            main.log.report( "Installed intents have not been withdrawn correctly" )
             # main.cleanup()
             # main.exit()
         if PingResult == main.FALSE:
-            main.log.report( "Host intents have been withdrawn correctly" )
+            main.log.report( "Installed intents have been withdrawn correctly" )
 
         case8Result = case8Result and PingResult
 
@@ -1127,8 +1252,8 @@
             main.log.report( "Intent removal failed" )
 
         utilities.assert_equals( expect=main.FALSE, actual=case8Result,
-                                onpass="Intent removal test failed",
-                                onfail="Intent removal test passed" )
+                                 onpass="Intent removal test passed",
+                                 onfail="Intent removal test failed" )
 
     def CASE9( self ):
         main.log.report(
@@ -1136,12 +1261,13 @@
         main.log.report( "__________________________________" )
         main.log.info( "Adding point intents" )
         main.case(
-            "Adding bidirectional point for mn hosts \
-                  ( h8-h18, h9-h19, h10-h20, h11-h21, h12-h22,\
-                   h13-h23, h14-h24, h15-h25, h16-h26, h17-h27 )" )
-        main.step(
-            "Add point intents for mininet hosts h8 and h18 or \
-                  ONOS hosts h8 and h12" )
+            "Adding bidirectional point for mn hosts" +
+            "( h8-h18, h9-h19, h10-h20, h11-h21, h12-h22, " +
+            "h13-h23, h14-h24, h15-h25, h16-h26, h17-h27 )" )
+
+        main.step( "Add point intents for mn hosts h8 and h18 or" +
+                   "ONOS hosts h8 and h12" )
+        # main.step(var1)
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003008/1",
             "of:0000000000006018/1" )
@@ -1158,9 +1284,8 @@
             main.log.info( "Point to point intent install successful" )
             # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point intents for mininet hosts h9 and h19 or \
-                  ONOS hosts h9 and h13" )
+        var2 = "Add point intents for mn hosts h9&h19 or ONOS hosts h9&h13"
+        main.step(var2)
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003009/1",
             "of:0000000000006019/1" )
@@ -1177,9 +1302,8 @@
             main.log.info( "Point to point intent install successful" )
             # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point intents for mininet hosts h10 and h20 or \
-                  ONOS hosts hA and h14" )
+        var3 = "Add point intents for MN hosts h10&h20 or ONOS hosts hA&h14"
+        main.step(var3)
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003010/1",
             "of:0000000000006020/1" )
@@ -1196,9 +1320,9 @@
             main.log.info( "Point to point intent install successful" )
             # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point intents for mininet hosts h11 and h21 or \
-                  ONOS hosts hB and h15" )
+        var4 = "Add point intents for mininet hosts h11 and h21 or" +\
+               " ONOS hosts hB and h15"
+        main.case(var4)
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003011/1",
             "of:0000000000006021/1" )
@@ -1215,9 +1339,9 @@
             main.log.info( "Point to point intent install successful" )
             # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point intents for mininet hosts h12 and h22 \
-                  ONOS hosts hC and h16" )
+        var5 = "Add point intents for mininet hosts h12 and h22 " +\
+               "ONOS hosts hC and h16"
+        main.case(var5)
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003012/1",
             "of:0000000000006022/1" )
@@ -1234,9 +1358,9 @@
             main.log.info( "Point to point intent install successful" )
             # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point intents for mininet hosts h13 and h23 or \
-                  ONOS hosts hD and h17" )
+        var6 = "Add point intents for mininet hosts h13 and h23 or" +\
+               " ONOS hosts hD and h17"
+        main.case(var6)
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003013/1",
             "of:0000000000006023/1" )
@@ -1253,9 +1377,9 @@
             main.log.info( "Point to point intent install successful" )
             # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point intents for mininet hosts h14 and h24 or \
-                  ONOS hosts hE and h18" )
+        var7 = "Add point intents for mininet hosts h14 and h24 or" +\
+               " ONOS hosts hE and h18"
+        main.case(var7)
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003014/1",
             "of:0000000000006024/1" )
@@ -1272,9 +1396,9 @@
             main.log.info( "Point to point intent install successful" )
             # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point intents for mininet hosts h15 and h25 or \
-                  ONOS hosts hF and h19" )
+        var8 = "Add point intents for mininet hosts h15 and h25 or" +\
+               " ONOS hosts hF and h19"
+        main.case(var8)
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003015/1",
             "of:0000000000006025/1" )
@@ -1291,9 +1415,9 @@
             main.log.info( "Point to point intent install successful" )
             # main.log.info( getIntentResult )
 
-        main.step(
-            "Add intents for mininet hosts h16 and h26 or \
-                  ONOS hosts h10 and h1A" )
+        var9 = "Add intents for mininet hosts h16 and h26 or" +\
+               " ONOS hosts h10 and h1A"
+        main.case(var9)
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003016/1",
             "of:0000000000006026/1" )
@@ -1310,16 +1434,16 @@
             main.log.info( "Point to point intent install successful" )
             # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point intents for mininet hosts h17 and h27 or \
-                  ONOS hosts h11 and h1B" )
+        var10 = "Add point intents for mininet hosts h17 and h27 or" +\
+                " ONOS hosts h11 and h1B"
+        main.case(var10)
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003017/1",
             "of:0000000000006027/1" )
         if ptpIntentResult == main.TRUE:
             getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            main.log.info( getIntentResult )
+            #main.log.info( getIntentResult )
 
         ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006027/1",
@@ -1327,14 +1451,13 @@
         if ptpIntentResult == main.TRUE:
             getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            main.log.info( getIntentResult )
+            #main.log.info( getIntentResult )
 
         print(
             "___________________________________________________________" )
 
         flowHandle = main.ONOS2.flows()
-        # print "flowHandle = ", flowHandle
-        main.log.info( "flows :" + flowHandle )
+        #main.log.info( "flows :" + flowHandle )
 
         count = 1
         i = 8
diff --git a/TestON/tests/ProdFunc/ProdFunc.topo b/TestON/tests/ProdFunc/ProdFunc.topo
index 7dff686..73a0b4f 100755
--- a/TestON/tests/ProdFunc/ProdFunc.topo
+++ b/TestON/tests/ProdFunc/ProdFunc.topo
@@ -63,7 +63,7 @@
                 #Specify the Option for mininet
                 <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
                 <arg2> --topo mytopo </arg2>
-                <arg3> --switch ovs,protocols=OpenFlow13 </arg3>
+                <arg3> --switch ovs,protocols=OpenFlow10 </arg3>
                 <controller> remote </controller>
             </COMPONENTS>
         </Mininet2>
@@ -91,13 +91,5 @@
             </COMPONENTS>
         </LincOE2>
 
-        <LincOE3>
-            <host>10.128.20.30</host>
-            <user>admin</user>
-            <password>onos_test</password>
-            <type>LincOEDriver</type>
-            <connect_order>9</connect_order>
-        </LincOE3>
- 
     </COMPONENT>
 </TOPOLOGY>
diff --git a/TestON/tests/ProdFunc/__init__.py b/TestON/tests/ProdFunc/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/ProdFunc/__init__.py
diff --git a/TestON/tests/ProdFunc13/ProdFunc13.params b/TestON/tests/ProdFunc13/ProdFunc13.params
index bb3c11c..f28d620 100755
--- a/TestON/tests/ProdFunc13/ProdFunc13.params
+++ b/TestON/tests/ProdFunc13/ProdFunc13.params
@@ -1,6 +1,6 @@
 <PARAMS>
     
-    <testcases>1,4,10,5,6,7,8,9,2,20,21,22,10,23,24</testcases>
+    <testcases>1,4,11,10,5,6,7,8,12,9,2,20,21,22,10,23,24</testcases>
 
     #Environment variables
     <ENV>
diff --git a/TestON/tests/ProdFunc13/ProdFunc13.py b/TestON/tests/ProdFunc13/ProdFunc13.py
index 1775ebb..afa538f 100644
--- a/TestON/tests/ProdFunc13/ProdFunc13.py
+++ b/TestON/tests/ProdFunc13/ProdFunc13.py
@@ -3,9 +3,9 @@
 # For sanity and driver functionality excercises only.
 
 import time
-import sys
-import os
-import re
+# import sys
+# import os
+# import re
 import json
 
 time.sleep( 1 )
@@ -17,6 +17,7 @@
         self.default = ''
 
     def CASE1( self, main ):
+        import time
         """
         Startup sequence:
         cell <name>
@@ -28,9 +29,8 @@
         onos-install -f
         onos-wait-for-start
         """
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS1_port = main.params[ 'CTRL' ][ 'port1' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
 
         main.case( "Setting up test environment" )
         main.log.report(
@@ -38,53 +38,60 @@
         main.log.report( "__________________________________" )
 
         main.step( "Applying cell variable to environment" )
-        cell_result = main.ONOSbench.set_cell( cell_name )
-        verify_result = main.ONOSbench.verify_cell()
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
         main.step( "Removing raft logs before a clen installation of ONOS" )
-        main.ONOSbench.onos_remove_raft_logs()
+        main.ONOSbench.onosRemoveRaftLogs()
 
-        main.step( "Git checkout and pull master and get version" )
-        main.ONOSbench.git_checkout( "master" )
-        git_pull_result = main.ONOSbench.git_pull()
-        main.log.info( "git_pull_result = " + git_pull_result )
-        version_result = main.ONOSbench.get_version( report=True )
+        main.step( "Git checkout and get version" )
+        #main.ONOSbench.gitCheckout( "master" )
+        gitPullResult = main.ONOSbench.gitPull()
+        main.log.info( "git_pull_result = " + str( gitPullResult ))
+        main.ONOSbench.getVersion( report=True )
 
-        if git_pull_result == 1:
+        if gitPullResult == 1:
             main.step( "Using mvn clean & install" )
-            clean_install_result = main.ONOSbench.clean_install()
-            #clean_install_result = main.TRUE
-        elif git_pull_result == 0:
+            main.ONOSbench.cleanInstall()
+        elif gitPullResult == 0:
             main.log.report(
                 "Git Pull Failed, look into logs for detailed reason" )
             main.cleanup()
             main.exit()
 
         main.step( "Creating ONOS package" )
-        package_result = main.ONOSbench.onos_package()
+        packageResult = main.ONOSbench.onosPackage()
 
         main.step( "Installing ONOS package" )
-        onos_install_result = main.ONOSbench.onos_install()
-        if onos_install_result == main.TRUE:
+        onosInstallResult = main.ONOSbench.onosInstall()
+        if onosInstallResult == main.TRUE:
             main.log.report( "Installing ONOS package successful" )
         else:
             main.log.report( "Installing ONOS package failed" )
 
-        onos1_isup = main.ONOSbench.isup()
-        if onos1_isup == main.TRUE:
+        onos1Isup = main.ONOSbench.isup()
+        if onos1Isup == main.TRUE:
             main.log.report( "ONOS instance is up and ready" )
         else:
             main.log.report( "ONOS instance may not be up" )
 
         main.step( "Starting ONOS service" )
-        start_result = main.ONOSbench.onos_start( ONOS1_ip )
+        startResult = main.ONOSbench.onosStart( ONOS1Ip )
 
-        main.ONOS2.start_onos_cli( ONOS_ip=main.params[ 'CTRL' ][ 'ip1' ] )
-
-        case1_result = ( package_result and
-                         cell_result and verify_result and onos_install_result and
-                         onos1_isup and start_result )
-        utilities.assert_equals( expect=main.TRUE, actual=case1_result,
+        main.ONOS2.startOnosCli( ONOSIp=main.params[ 'CTRL' ][ 'ip1' ] )
+        main.step( "Starting Mininet CLI..." )
+        
+        # Starting the mininet using the old way
+        main.step( "Starting Mininet ..." )
+        netIsUp = main.Mininet1.startNet()
+        if netIsUp:
+            main.log.info("Mininet CLI is up")
+        
+        case1Result = ( packageResult and
+                        cellResult and verifyResult
+                        and onosInstallResult and
+                        onos1Isup and startResult )
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
                                  onpass="Test startup successful",
                                  onfail="Test startup NOT successful" )
 
@@ -94,13 +101,12 @@
         """
         # NOTE: You should probably run a topology check after this
         import time
-        import json
 
         main.case( "Switch down discovery" )
         main.log.report( "This testcase is testing a switch down discovery" )
         main.log.report( "__________________________________" )
 
-        switch_sleep = int( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
+        switchSleep = int( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
 
         description = "Killing a switch to ensure it is discovered correctly"
         main.log.report( description )
@@ -110,120 +116,126 @@
         main.step( "Kill s28 " )
         main.log.report( "Deleting s28" )
         # FIXME: use new dynamic topo functions
-        main.Mininet1.del_switch( "s28" )
+        main.Mininet1.delSwitch( "s28" )
         main.log.info(
             "Waiting " +
-            str( switch_sleep ) +
+            str( switchSleep ) +
             " seconds for switch down to be discovered" )
-        time.sleep( switch_sleep )
+        time.sleep( switchSleep )
         # Peek at the deleted switch
-        device = main.ONOS2.get_device( dpid="0028" )
+        device = main.ONOS2.getDevice( dpid="0028" )
         print "device = ", device
         if device[ u'available' ] == 'False':
-            case2_result = main.FALSE
+            case2Result = main.FALSE
         else:
-            case2_result = main.TRUE
-        utilities.assert_equals( expect=main.TRUE, actual=case2_result,
+            case2Result = main.TRUE
+        utilities.assert_equals( expect=main.TRUE, actual=case2Result,
                                  onpass="Switch down discovery successful",
                                  onfail="Switch down discovery failed" )
 
-    def CASE11( self, main ):
+    def CASE101( self, main ):
         """
         Cleanup sequence:
-        onos-service <node_ip> stop
+        onos-service <nodeIp> stop
         onos-uninstall
 
         TODO: Define rest of cleanup
 
         """
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
 
         main.case( "Cleaning up test environment" )
 
         main.step( "Testing ONOS kill function" )
-        kill_result = main.ONOSbench.onos_kill( ONOS1_ip )
+        killResult = main.ONOSbench.onosKill( ONOS1Ip )
 
         main.step( "Stopping ONOS service" )
-        stop_result = main.ONOSbench.onos_stop( ONOS1_ip )
+        stopResult = main.ONOSbench.onosStop( ONOS1Ip )
 
         main.step( "Uninstalling ONOS service" )
-        uninstall_result = main.ONOSbench.onos_uninstall()
+        uninstallResult = main.ONOSbench.onosUninstall()
+
+        case11Result = killResult and stopResult and uninstallResult
+        utilities.assert_equals( expect=main.TRUE, actual=case11Result,
+                                 onpass="Cleanup successful",
+                                 onfail="Cleanup failed" )
 
     def CASE3( self, main ):
         """
         Test 'onos' command and its functionality in driver
         """
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
 
         main.case( "Testing 'onos' command" )
 
         main.step( "Sending command 'onos -w <onos-ip> system:name'" )
         cmdstr1 = "system:name"
-        cmd_result1 = main.ONOSbench.onos_cli( ONOS1_ip, cmdstr1 )
-        main.log.info( "onos command returned: " + cmd_result1 )
+        cmdResult1 = main.ONOSbench.onosCli( ONOS1Ip, cmdstr1 )
+        main.log.info( "onos command returned: " + cmdResult1 )
 
         main.step( "Sending command 'onos -w <onos-ip> onos:topology'" )
         cmdstr2 = "onos:topology"
-        cmd_result2 = main.ONOSbench.onos_cli( ONOS1_ip, cmdstr2 )
-        main.log.info( "onos command returned: " + cmd_result2 )
+        cmdResult2 = main.ONOSbench.onosCli( ONOS1Ip, cmdstr2 )
+        main.log.info( "onos command returned: " + cmdResult2 )
 
     def CASE20( self ):
         """
             Exit from mininet cli
             reinstall ONOS
         """
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS1_port = main.params[ 'CTRL' ][ 'port1' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
 
-        main.log.report(
-            "This testcase exits the mininet cli and reinstalls ONOS to switch over to Packet Optical topology" )
+        main.log.report( "This testcase exits the mininet cli and reinstalls" +
+                         "ONOS to switch over to Packet Optical topology" )
         main.log.report( "_____________________________________________" )
         main.case( "Disconnecting mininet and restarting ONOS" )
         main.step( "Disconnecting mininet and restarting ONOS" )
-        mininet_disconnect = main.Mininet1.disconnect()
+        mininetDisconnect = main.Mininet1.disconnect()
+        print "mininetDisconnect = ", mininetDisconnect        
 
         main.step( "Removing raft logs before a clen installation of ONOS" )
-        main.ONOSbench.onos_remove_raft_logs()
+        main.ONOSbench.onosRemoveRaftLogs()
 
         main.step( "Applying cell variable to environment" )
-        cell_result = main.ONOSbench.set_cell( cell_name )
-        verify_result = main.ONOSbench.verify_cell()
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
-        onos_install_result = main.ONOSbench.onos_install()
-        if onos_install_result == main.TRUE:
+        onosInstallResult = main.ONOSbench.onosInstall()
+        if onosInstallResult == main.TRUE:
             main.log.report( "Installing ONOS package successful" )
         else:
             main.log.report( "Installing ONOS package failed" )
 
-        onos1_isup = main.ONOSbench.isup()
-        if onos1_isup == main.TRUE:
+        onos1Isup = main.ONOSbench.isup()
+        if onos1Isup == main.TRUE:
             main.log.report( "ONOS instance is up and ready" )
         else:
             main.log.report( "ONOS instance may not be up" )
 
         main.step( "Starting ONOS service" )
-        start_result = main.ONOSbench.onos_start( ONOS1_ip )
+        startResult = main.ONOSbench.onosStart( ONOS1Ip )
 
-        main.ONOS2.start_onos_cli( ONOS_ip=main.params[ 'CTRL' ][ 'ip1' ] )
-        print "mininet_disconnect =", mininet_disconnect
-        print "onos_install_result =", onos_install_result
-        print "onos1_isup =", onos1_isup
-        print "start_result =", start_result
-
-        case20_result = mininet_disconnect and cell_result and onos_install_result and onos1_isup and start_result
+        main.ONOS2.startOnosCli( ONOSIp=main.params[ 'CTRL' ][ 'ip1' ] )
+        case20Result = mininetDisconnect and cellResult and verifyResult \
+            and onosInstallResult and onos1Isup and \
+            startResult
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=case20_result,
-            onpass="Exiting functionality mininet topology and reinstalling ONOS successful",
-            onfail="Exiting functionality mininet topology and reinstalling ONOS failed" )
+            actual=case20Result,
+            onpass= "Exiting functionality mininet topology and reinstalling" +
+                    " ONOS successful",
+            onfail= "Exiting functionality mininet topology and reinstalling" +
+                    " ONOS failed" )
 
     def CASE21( self, main ):
-        import time
         """
-            On ONOS bench, run this command: ./~/ONOS/tools/test/bin/onos-topo-cfg
-            which starts the rest and copies the links json file to the onos instance
-            Note that in case of Packet Optical, the links are not learnt from the topology, instead the links are learnt
+            On ONOS bench, run this command:
+             ./~/ONOS/tools/test/bin/onos-topo-cfg
+            which starts the rest and copies the links
+            json file to the onos instance.
+            Note that in case of Packet Optical, the links are not learnt
+            from the topology, instead the links are learnt
             from the json config file
         """
         main.log.report(
@@ -231,42 +243,47 @@
         main.log.report( "_____________________________________________" )
         main.case( "Starting LINC-OE and other components" )
         main.step( "Starting LINC-OE and other components" )
-        start_console_result = main.LincOE1.start_console()
-        optical_mn_script = main.LincOE2.run_optical_mn_script()
-        onos_topo_cfg_result = main.ONOSbench.run_onos_topo_cfg(
-            instance_name=main.params[ 'CTRL' ][ 'ip1' ],
-            json_file=main.params[ 'OPTICAL' ][ 'jsonfile' ] )
+        startConsoleResult = main.LincOE1.startConsole()
+        opticalMnScript = main.LincOE2.runOpticalMnScript()
+        onosTopoCfgResult = main.ONOSbench.runOnosTopoCfg(
+            instanceName=main.params[ 'CTRL' ][ 'ip1' ],
+            jsonFile=main.params[ 'OPTICAL' ][ 'jsonfile' ] )
 
-        print "start_console_result =", start_console_result
-        print "optical_mn_script = ", optical_mn_script
-        print "onos_topo_cfg_result =", onos_topo_cfg_result
+        print "start_console_result =", startConsoleResult
+        print "optical_mn_script = ", opticalMnScript
+        print "onos_topo_cfg_result =", onosTopoCfgResult
 
-        case21_result = start_console_result and optical_mn_script and onos_topo_cfg_result
+        case21Result = startConsoleResult and opticalMnScript and \
+            onosTopoCfgResult
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=case21_result,
+            actual=case21Result,
             onpass="Packet optical topology spawned successsfully",
             onfail="Packet optical topology spawning failed" )
 
     def CASE22( self, main ):
         """
-            Curretly we use, 4 linear switch optical topology and 2 packet layer mininet switches each with one host.
-             Therefore, the roadmCount variable = 4, packetLayerSWCount variable = 2, hostCount =2
-            and this is hardcoded in the testcase. If the topology changes, these hardcoded values need to be changed
+            Curretly we use, 4 linear switch optical topology and
+            2 packet layer mininet switches each with one host.
+            Therefore, the roadmCount variable = 4,
+            packetLayerSWCount variable = 2 and hostCount = 2
+            and this is hardcoded in the testcase. If the topology changes,
+            these hardcoded values need to be changed
         """
         main.log.report(
-            "This testcase compares the optical+packet topology against what is expected" )
+            "This testcase compares the optical+packet topology against what" +
+            " is expected" )
         main.case( "Topology comparision" )
         main.step( "Topology comparision" )
-        main.ONOS3.start_onos_cli( ONOS_ip=main.params[ 'CTRL' ][ 'ip1' ] )
-        devices_result = main.ONOS3.devices( json_format=False )
+        main.ONOS3.startOnosCli( ONOSIp=main.params[ 'CTRL' ][ 'ip1' ] )
+        devicesResult = main.ONOS3.devices( jsonFormat=False )
 
-        print "devices_result = ", devices_result
-        devices_linewise = devices_result.split( "\n" )
-        devices_linewise = devices_linewise[ 1:-1 ]
+        print "devices_result = ", devicesResult
+        devicesLinewise = devicesResult.split( "\n" )
+        devicesLinewise = devicesLinewise[ 1: ]
         roadmCount = 0
         packetLayerSWCount = 0
-        for line in devices_linewise:
+        for line in devicesLinewise:
             components = line.split( "," )
             availability = components[ 1 ].split( "=" )[ 1 ]
             type = components[ 3 ].split( "=" )[ 1 ]
@@ -275,93 +292,101 @@
             elif availability == 'true' and type == 'SWITCH':
                 packetLayerSWCount += 1
         if roadmCount == 4:
-            print "Number of Optical Switches = %d and is correctly detected" % roadmCount
+            print "Number of Optical Switches = %d and is" % roadmCount +\
+                  " correctly detected"
             main.log.info(
                 "Number of Optical Switches = " +
                 str( roadmCount ) +
                 " and is correctly detected" )
-            opticalSW_result = main.TRUE
+            opticalSWResult = main.TRUE
         else:
-            print "Number of Optical Switches = %d and is wrong" % roadCount
+            print "Number of Optical Switches = %d and is wrong" % roadmCount
             main.log.info(
                 "Number of Optical Switches = " +
                 str( roadmCount ) +
                 " and is wrong" )
-            opticalSW_result = main.FALSE
+            opticalSWResult = main.FALSE
 
         if packetLayerSWCount == 2:
-            print "Number of Packet layer or mininet Switches = %d and is correctly detected" % packetLayerSWCount
+            print "Number of Packet layer or mininet Switches = %d "\
+                    % packetLayerSWCount + "and is correctly detected"
             main.log.info(
                 "Number of Packet layer or mininet Switches = " +
                 str( packetLayerSWCount ) +
                 " and is correctly detected" )
-            packetSW_result = main.TRUE
+            packetSWResult = main.TRUE
         else:
-            print "Number of Packet layer or mininet Switches = %d and is wrong" % packetLayerSWCount
+            print "Number of Packet layer or mininet Switches = %d and"\
+                    % packetLayerSWCount + " is wrong"
             main.log.info(
                 "Number of Packet layer or mininet Switches = " +
                 str( packetLayerSWCount ) +
                 " and is wrong" )
-            packetSW_result = main.FALSE
+            packetSWResult = main.FALSE
         print "_________________________________"
 
-        links_result = main.ONOS3.links( json_format=False )
-        print "links_result = ", links_result
+        linksResult = main.ONOS3.links( jsonFormat=False )
+        print "links_result = ", linksResult
         print "_________________________________"
 
-        # NOTE:Since only point intents are added, there is no requirement to discover the hosts
+        # NOTE:Since only point intents are added, there is no
+        # requirement to discover the hosts
         # Therfore, the below portion of the code is commented.
         """
         #Discover hosts using pingall
-        pingall_result = main.LincOE2.pingall()
+        pingallResult = main.LincOE2.pingall()
 
-        hosts_result = main.ONOS3.hosts( json_format=False )
-        main.log.info( "hosts_result = "+hosts_result )
+        hostsResult = main.ONOS3.hosts( jsonFormat=False )
+        main.log.info( "hosts_result = "+hostsResult )
         main.log.info( "_________________________________" )
-        hosts_linewise = hosts_result.split( "\n" )
-        hosts_linewise = hosts_linewise[ 1:-1 ]
+        hostsLinewise = hostsResult.split( "\n" )
+        hostsLinewise = hostsLinewise[ 1:-1 ]
         hostCount = 0
-        for line in hosts_linewise:
+        for line in hostsLinewise:
             hostid = line.split( "," )[ 0 ].split( "=" )[ 1 ]
             hostCount +=1
         if hostCount ==2:
             print "Number of hosts = %d and is correctly detected" %hostCount
-            main.log.info( "Number of hosts = " + str( hostCount ) +" and is correctly detected" )
+            main.log.info( "Number of hosts = " + str( hostCount ) +" and \
+                            is correctly detected" )
             hostDiscovery = main.TRUE
         else:
             print "Number of hosts = %d and is wrong" %hostCount
-            main.log.info( "Number of hosts = " + str( hostCount ) +" and is wrong" )
+            main.log.info( "Number of hosts = " + str( hostCount ) +" and \
+                            is wrong" )
             hostDiscovery = main.FALSE
         """
-        case22_result = opticalSW_result and packetSW_result
+        case22Result = opticalSWResult and packetSWResult
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=case22_result,
+            actual=case22Result,
             onpass="Packet optical topology discovery successful",
             onfail="Packet optical topology discovery failed" )
 
     def CASE23( self, main ):
         import time
         """
-            Add bidirectional point intents between 2 packet layer( mininet ) devices and
+            Add bidirectional point intents between 2 packet layer( mininet )
+            devices and
             ping mininet hosts
         """
         main.log.report(
-            "This testcase adds bidirectional point intents between 2 packet layer(mininet) devices and ping mininet hosts" )
+            "This testcase adds bidirectional point intents between 2 " +
+            "packet layer( mininet ) devices and ping mininet hosts" )
         main.case( "Topology comparision" )
         main.step( "Adding point intents" )
-        ptp_intent_result = main.ONOS3.add_point_intent(
+        ptpIntentResult = main.ONOS3.addPointIntent(
             "of:0000ffffffff0001/1",
             "of:0000ffffffff0002/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS3.intents( json_format=False )
+        if ptpIntentResult == main.TRUE:
+            main.ONOS3.intents( jsonFormat=False )
             main.log.info( "Point to point intent install successful" )
 
-        ptp_intent_result = main.ONOS3.add_point_intent(
+        ptpIntentResult = main.ONOS3.addPointIntent(
             "of:0000ffffffff0002/1",
             "of:0000ffffffff0001/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS3.intents( json_format=False )
+        if ptpIntentResult == main.TRUE:
+            main.ONOS3.intents( jsonFormat=False )
             main.log.info( "Point to point intent install successful" )
 
         time.sleep( 10 )
@@ -370,17 +395,17 @@
 
         # Sleep for 30 seconds to provide time for the intent state to change
         time.sleep( 30 )
-        intentHandle = main.ONOS3.intents( json_format=False )
+        intentHandle = main.ONOS3.intents( jsonFormat=False )
         main.log.info( "intents :" + intentHandle )
 
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         count = 1
         main.log.info( "\n\nh1 is Pinging h2" )
         ping = main.LincOE2.pingHostOptical( src="h1", target="h2" )
-        #ping = main.LincOE2.pinghost()
+        # ping = main.LincOE2.pinghost()
         if ping == main.FALSE and count < 5:
             count += 1
-            Ping_Result = main.FALSE
+            PingResult = main.FALSE
             main.log.info(
                 "Ping between h1 and h2  failed. Making attempt number " +
                 str( count ) +
@@ -388,82 +413,91 @@
             time.sleep( 2 )
         elif ping == main.FALSE:
             main.log.info( "All ping attempts between h1 and h2 have failed" )
-            Ping_Result = main.FALSE
+            PingResult = main.FALSE
         elif ping == main.TRUE:
             main.log.info( "Ping test between h1 and h2 passed!" )
-            Ping_Result = main.TRUE
+            PingResult = main.TRUE
         else:
             main.log.info( "Unknown error" )
-            Ping_Result = main.ERROR
+            PingResult = main.ERROR
 
-        if Ping_Result == main.FALSE:
+        if PingResult == main.FALSE:
             main.log.report(
-                "Point intents for packet optical have not ben installed correctly. Cleaning up" )
-        if Ping_Result == main.TRUE:
+                "Point intents for packet optical have not ben installed" +
+                " correctly. Cleaning up" )
+        if PingResult == main.TRUE:
             main.log.report(
-                "Point Intents for packet optical have been installed correctly" )
+                "Point Intents for packet optical have been " +
+                "installed correctly" )
 
-        case23_result = Ping_Result
+        case23Result = PingResult
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=case23_result,
-            onpass="Point intents addition for packet optical and Pingall Test successful",
-            onfail="Point intents addition for packet optical and Pingall Test NOT successful" )
+            actual=case23Result,
+            onpass= "Point intents addition for packet optical and" +
+                    "Pingall Test successful",
+            onfail= "Point intents addition for packet optical and" +
+                    "Pingall Test NOT successful" )
 
     def CASE24( self, main ):
         import time
         import json
         """
-            Test Rerouting of Packet Optical by bringing a port down ( port 22 ) of a switch( switchID=1 ), so that link ( between switch1 port22 - switch4-port30 ) is inactive
-            and do a ping test. If rerouting is successful, ping should pass. also check the flows
+            Test Rerouting of Packet Optical by bringing a port down
+            ( port 22 ) of a switch( switchID=1 ), so that link
+            ( between switch1 port22 - switch4-port30 ) is inactive
+            and do a ping test. If rerouting is successful,
+            ping should pass. also check the flows
         """
         main.log.report(
             "This testcase tests rerouting and pings mininet hosts" )
         main.case( "Test rerouting and pings mininet hosts" )
         main.step( "Bring a port down and verify the link state" )
-        main.LincOE1.port_down( sw_id="1", pt_id="22" )
-        links_nonjson = main.ONOS3.links( json_format=False )
-        main.log.info( "links = " + links_nonjson )
+        main.LincOE1.portDown( swId="1", ptId="22" )
+        linksNonjson = main.ONOS3.links( jsonFormat=False )
+        main.log.info( "links = " + linksNonjson )
 
         links = main.ONOS3.links()
         main.log.info( "links = " + links )
 
-        links_result = json.loads( links )
-        links_state_result = main.FALSE
-        for item in links_result:
+        linksResult = json.loads( links )
+        linksStateResult = main.FALSE
+        for item in linksResult:
             if item[ 'src' ][ 'device' ] == "of:0000ffffffffff01" and item[
                     'src' ][ 'port' ] == "22":
                 if item[ 'dst' ][ 'device' ] == "of:0000ffffffffff04" and item[
                         'dst' ][ 'port' ] == "30":
-                    links_state = item[ 'state' ]
-                    if links_state == "INACTIVE":
+                    linksState = item[ 'state' ]
+                    if linksState == "INACTIVE":
                         main.log.info(
-                            "Links state is inactive as expected due to one of the ports being down" )
+                            "Links state is inactive as expected due to one" +
+                            " of the ports being down" )
                         main.log.report(
-                            "Links state is inactive as expected due to one of the ports being down" )
-                        links_state_result = main.TRUE
+                            "Links state is inactive as expected due to one" +
+                            " of the ports being down" )
+                        linksStateResult = main.TRUE
                         break
                     else:
                         main.log.info(
                             "Links state is not inactive as expected" )
                         main.log.report(
                             "Links state is not inactive as expected" )
-                        links_state_result = main.FALSE
+                        linksStateResult = main.FALSE
 
-        print "links_state_result = ", links_state_result
+        print "links_state_result = ", linksStateResult
         time.sleep( 10 )
         flowHandle = main.ONOS3.flows()
         main.log.info( "flows :" + flowHandle )
 
         main.step( "Verify Rerouting by a ping test" )
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         count = 1
         main.log.info( "\n\nh1 is Pinging h2" )
         ping = main.LincOE2.pingHostOptical( src="h1", target="h2" )
-        #ping = main.LincOE2.pinghost()
+        # ping = main.LincOE2.pinghost()
         if ping == main.FALSE and count < 5:
             count += 1
-            Ping_Result = main.FALSE
+            PingResult = main.FALSE
             main.log.info(
                 "Ping between h1 and h2  failed. Making attempt number " +
                 str( count ) +
@@ -471,159 +505,162 @@
             time.sleep( 2 )
         elif ping == main.FALSE:
             main.log.info( "All ping attempts between h1 and h2 have failed" )
-            Ping_Result = main.FALSE
+            PingResult = main.FALSE
         elif ping == main.TRUE:
             main.log.info( "Ping test between h1 and h2 passed!" )
-            Ping_Result = main.TRUE
+            PingResult = main.TRUE
         else:
             main.log.info( "Unknown error" )
-            Ping_Result = main.ERROR
+            PingResult = main.ERROR
 
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report( "Ping test successful " )
-        if Ping_Result == main.FALSE:
+        if PingResult == main.FALSE:
             main.log.report( "Ping test failed" )
 
-        case24_result = Ping_Result and links_state_result
-        utilities.assert_equals( expect=main.TRUE, actual=case24_result,
+        case24Result = PingResult and linksStateResult
+        utilities.assert_equals( expect=main.TRUE, actual=case24Result,
                                  onpass="Packet optical rerouting successful",
                                  onfail="Packet optical rerouting failed" )
 
     def CASE4( self, main ):
         import re
         import time
-        main.log.report(
-            "This testcase is testing the assignment of all the switches to all the controllers and discovering the hosts in reactive mode" )
+        main.log.report( "This testcase is testing the assignment of" +
+                         " all the switches to all the controllers and" +
+                         " discovering the hosts in reactive mode" )
         main.log.report( "__________________________________" )
         main.case( "Pingall Test" )
         main.step( "Assigning switches to controllers" )
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
         for i in range( 1, 29 ):
             if i == 1:
-                main.Mininet1.assign_sw_controller(
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS1_ip,
-                    port1=ONOS1_port )
+                    ip1=ONOS1Ip,
+                    port1=ONOS1Port )
             elif i >= 2 and i < 5:
-                main.Mininet1.assign_sw_controller(
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS1_ip,
-                    port1=ONOS1_port )
+                    ip1=ONOS1Ip,
+                    port1=ONOS1Port )
             elif i >= 5 and i < 8:
-                main.Mininet1.assign_sw_controller(
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS1_ip,
-                    port1=ONOS1_port )
+                    ip1=ONOS1Ip,
+                    port1=ONOS1Port )
             elif i >= 8 and i < 18:
-                main.Mininet1.assign_sw_controller(
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS1_ip,
-                    port1=ONOS1_port )
+                    ip1=ONOS1Ip,
+                    port1=ONOS1Port )
             elif i >= 18 and i < 28:
-                main.Mininet1.assign_sw_controller(
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS1_ip,
-                    port1=ONOS1_port )
+                    ip1=ONOS1Ip,
+                    port1=ONOS1Port )
             else:
-                main.Mininet1.assign_sw_controller(
+                main.Mininet1.assignSwController(
                     sw=str( i ),
-                    ip1=ONOS1_ip,
-                    port1=ONOS1_port )
-        Switch_Mastership = main.TRUE
+                    ip1=ONOS1Ip,
+                    port1=ONOS1Port )
+        SwitchMastership = main.TRUE
         for i in range( 1, 29 ):
             if i == 1:
-                response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+                response = main.Mininet1.getSwController( "s" + str( i ) )
                 print( "Response is " + str( response ) )
-                if re.search( "tcp:" + ONOS1_ip, response ):
-                    Switch_Mastership = Switch_Mastership and main.TRUE
+                if re.search( "tcp:" + ONOS1Ip, response ):
+                    SwitchMastership = SwitchMastership and main.TRUE
                 else:
-                    Switch_Mastership = main.FALSE
+                    SwitchMastership = main.FALSE
             elif i >= 2 and i < 5:
-                response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+                response = main.Mininet1.getSwController( "s" + str( i ) )
                 print( "Response is " + str( response ) )
-                if re.search( "tcp:" + ONOS1_ip, response ):
-                    Switch_Mastership = Switch_Mastership and main.TRUE
+                if re.search( "tcp:" + ONOS1Ip, response ):
+                    SwitchMastership = SwitchMastership and main.TRUE
                 else:
-                    Switch_Mastership = main.FALSE
+                    SwitchMastership = main.FALSE
             elif i >= 5 and i < 8:
-                response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+                response = main.Mininet1.getSwController( "s" + str( i ) )
                 print( "Response is " + str( response ) )
-                if re.search( "tcp:" + ONOS1_ip, response ):
-                    Switch_Mastership = Switch_Mastership and main.TRUE
+                if re.search( "tcp:" + ONOS1Ip, response ):
+                    SwitchMastership = SwitchMastership and main.TRUE
                 else:
-                    Switch_Mastership = main.FALSE
+                    SwitchMastership = main.FALSE
             elif i >= 8 and i < 18:
-                response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+                response = main.Mininet1.getSwController( "s" + str( i ) )
                 print( "Response is " + str( response ) )
-                if re.search( "tcp:" + ONOS1_ip, response ):
-                    Switch_Mastership = Switch_Mastership and main.TRUE
+                if re.search( "tcp:" + ONOS1Ip, response ):
+                    SwitchMastership = SwitchMastership and main.TRUE
                 else:
-                    Switch_Mastership = main.FALSE
+                    SwitchMastership = main.FALSE
             elif i >= 18 and i < 28:
-                response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+                response = main.Mininet1.getSwController( "s" + str( i ) )
                 print( "Response is " + str( response ) )
-                if re.search( "tcp:" + ONOS1_ip, response ):
-                    Switch_Mastership = Switch_Mastership and main.TRUE
+                if re.search( "tcp:" + ONOS1Ip, response ):
+                    SwitchMastership = SwitchMastership and main.TRUE
                 else:
-                    Switch_Mastership = main.FALSE
+                    SwitchMastership = main.FALSE
             else:
-                response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+                response = main.Mininet1.getSwController( "s" + str( i ) )
                 print( "Response is" + str( response ) )
-                if re.search( "tcp:" + ONOS1_ip, response ):
-                    Switch_Mastership = Switch_Mastership and main.TRUE
+                if re.search( "tcp:" + ONOS1Ip, response ):
+                    SwitchMastership = SwitchMastership and main.TRUE
                 else:
-                    Switch_Mastership = main.FALSE
+                    SwitchMastership = main.FALSE
 
-        if Switch_Mastership == main.TRUE:
+        if SwitchMastership == main.TRUE:
             main.log.report( "Controller assignmnet successful" )
         else:
             main.log.report( "Controller assignmnet failed" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Switch_Mastership,
+            actual=SwitchMastership,
             onpass="MasterControllers assigned correctly" )
         """
         for i in range ( 1,29 ):
-            main.Mininet1.assign_sw_controller( sw=str( i ),count=5,
-                    ip1=ONOS1_ip,port1=ONOS1_port,
-                    ip2=ONOS2_ip,port2=ONOS2_port,
-                    ip3=ONOS3_ip,port3=ONOS3_port,
-                    ip4=ONOS4_ip,port4=ONOS4_port,
-                    ip5=ONOS5_ip,port5=ONOS5_port )
+            main.Mininet1.assignSwController( sw=str( i ),count=5,
+                    ip1=ONOS1Ip,port1=ONOS1Port,
+                    ip2=ONOS2Ip,port2=ONOS2Port,
+                    ip3=ONOS3Ip,port3=ONOS3Port,
+                    ip4=ONOS4Ip,port4=ONOS4Port,
+                    ip5=ONOS5Ip,port5=ONOS5Port )
         """
         # REACTIVE FWD test
 
         main.step( "Get list of hosts from Mininet" )
-        host_list = main.Mininet1.get_hosts()
-        main.log.info( host_list )
+        hostList = main.Mininet1.getHosts()
+        main.log.info( hostList )
 
         main.step( "Get host list in ONOS format" )
-        host_onos_list = main.ONOS2.get_hosts_id( host_list )
-        main.log.info( host_onos_list )
+        hostOnosList = main.ONOS2.getHostsId( hostList )
+        main.log.info( hostOnosList )
         # time.sleep( 5 )
 
         main.step( "Pingall" )
-        ping_result = main.FALSE
-        while ping_result == main.FALSE:
-            time1 = time.time()
-            ping_result = main.Mininet1.pingall()
-            time2 = time.time()
-            print "Time for pingall: %2f seconds" % ( time2 - time1 )
+        pingResult = main.FALSE
+        time1 = time.time()
+        pingResult = main.Mininet1.pingall()
+        time2 = time.time()
+        print "Time for pingall: %2f seconds" % ( time2 - time1 )
 
-        # Start onos cli again because u might have dropped out of onos prompt to the shell prompt
+        # Start onos cli again because u might have dropped out of
+        # onos prompt to the shell prompt
         # if there was no activity
-        main.ONOS2.start_onos_cli( ONOS_ip=main.params[ 'CTRL' ][ 'ip1' ] )
+        main.ONOS2.startOnosCli( ONOSIp=main.params[ 'CTRL' ][ 'ip1' ] )
 
-        case4_result = Switch_Mastership and ping_result
-        if ping_result == main.TRUE:
-            main.log.report(
-                "Pingall Test in reactive mode to discover the hosts successful" )
+        case4Result = SwitchMastership and pingResult
+        if pingResult == main.TRUE:
+            main.log.report( "Pingall Test in reactive mode to" +
+                             " discover the hosts successful" )
         else:
-            main.log.report(
-                "Pingall Test in reactive mode to discover the hosts failed" )
+            main.log.report( "Pingall Test in reactive mode to" +
+                             " discover the hosts failed" )
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=case4_result,
+            actual=case4Result,
             onpass="Controller assignment and Pingall Test successful",
             onfail="Controller assignment and Pingall Test NOT successful" )
 
@@ -633,74 +670,189 @@
         main.log.report( "__________________________________" )
         main.case( "Uninstalling reactive forwarding app" )
         # Unistall onos-app-fwd app to disable reactive forwarding
-        appUninstall_result = main.ONOS2.feature_uninstall( "onos-app-fwd" )
+        appUninstallResult = main.ONOS2.featureUninstall( "onos-app-fwd" )
         main.log.info( "onos-app-fwd uninstalled" )
 
-        # After reactive forwarding is disabled, the reactive flows on switches timeout in 10-15s
+        # After reactive forwarding is disabled, the reactive flows on
+        # switches timeout in 10-15s
         # So sleep for 15s
         time.sleep( 15 )
 
         flows = main.ONOS2.flows()
         main.log.info( flows )
 
-        case10_result = appUninstall_result
+        case10Result = appUninstallResult
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=case10_result,
+            actual=case10Result,
             onpass="Reactive forwarding app uninstallation successful",
             onfail="Reactive forwarding app uninstallation failed" )
 
-    def CASE6( self ):
+
+    def CASE11( self ):
+        # NOTE: This testcase require reactive forwarding mode enabled
+        # NOTE: in the beginning and then uninstall it before adding 
+        # NOTE: point intents. Again the app is installed so that 
+        # NOTE: testcase 10 can be ran successively
+        import time
         main.log.report(
-            "This testcase is testing the addition of host intents and then does pingall" )
+            "This testcase moves a host from one switch to another to add" +
+            "point intents between them and then perform ping" )
+        main.log.report( "__________________________________" )
+        main.log.info( "Moving host from one switch to another" )
+        main.case( "Moving host from a device and attach it to another device" )
+        main.step( "Moving host h9 from device s9 and attach it to s8" )
+        main.Mininet1.moveHost(host = 'h9', oldSw = 's9', newSw = 's8')
+
+        time.sleep(15) #Time delay to have all the flows ready
+        main.step( "Pingall" )
+        pingResult = main.FALSE
+        time1 = time.time()
+        pingResult = main.Mininet1.pingall()
+        time2 = time.time()
+        print "Time for pingall: %2f seconds" % ( time2 - time1 )
+
+        hosts = main.ONOS2.hosts( jsonFormat = False )
+        main.log.info( hosts )
+        
+        main.case( "Uninstalling reactive forwarding app" )
+        # Unistall onos-app-fwd app to disable reactive forwarding
+        appUninstallResult = main.ONOS2.featureUninstall( "onos-app-fwd" )
+        main.log.info( "onos-app-fwd uninstalled" )
+
+        main.step( "Add point intents between hosts on the same device")
+        ptpIntentResult = main.ONOS2.addPointIntent(
+            "of:0000000000003008/1",
+            "of:0000000000003008/3" )
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
+            main.log.info( "Point to point intent install successful" )
+            # main.log.info( getIntentResult )
+
+        ptpIntentResult = main.ONOS2.addPointIntent(
+            "of:0000000000003008/3",
+            "of:0000000000003008/1" )
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
+            main.log.info( "Point to point intent install successful" )
+            # main.log.info( getIntentResult )
+
+        main.case( "Ping hosts on the same devices" )
+        ping = main.Mininet1.pingHost( src = 'h8', target = 'h9' )
+
+        '''
+        main.case( "Installing reactive forwarding app" )
+        # Install onos-app-fwd app to enable reactive forwarding
+        appUninstallResult = main.ONOS2.featureInstall( "onos-app-fwd" )
+        main.log.info( "onos-app-fwd installed" )
+        '''
+
+        if ping == main.FALSE:
+            main.log.report(
+                "Point intents for hosts on same devices haven't" +
+                " been installed correctly. Cleaning up" )
+        if ping == main.TRUE:
+            main.log.report(
+                "Point intents for hosts on same devices" +
+                "installed correctly. Cleaning up" )
+
+        case11Result = ping and pingResult
+        utilities.assert_equals(
+            expect = main.TRUE,
+            actual = case11Result,
+            onpass = "Point intents for hosts on same devices" +
+                    "Ping Test successful",
+            onfail = "Point intents for hosts on same devices" +
+                    "Ping Test NOT successful" )
+
+
+    def CASE12( self ):
+        """
+        Verify the default flows on each switch
+        """
+        case12Result = main.TRUE
+        idList = main.ONOS2.getAllDevicesId()
+        for id in idList:
+            count = main.ONOS2.FlowStateCount( id )
+            print "count = ", count
+            if count != 5:
+                case12Result = main.FALSE
+        
+        utilities.assert_equals(
+            expect=main.TRUE,
+            actual=case12Result,
+            onpass = "Expected default num of flows exist",
+            onfail = "Expected default num of flows do not exist")
+    
+    
+        
+
+    def CASE6( self ):
+        import time
+        main.log.report( "This testcase is testing the addition of" +
+                         " host intents and then does pingall" )
         main.log.report( "__________________________________" )
         main.case( "Obtaining host id's" )
         main.step( "Get hosts" )
         hosts = main.ONOS2.hosts()
-        # main.log.info( hosts )
+        main.log.info( hosts )
 
         main.step( "Get all devices id" )
-        devices_id_list = main.ONOS2.get_all_devices_id()
-        # main.log.info( devices_id_list )
+        devicesIdList = main.ONOS2.getAllDevicesId()
+        main.log.info( devicesIdList )
 
-        # ONOS displays the hosts in hex format unlike mininet which does in decimal format
+        # ONOS displays the hosts in hex format unlike mininet which does
+        # in decimal format
         # So take care while adding intents
         """
-        main.step( "Add host-to-host intents for mininet hosts h8 and h18 or ONOS hosts h8 and h12" )
-        hth_intent_result = main.ONOS2.add_host_intent( "00:00:00:00:00:08/-1", "00:00:00:00:00:12/-1" )
-        hth_intent_result = main.ONOS2.add_host_intent( "00:00:00:00:00:09/-1", "00:00:00:00:00:13/-1" )
-        hth_intent_result = main.ONOS2.add_host_intent( "00:00:00:00:00:0A/-1", "00:00:00:00:00:14/-1" )
-        hth_intent_result = main.ONOS2.add_host_intent( "00:00:00:00:00:0B/-1", "00:00:00:00:00:15/-1" )
-        hth_intent_result = main.ONOS2.add_host_intent( "00:00:00:00:00:0C/-1", "00:00:00:00:00:16/-1" )
-        hth_intent_result = main.ONOS2.add_host_intent( "00:00:00:00:00:0D/-1", "00:00:00:00:00:17/-1" )
-        hth_intent_result = main.ONOS2.add_host_intent( "00:00:00:00:00:0E/-1", "00:00:00:00:00:18/-1" )
-        hth_intent_result = main.ONOS2.add_host_intent( "00:00:00:00:00:0F/-1", "00:00:00:00:00:19/-1" )
-        hth_intent_result = main.ONOS2.add_host_intent( "00:00:00:00:00:10/-1", "00:00:00:00:00:1A/-1" )
-        hth_intent_result = main.ONOS2.add_host_intent( "00:00:00:00:00:11/-1", "00:00:00:00:00:1B/-1" )
-        print "_____________________________________________________________________________________"
+        main.step( "Add host-to-host intents for mininet hosts h8 and h18 or
+                    ONOS hosts h8 and h12" )
+        hthIntentResult = main.ONOS2.addHostIntent(
+                            "00:00:00:00:00:08/-1", "00:00:00:00:00:12/-1" )
+        hthIntentResult = main.ONOS2.addHostIntent(
+                            "00:00:00:00:00:09/-1", "00:00:00:00:00:13/-1" )
+        hthIntentResult = main.ONOS2.addHostIntent(
+                            "00:00:00:00:00:0A/-1", "00:00:00:00:00:14/-1" )
+        hthIntentResult = main.ONOS2.addHostIntent(
+                            "00:00:00:00:00:0B/-1", "00:00:00:00:00:15/-1" )
+        hthIntentResult = main.ONOS2.addHostIntent(
+                            "00:00:00:00:00:0C/-1", "00:00:00:00:00:16/-1" )
+        hthIntentResult = main.ONOS2.addHostIntent(
+                            "00:00:00:00:00:0D/-1", "00:00:00:00:00:17/-1" )
+        hthIntentResult = main.ONOS2.addHostIntent(
+                            "00:00:00:00:00:0E/-1", "00:00:00:00:00:18/-1" )
+        hthIntentResult = main.ONOS2.addHostIntent(
+                            "00:00:00:00:00:0F/-1", "00:00:00:00:00:19/-1" )
+        hthIntentResult = main.ONOS2.addHostIntent(
+                            "00:00:00:00:00:10/-1", "00:00:00:00:00:1A/-1" )
+        hthIntentResult = main.ONOS2.addHostIntent(
+                            "00:00:00:00:00:11/-1", "00:00:00:00:00:1B/-1" )
+        print "______________________________________________________"
         """
         for i in range( 8, 18 ):
             main.log.info(
-                "Adding host intent between h" + str( i ) + " and h" + str( i + 10 ) )
+                "Adding host intent between h" + str( i ) +
+                " and h" + str( i + 10 ) )
             host1 = "00:00:00:00:00:" + \
                 str( hex( i )[ 2: ] ).zfill( 2 ).upper()
             host2 = "00:00:00:00:00:" + \
                 str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
             # NOTE: get host can return None
             # TODO: handle this
-            host1_id = main.ONOS2.get_host( host1 )[ 'id' ]
-            host2_id = main.ONOS2.get_host( host2 )[ 'id' ]
-            tmp_result = main.ONOS2.add_host_intent( host1_id, host2_id )
+            host1Id = main.ONOS2.getHost( host1 )[ 'id' ]
+      
+            host2Id = main.ONOS2.getHost( host2 )[ 'id' ]
+            main.ONOS2.addHostIntent( host1Id, host2Id )
 
         time.sleep( 10 )
-        h_intents = main.ONOS2.intents( json_format=False )
-        main.log.info( "intents:" + h_intents )
-        flowHandle = main.ONOS2.flows()
-        #main.log.info( "flow:" +flowHandle )
+        hIntents = main.ONOS2.intents( jsonFormat=False )
+        main.log.info( "intents:" + hIntents )
+        flows = main.ONOS2.flows()
+        main.log.info( "flows:" + flows )     
 
         count = 1
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         # while i<10:
         while i < 18:
             main.log.info(
@@ -709,8 +861,8 @@
                 src="h" + str( i ), target="h" + str( i + 10 ) )
             if ping == main.FALSE and count < 5:
                 count += 1
-                #i = 8
-                Ping_Result = main.FALSE
+                # i = 8
+                PingResult = main.FALSE
                 main.log.report( "Ping between h" +
                                  str( i ) +
                                  " and h" +
@@ -728,7 +880,7 @@
                                       10 ) +
                                  "have failed" )
                 i = 19
-                Ping_Result = main.FALSE
+                PingResult = main.FALSE
             elif ping == main.TRUE:
                 main.log.info( "Ping test between h" +
                                str( i ) +
@@ -737,39 +889,33 @@
                                     10 ) +
                                "passed!" )
                 i += 1
-                Ping_Result = main.TRUE
+                PingResult = main.TRUE
             else:
                 main.log.info( "Unknown error" )
-                Ping_Result = main.ERROR
-        if Ping_Result == main.FALSE:
+                PingResult = main.ERROR
+        if PingResult == main.FALSE:
             main.log.report(
-                "Ping all test after Host intent addition failed. Cleaning up" )
+                "Ping all test after Host intent addition failed.Cleaning up" )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report(
                 "Ping all test after Host intent addition successful" )
 
-        case6_result = Ping_Result
+        case6Result = PingResult
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=case6_result,
+            actual=case6Result,
             onpass="Pingall Test after Host intents addition successful",
             onfail="Pingall Test after Host intents addition failed" )
 
     def CASE5( self, main ):
         import json
-        from subprocess import Popen, PIPE
         # assumes that sts is already in you PYTHONPATH
         from sts.topology.teston_topology import TestONTopology
-        # main.ONOS2.start_onos_cli( ONOS_ip=main.params[ 'CTRL' ][ 'ip1' ] )
-        deviceResult = main.ONOS2.devices()
-        linksResult = main.ONOS2.links()
-        #portsResult = main.ONOS2.ports()
-        print "**************"
-
-        main.log.report(
-            "This testcase is testing if all ONOS nodes are in topology sync with mininet" )
+        # main.ONOS2.startOnosCli( ONOSIp=main.params[ 'CTRL' ][ 'ip1' ] )
+        main.log.report( "This testcase is testing if all ONOS nodes" +
+                         " are in topology sync with mininet" )
         main.log.report( "__________________________________" )
         main.case( "Comparing Mininet topology with the topology of ONOS" )
         main.step( "Start continuous pings" )
@@ -836,22 +982,22 @@
             ctrls )  # can also add Intent API info for intent operations
         MNTopo = Topo
 
-        Topology_Check = main.TRUE
+        TopologyCheck = main.TRUE
         main.step( "Compare ONOS Topology to MN Topology" )
-        devices_json = main.ONOS2.devices()
-        links_json = main.ONOS2.links()
-        #ports_json = main.ONOS2.ports()
-        print "devices_json= ", devices_json
+        devicesJson = main.ONOS2.devices()
+        linksJson = main.ONOS2.links()
+        # portsJson = main.ONOS2.ports()
 
-        result1 = main.Mininet1.compare_switches(
+        result1 = main.Mininet1.compareSwitches(
             MNTopo,
-            json.loads( devices_json ) )
-        result2 = main.Mininet1.compare_links(
+            json.loads( devicesJson ) )
+        result2 = main.Mininet1.compareLinks(
             MNTopo,
-            json.loads( links_json ) )
-        #result3 = main.Mininet1.compare_ports( MNTopo, json.loads( ports_json ) )
+            json.loads( linksJson ) )
+        # result3 = main.Mininet1.comparePorts(
+        # MNTopo, json.loads( portsJson ) )
 
-        #result = result1 and result2 and result3
+        # result = result1 and result2 and result3
         result = result1 and result2
 
         print "***********************"
@@ -868,55 +1014,64 @@
             onfail="ONOS" +
             " Topology does not match MN Topology" )
 
-        Topology_Check = Topology_Check and result
+        TopologyCheck = TopologyCheck and result
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Topology_Check,
+            actual=TopologyCheck,
             onpass="Topology checks passed",
             onfail="Topology checks failed" )
 
     def CASE7( self, main ):
+        from sts.topology.teston_topology import TestONTopology
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
+        linkSleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
 
-        link_sleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
-
-        main.log.report(
-            "This testscase is killing a link to ensure that link discovery is consistent" )
+        main.log.report( "This testscase is killing a link to ensure that" +
+                         " link discovery is consistent" )
         main.log.report( "__________________________________" )
-        main.log.report(
-            "Killing a link to ensure that link discovery is consistent" )
-        main.case(
-            "Killing a link to Ensure that Link Discovery is Working Properly" )
+        main.log.report( "Killing a link to ensure that link discovery" +
+                         " is consistent" )
+        main.case( "Killing a link to Ensure that Link Discovery" +
+                   "is Working Properly" )
         """
         main.step( "Start continuous pings" )
 
         main.Mininet2.pingLong( src=main.params[ 'PING' ][ 'source1' ],
-                            target=main.params[ 'PING' ][ 'target1' ],pingTime=500 )
+                               target=main.params[ 'PING' ][ 'target1' ],
+                               pingTime=500 )
         main.Mininet2.pingLong( src=main.params[ 'PING' ][ 'source2' ],
-                            target=main.params[ 'PING' ][ 'target2' ],pingTime=500 )
+                               target=main.params[ 'PING' ][ 'target2' ],
+                               pingTime=500 )
         main.Mininet2.pingLong( src=main.params[ 'PING' ][ 'source3' ],
-                            target=main.params[ 'PING' ][ 'target3' ],pingTime=500 )
+                               target=main.params[ 'PING' ][ 'target3' ],
+                               pingTime=500 )
         main.Mininet2.pingLong( src=main.params[ 'PING' ][ 'source4' ],
-                            target=main.params[ 'PING' ][ 'target4' ],pingTime=500 )
+                               target=main.params[ 'PING' ][ 'target4' ],
+                               pingTime=500 )
         main.Mininet2.pingLong( src=main.params[ 'PING' ][ 'source5' ],
-                            target=main.params[ 'PING' ][ 'target5' ],pingTime=500 )
+                               target=main.params[ 'PING' ][ 'target5' ],
+                               pingTime=500 )
         main.Mininet2.pingLong( src=main.params[ 'PING' ][ 'source6' ],
-                            target=main.params[ 'PING' ][ 'target6' ],pingTime=500 )
+                               target=main.params[ 'PING' ][ 'target6' ],
+                               pingTime=500 )
         main.Mininet2.pingLong( src=main.params[ 'PING' ][ 'source7' ],
-                            target=main.params[ 'PING' ][ 'target7' ],pingTime=500 )
+                               target=main.params[ 'PING' ][ 'target7' ],
+                               pingTime=500 )
         main.Mininet2.pingLong( src=main.params[ 'PING' ][ 'source8' ],
-                            target=main.params[ 'PING' ][ 'target8' ],pingTime=500 )
+                               target=main.params[ 'PING' ][ 'target8' ],
+                               pingTime=500 )
         main.Mininet2.pingLong( src=main.params[ 'PING' ][ 'source9' ],
-                            target=main.params[ 'PING' ][ 'target9' ],pingTime=500 )
+                               target=main.params[ 'PING' ][ 'target9' ],
+                               pingTime=500 )
         main.Mininet2.pingLong( src=main.params[ 'PING' ][ 'source10' ],
-                            target=main.params[ 'PING' ][ 'target10' ],pingTime=500 )
+                               target=main.params[ 'PING' ][ 'target10' ],
+                               pingTime=500 )
         """
         main.step( "Determine the current number of switches and links" )
-        topology_output = main.ONOS2.topology()
-        topology_result = main.ONOS1.get_topology( topology_output )
-        activeSwitches = topology_result[ 'devices' ]
-        links = topology_result[ 'links' ]
+        topologyOutput = main.ONOS2.topology()
+        topologyResult = main.ONOS1.getTopology( topologyOutput )
+        activeSwitches = topologyResult[ 'devices' ]
+        links = topologyResult[ 'links' ]
         print "activeSwitches = ", type( activeSwitches )
         print "links = ", type( links )
         main.log.info(
@@ -925,39 +1080,39 @@
 
         main.step( "Kill Link between s3 and s28" )
         main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
-        time.sleep( link_sleep )
-        topology_output = main.ONOS2.topology()
-        Link_Down = main.ONOS1.check_status(
-            topology_output, activeSwitches, str(
+        time.sleep( linkSleep )
+        topologyOutput = main.ONOS2.topology()
+        LinkDown = main.ONOS1.checkStatus(
+            topologyOutput, activeSwitches, str(
                 int( links ) - 2 ) )
-        if Link_Down == main.TRUE:
+        if LinkDown == main.TRUE:
             main.log.report( "Link Down discovered properly" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Link_Down,
+            actual=LinkDown,
             onpass="Link Down discovered properly",
             onfail="Link down was not discovered in " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " seconds" )
 
         # Check ping result here..add code for it
 
         main.step( "Bring link between s3 and s28 back up" )
-        Link_Up = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
-        time.sleep( link_sleep )
-        topology_output = main.ONOS2.topology()
-        Link_Up = main.ONOS1.check_status(
-            topology_output,
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
+        time.sleep( linkSleep )
+        topologyOutput = main.ONOS2.topology()
+        LinkUp = main.ONOS1.checkStatus(
+            topologyOutput,
             activeSwitches,
             str( links ) )
-        if Link_Up == main.TRUE:
+        if LinkUp == main.TRUE:
             main.log.report( "Link up discovered properly" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Link_Up,
+            actual=LinkUp,
             onpass="Link up discovered properly",
             onfail="Link up was not discovered in " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " seconds" )
 
         # NOTE Check ping result here..add code for it
@@ -967,22 +1122,22 @@
             main.Mininet1,
             ctrls )  # can also add Intent API info for intent operations
         MNTopo = Topo
-        Topology_Check = main.TRUE
+        TopologyCheck = main.TRUE
 
-        devices_json = main.ONOS2.devices()
-        links_json = main.ONOS2.links()
-        ports_json = main.ONOS2.ports()
-        print "devices_json= ", devices_json
+        devicesJson = main.ONOS2.devices()
+        linksJson = main.ONOS2.links()
+        portsJson = main.ONOS2.ports()
 
-        result1 = main.Mininet1.compare_switches(
+        result1 = main.Mininet1.compareSwitches(
             MNTopo,
-            json.loads( devices_json ) )
-        result2 = main.Mininet1.compare_links(
+            json.loads( devicesJson ) )
+        result2 = main.Mininet1.compareLinks(
             MNTopo,
-            json.loads( links_json ) )
-        #result3 = main.Mininet1.compare_ports( MNTopo, json.loads( ports_json ) )
+            json.loads( linksJson ) )
+        # result3 = main.Mininet1.comparePorts(
+        # MNTopo, json.loads( portsJson ) )
 
-        #result = result1 and result2 and result3
+        # result = result1 and result2 and result3
         result = result1 and result2
         print "***********************"
 
@@ -996,59 +1151,68 @@
             onfail="ONOS" +
             " Topology does not match MN Topology" )
 
-        Topology_Check = Topology_Check and result
+        TopologyCheck = TopologyCheck and result
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Topology_Check,
+            actual=TopologyCheck,
             onpass="Topology checks passed",
             onfail="Topology checks failed" )
 
-        result = Link_Down and Link_Up and Topology_Check
+        result = LinkDown and LinkUp and TopologyCheck
         utilities.assert_equals( expect=main.TRUE, actual=result,
                                  onpass="Link failure is discovered correctly",
                                  onfail="Link Discovery failed" )
 
     def CASE8( self ):
         """
-        Host intents removal
+        Intent removal
         """
-        main.log.report(
-            "This testcase removes any previously added intents before adding the same intents or point intents" )
+        import time
+        main.log.report( "This testcase removes any previously added intents" +
+                         " before adding any new set of intents" )
         main.log.report( "__________________________________" )
-        main.log.info( "Host intents removal" )
-        main.case( "Removing host intents" )
+        main.log.info( "intent removal" )
+        main.case( "Removing installed intents" )
         main.step( "Obtain the intent id's" )
-        intent_result = main.ONOS2.intents( json_format=False )
-        main.log.info( "intent_result = " + intent_result )
+        intentResult = main.ONOS2.intents( jsonFormat=False )
+        main.log.info( "intent_result = " + intentResult )
+        intentLinewise = intentResult.split( "\n" )
 
-        intent_linewise = intent_result.split( "\n" )
-        intentList = []
-        for line in intent_linewise:
-            if line.startswith( "id=" ):
-                intentList.append( line )
-
-        intentids = []
-        for line in intentList:
-            intentids.append( line.split( "," )[ 0 ].split( "=" )[ 1 ] )
+        intentList = [line for line in intentLinewise \
+            if line.startswith( "id=")]
+        intentids = [line.split( "," )[ 0 ].split( "=" )[ 1 ] for line in \
+            intentList]
         for id in intentids:
             print "id = ", id
 
         main.step(
             "Iterate through the intentids list and remove each intent" )
         for id in intentids:
-            main.ONOS2.remove_intent( intent_id=id )
+            main.ONOS2.removeIntent( intentId=id )
 
-        intent_result = main.ONOS2.intents( json_format=False )
-        main.log.info( "intent_result = " + intent_result )
-
-        case8_result = main.TRUE
-        if case8_result == main.TRUE:
+        intentResult = main.ONOS2.intents( jsonFormat=False )
+        main.log.info( "intent_result = " + intentResult )
+        
+        intentList = [line for line in intentResult.split( "\n" ) \
+            if line.startswith( "id=")]
+        intentState = [line.split( "," )[ 1 ].split( "=" )[ 1 ] for line in \
+            intentList]
+        for state in intentState:
+            print state
+        
+        case8Result = main.TRUE        
+        for state in intentState:
+            if state != 'WITHDRAWN':
+                case8Result = main.FALSE
+                break
+                
+        if case8Result == main.TRUE:
             main.log.report( "Intent removal successful" )
         else:
             main.log.report( "Intent removal failed" )
 
-        Ping_Result = main.TRUE
-        if case8_result == main.TRUE:
+        PingResult = main.TRUE
+        if case8Result == main.TRUE:
             i = 8
             while i < 18:
                 main.log.info(
@@ -1057,33 +1221,33 @@
                     src="h" + str( i ), target="h" + str( i + 10 ) )
                 if ping == main.TRUE:
                     i = 19
-                    Ping_Result = Ping_Result and main.TRUE
+                    PingResult = PingResult and main.TRUE
                 elif ping == main.FALSE:
                     i += 1
-                    Ping_Result = Ping_Result and main.FALSE
+                    PingResult = PingResult and main.FALSE
                 else:
                     main.log.info( "Unknown error" )
-                    Ping_Result = main.ERROR
+                    PingResult = main.ERROR
 
             # Note: If the ping result failed, that means the intents have been
             # withdrawn correctly.
-        if Ping_Result == main.TRUE:
-            main.log.report( "Host intents have not been withdrawn correctly" )
+        if PingResult == main.TRUE:
+            main.log.report( "Installed intents have not been withdrawn correctly" )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.FALSE:
-            main.log.report( "Host intents have been withdrawn correctly" )
+        if PingResult == main.FALSE:
+            main.log.report( "Installed intents have been withdrawn correctly" )
 
-        case8_result = case8_result and Ping_Result
+        case8Result = case8Result and PingResult
 
-        if case8_result == main.FALSE:
+        if case8Result == main.FALSE:
             main.log.report( "Intent removal successful" )
         else:
             main.log.report( "Intent removal failed" )
 
-        utilities.assert_equals( expect=main.FALSE, actual=case8_result,
-                                 onpass="Intent removal test failed",
-                                 onfail="Intent removal test passed" )
+        utilities.assert_equals( expect=main.FALSE, actual=case8Result,
+                                 onpass="Intent removal test passed",
+                                 onfail="Intent removal test failed" )
 
     def CASE9( self ):
         main.log.report(
@@ -1091,197 +1255,207 @@
         main.log.report( "__________________________________" )
         main.log.info( "Adding point intents" )
         main.case(
-            "Adding bidirectional point for mn hosts(h8-h18,h9-h19,h10-h20,h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
-        main.step(
-            "Add point-to-point intents for mininet hosts h8 and h18 or ONOS hosts h8 and h12" )
-        ptp_intent_result = main.ONOS2.add_point_intent(
+            "Adding bidirectional point for mn hosts" +
+            "( h8-h18, h9-h19, h10-h20, h11-h21, h12-h22, " +
+            "h13-h23, h14-h24, h15-h25, h16-h26, h17-h27 )" )
+
+        main.step( "Add point intents for mn hosts h8 and h18 or" +
+                   "ONOS hosts h8 and h12" )
+        # main.step(var1)
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003008/1",
             "of:0000000000006018/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006018/1",
             "of:0000000000003008/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point-to-point intents for mininet hosts h9 and h19 or ONOS hosts h9 and h13" )
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        var2 = "Add point intents for mn hosts h9&h19 or ONOS hosts h9&h13"
+        main.step(var2)
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003009/1",
             "of:0000000000006019/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006019/1",
             "of:0000000000003009/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point-to-point intents for mininet hosts h10 and h20 or ONOS hosts hA and h14" )
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        var3 = "Add point intents for MN hosts h10&h20 or ONOS hosts hA&h14"
+        main.step(var3)
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003010/1",
             "of:0000000000006020/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006020/1",
             "of:0000000000003010/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point-to-point intents for mininet hosts h11 and h21 or ONOS hosts hB and h15" )
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        var4 = "Add point intents for mininet hosts h11 and h21 or" +\
+               " ONOS hosts hB and h15"
+        main.case(var4)
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003011/1",
             "of:0000000000006021/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006021/1",
             "of:0000000000003011/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point-to-point intents for mininet hosts h12 and h22 or ONOS hosts hC and h16" )
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        var5 = "Add point intents for mininet hosts h12 and h22 " +\
+               "ONOS hosts hC and h16"
+        main.case(var5)
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003012/1",
             "of:0000000000006022/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006022/1",
             "of:0000000000003012/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point-to-point intents for mininet hosts h13 and h23 or ONOS hosts hD and h17" )
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        var6 = "Add point intents for mininet hosts h13 and h23 or" +\
+               " ONOS hosts hD and h17"
+        main.case(var6)
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003013/1",
             "of:0000000000006023/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006023/1",
             "of:0000000000003013/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point-to-point intents for mininet hosts h14 and h24 or ONOS hosts hE and h18" )
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        var7 = "Add point intents for mininet hosts h14 and h24 or" +\
+               " ONOS hosts hE and h18"
+        main.case(var7)
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003014/1",
             "of:0000000000006024/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006024/1",
             "of:0000000000003014/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point-to-point intents for mininet hosts h15 and h25 or ONOS hosts hF and h19" )
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        var8 = "Add point intents for mininet hosts h15 and h25 or" +\
+               " ONOS hosts hF and h19"
+        main.case(var8)
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003015/1",
             "of:0000000000006025/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006025/1",
             "of:0000000000003015/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point-to-point intents for mininet hosts h16 and h26 or ONOS hosts h10 and h1A" )
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        var9 = "Add intents for mininet hosts h16 and h26 or" +\
+               " ONOS hosts h10 and h1A"
+        main.case(var9)
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003016/1",
             "of:0000000000006026/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006026/1",
             "of:0000000000003016/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            # main.log.info( getIntentResult )
 
-        main.step(
-            "Add point-to-point intents for mininet hosts h17 and h27 or ONOS hosts h11 and h1B" )
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        var10 = "Add point intents for mininet hosts h17 and h27 or" +\
+                " ONOS hosts h11 and h1B"
+        main.case(var10)
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000003017/1",
             "of:0000000000006027/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            #main.log.info( getIntentResult )
 
-        ptp_intent_result = main.ONOS2.add_point_intent(
+        ptpIntentResult = main.ONOS2.addPointIntent(
             "of:0000000000006027/1",
             "of:0000000000003017/1" )
-        if ptp_intent_result == main.TRUE:
-            get_intent_result = main.ONOS2.intents()
+        if ptpIntentResult == main.TRUE:
+            getIntentResult = main.ONOS2.intents()
             main.log.info( "Point to point intent install successful" )
-            # main.log.info( get_intent_result )
+            #main.log.info( getIntentResult )
 
         print(
-            "_______________________________________________________________________________________" )
+            "___________________________________________________________" )
 
         flowHandle = main.ONOS2.flows()
-        # print "flowHandle = ", flowHandle
-        main.log.info( "flows :" + flowHandle )
+        #main.log.info( "flows :" + flowHandle )
 
         count = 1
         i = 8
-        Ping_Result = main.TRUE
+        PingResult = main.TRUE
         while i < 18:
             main.log.info(
                 "\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
@@ -1289,8 +1463,8 @@
                 src="h" + str( i ), target="h" + str( i + 10 ) )
             if ping == main.FALSE and count < 5:
                 count += 1
-                #i = 8
-                Ping_Result = main.FALSE
+                # i = 8
+                PingResult = main.FALSE
                 main.log.report( "Ping between h" +
                                  str( i ) +
                                  " and h" +
@@ -1308,7 +1482,7 @@
                                       10 ) +
                                  "have failed" )
                 i = 19
-                Ping_Result = main.FALSE
+                PingResult = main.FALSE
             elif ping == main.TRUE:
                 main.log.info( "Ping test between h" +
                                str( i ) +
@@ -1317,22 +1491,22 @@
                                     10 ) +
                                "passed!" )
                 i += 1
-                Ping_Result = main.TRUE
+                PingResult = main.TRUE
             else:
                 main.log.info( "Unknown error" )
-                Ping_Result = main.ERROR
+                PingResult = main.ERROR
 
-        if Ping_Result == main.FALSE:
+        if PingResult == main.FALSE:
             main.log.report(
                 "Point intents have not ben installed correctly. Cleaning up" )
             # main.cleanup()
             # main.exit()
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report( "Point Intents have been installed correctly" )
 
-        case9_result = Ping_Result
+        case9Result = PingResult
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=case9_result,
+            actual=case9Result,
             onpass="Point intents addition and Pingall Test successful",
             onfail="Point intents addition and Pingall Test NOT successful" )
diff --git a/TestON/tests/ProdFunc13/ProdFunc13.topo b/TestON/tests/ProdFunc13/ProdFunc13.topo
index c592e18..11a2e6c 100755
--- a/TestON/tests/ProdFunc13/ProdFunc13.topo
+++ b/TestON/tests/ProdFunc13/ProdFunc13.topo
@@ -91,13 +91,5 @@
             </COMPONENTS>
         </LincOE2>
 
-        <LincOE3>
-            <host>10.128.20.30</host>
-            <user>admin</user>
-            <password>onos_test</password>
-            <type>LincOEDriver</type>
-            <connect_order>9</connect_order>
-        </LincOE3>
- 
     </COMPONENT>
 </TOPOLOGY>
diff --git a/TestON/tests/ProdFunc13/__init__.py b/TestON/tests/ProdFunc13/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/ProdFunc13/__init__.py
diff --git a/TestON/tests/SdnIpTest/SdnIpTest.params b/TestON/tests/SdnIpTest/SdnIpTest.params
index bb5826d..7f7ef2d 100755
--- a/TestON/tests/SdnIpTest/SdnIpTest.params
+++ b/TestON/tests/SdnIpTest/SdnIpTest.params
@@ -1,6 +1,6 @@
 <PARAMS>
     
-    <testcases>1,2</testcases>
+    <testcases>4</testcases>
 
     #Environment variables
     <ENV>
diff --git a/TestON/tests/SdnIpTest/SdnIpTest.py b/TestON/tests/SdnIpTest/SdnIpTest.py
index 081b1ca..85ac21e 100644
--- a/TestON/tests/SdnIpTest/SdnIpTest.py
+++ b/TestON/tests/SdnIpTest/SdnIpTest.py
@@ -8,15 +8,27 @@
     def __init__( self ):
         self.default = ''
 
-    def CASE1( self, main ):
+# from cupshelpers.config import prefix
+
+# Testing the basic functionality of SDN-IP
+
+
+class SdnIpTest:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE4( self, main ):
         """
         Test the SDN-IP functionality
-        allRoutes_expected: all expected routes for all BGP peers
-        routeIntents_expected: all expected MultiPointToSinglePointIntent intents
-        bgpIntents_expected: expected PointToPointIntent intents
-        allRoutes_actual: all routes from ONOS LCI
-        routeIntents_actual: actual MultiPointToSinglePointIntent intents from ONOS CLI
-        bgpIntents_actual: actual PointToPointIntent intents from ONOS CLI
+        allRoutesExpected: all expected routes for all BGP peers
+        routeIntentsExpected: all expected MultiPointToSinglePointIntent \
+        intents
+        bgpIntentsExpected: expected PointToPointIntent intents
+        allRoutesActual: all routes from ONOS LCI
+        routeIntentsActual: actual MultiPointToSinglePointIntent intents from \
+        ONOS CLI
+        bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
         """
         import time
         import json
@@ -24,124 +36,148 @@
         # from datetime import datetime
         from time import localtime, strftime
 
-        main.case(
-            "The test case is to help to setup the TestON environment and test new drivers" )
-        SDNIP_JSON_FILE_PATH = "../tests/SdnIpTest/sdnip.json"
+        main.case("The test case is to help to setup the TestON environment \
+            and test new drivers" )
+        # SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
+        SDNIPJSONFILEPATH = \
+            "/home/admin/workspace/onos/tools/package/config/sdnip.json"
         # all expected routes for all BGP peers
-        allRoutes_expected = []
+        allRoutesExpected = []
         main.step( "Start to generate routes for all BGP peers" )
-        # bgpPeerHosts = []
-        # for i in range( 3, 5 ):
-        #    bgpPeerHosts.append( "host" + str( i ) )
-        # main.log.info( "BGP Peer Hosts are:" + bgpPeerHosts )
-
-        # for i in range( 3, 5 ):
-        #   QuaggaCliHost = "QuaggaCliHost" + str( i )
-        #  prefixes = main.QuaggaCliHost.generate_prefixes( 3, 10 )
-
-        # main.log.info( prefixes )
-        # allRoutes_expected.append( prefixes )
         main.log.info( "Generate prefixes for host3" )
-        prefixes_host3 = main.QuaggaCliHost3.generate_prefixes( 3, 10 )
-        main.log.info( prefixes_host3 )
+        prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+        main.log.info( prefixesHost3 )
         # generate route with next hop
-        for prefix in prefixes_host3:
-            allRoutes_expected.append( prefix + "/" + "192.168.20.1" )
-        routeIntents_expected_host3 = main.QuaggaCliHost3.generate_expected_onePeerRouteIntents(
-            prefixes_host3,
-            "192.168.20.1",
-            "00:00:00:00:02:02",
-            SDNIP_JSON_FILE_PATH )
+        for prefix in prefixesHost3:
+            allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+        routeIntentsExpectedHost3 = \
+            main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+            prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+            SDNIPJSONFILEPATH )
 
         main.log.info( "Generate prefixes for host4" )
-        prefixes_host4 = main.QuaggaCliHost4.generate_prefixes( 4, 10 )
-        main.log.info( prefixes_host4 )
+        prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+        main.log.info( prefixesHost4 )
         # generate route with next hop
-        for prefix in prefixes_host4:
-            allRoutes_expected.append( prefix + "/" + "192.168.30.1" )
-        routeIntents_expected_host4 = main.QuaggaCliHost4.generate_expected_onePeerRouteIntents(
-            prefixes_host4,
-            "192.168.30.1",
-            "00:00:00:00:03:01",
-            SDNIP_JSON_FILE_PATH )
+        for prefix in prefixesHost4:
+            allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+        routeIntentsExpectedHost4 = \
+            main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+            prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+            SDNIPJSONFILEPATH )
 
-        routeIntents_expected = routeIntents_expected_host3 + \
-            routeIntents_expected_host4
+        main.log.info( "Generate prefixes for host5" )
+        prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
+        main.log.info( prefixesHost5 )
+        for prefix in prefixesHost5:
+            allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+        routeIntentsExpectedHost5 = \
+            main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+            prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+            SDNIPJSONFILEPATH )
 
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
+        routeIntentsExpected = routeIntentsExpectedHost3 + \
+            routeIntentsExpectedHost4 + routeIntentsExpectedHost5
+
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
         main.step( "Set cell for ONOS-cli environment" )
-        main.ONOScli.set_cell( cell_name )
-        verify_result = main.ONOSbench.verify_cell()
-        main.log.report( "Removing raft logs" )
-        main.ONOSbench.onos_remove_raft_logs()
-        main.log.report( "Uninstalling ONOS" )
-        main.ONOSbench.onos_uninstall( ONOS1_ip )
-        main.step( "Creating ONOS package" )
-        package_result = main.ONOSbench.onos_package()
+        main.ONOScli.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
-        main.step( "Starting ONOS service" )
-        # TODO: start ONOS from Mininet Script
-        # start_result = main.ONOSbench.onos_start( "127.0.0.1" )
+        main.log.report( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftLogs()
+        main.log.report( "Uninstalling ONOS" )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+
         main.step( "Installing ONOS package" )
-        onos1_install_result = main.ONOSbench.onos_install(
-            options="-f",
-            node=ONOS1_ip )
+        onos1InstallResult = main.ONOSbench.onosInstall(
+            options="-f", node=ONOS1Ip )
 
         main.step( "Checking if ONOS is up yet" )
-        time.sleep( 60 )
-        onos1_isup = main.ONOSbench.isup( ONOS1_ip )
-        if not onos1_isup:
+        time.sleep( 150 )
+        onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+        if not onos1Isup:
             main.log.report( "ONOS1 didn't start!" )
 
         main.step( "Start ONOS-cli" )
-        # TODO: change the hardcode in start_onos_cli method in ONOS CLI driver
 
-        main.ONOScli.start_onos_cli( ONOS1_ip )
+        main.ONOScli.startOnosCli( ONOS1Ip )
 
         main.step( "Get devices in the network" )
-        list_result = main.ONOScli.devices( json_format=False )
-        main.log.info( list_result )
+        listResult = main.ONOScli.devices( jsonFormat=False )
+        main.log.info( listResult )
         time.sleep( 10 )
         main.log.info( "Installing sdn-ip feature" )
-        main.ONOScli.feature_install( "onos-app-sdnip" )
+        main.ONOScli.featureInstall( "onos-app-sdnip" )
         time.sleep( 10 )
         main.step( "Login all BGP peers and add routes into peers" )
+
         main.log.info( "Login Quagga CLI on host3" )
         main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
         main.log.info( "Enter configuration model of Quagga CLI on host3" )
-        main.QuaggaCliHost3.enter_config( 64514 )
+        main.QuaggaCliHost3.enterConfig( 64514 )
         main.log.info( "Add routes to Quagga on host3" )
-        main.QuaggaCliHost3.add_routes( prefixes_host3, 1 )
+        main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
 
         main.log.info( "Login Quagga CLI on host4" )
         main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
         main.log.info( "Enter configuration model of Quagga CLI on host4" )
-        main.QuaggaCliHost4.enter_config( 64516 )
+        main.QuaggaCliHost4.enterConfig( 64516 )
         main.log.info( "Add routes to Quagga on host4" )
-        main.QuaggaCliHost4.add_routes( prefixes_host4, 1 )
+        main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+        main.log.info( "Login Quagga CLI on host5" )
+        main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+        main.log.info( "Enter configuration model of Quagga CLI on host5" )
+        main.QuaggaCliHost5.enterConfig( 64521 )
+        main.log.info( "Add routes to Quagga on host5" )
+        main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+        for i in range( 101, 201 ):
+            prefixesHostX = main.QuaggaCliHost.generatePrefixes( str( i ), 10 )
+            main.log.info( prefixesHostX )
+            for prefix in prefixesHostX:
+                allRoutesExpected.append(
+                    prefix + "/" + "192.168.40." + str( i - 100 ) )
+
+            routeIntentsExpectedHostX = \
+            main.QuaggaCliHost.generateExpectedOnePeerRouteIntents(
+                prefixesHostX, "192.168.40." + str( i - 100 ),
+                "00:00:%02d:00:00:90" % ( i - 101 ), SDNIPJSONFILEPATH )
+            routeIntentsExpected = routeIntentsExpected + \
+                routeIntentsExpectedHostX
+
+            main.log.info( "Login Quagga CLI on host" + str( i ) )
+            QuaggaCliHostX = getattr( main, ( 'QuaggaCliHost' + str( i ) ) )
+            QuaggaCliHostX.loginQuagga( "1.168.30." + str( i ) )
+            main.log.info(
+                "Enter configuration model of Quagga CLI on host" + str( i ) )
+            QuaggaCliHostX.enterConfig( 65000 + i - 100 )
+            main.log.info( "Add routes to Quagga on host" + str( i ) )
+            QuaggaCliHostX.addRoutes( prefixesHostX, 1 )
+
         time.sleep( 60 )
 
-        # get all routes inside SDN-IP
-        get_routes_result = main.ONOScli.routes( json_format=True )
+        # get routes inside SDN-IP
+        getRoutesResult = main.ONOScli.routes( jsonFormat=True )
 
         # parse routes from ONOS CLI
-        allRoutes_actual = main.QuaggaCliHost3.extract_actual_routes(
-            get_routes_result )
+        allRoutesActual = \
+            main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
 
-        allRoutes_str_expected = str( sorted( allRoutes_expected ) )
-        allRoutes_str_actual = str( allRoutes_actual ).replace( 'u', "" )
+        allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+        allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
         main.step( "Check routes installed" )
         main.log.info( "Routes expected:" )
-        main.log.info( allRoutes_str_expected )
+        main.log.info( allRoutesStrExpected )
         main.log.info( "Routes get from ONOS CLI:" )
-        main.log.info( allRoutes_str_actual )
-        utilities.assert_equals(
-            expect=allRoutes_str_expected,
-            actual=allRoutes_str_actual,
+        main.log.info( allRoutesStrActual )
+        utilities.assertEquals(
+            expect=allRoutesStrExpected, actual=allRoutesStrActual,
             onpass="***Routes in SDN-IP are correct!***",
             onfail="***Routes in SDN-IP are wrong!***" )
-        if( eq( allRoutes_str_expected, allRoutes_str_actual ) ):
+        if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
             main.log.report(
                 "***Routes in SDN-IP after adding routes are correct!***" )
         else:
@@ -149,58 +185,57 @@
                 "***Routes in SDN-IP after adding routes are wrong!***" )
 
         time.sleep( 20 )
-        get_intents_result = main.ONOScli.intents( json_format=True )
+        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
 
         main.step( "Check MultiPointToSinglePointIntent intents installed" )
-        # route_intents_expected are generated when generating routes
+        # routeIntentsExpected are generated when generating routes
         # get rpoute intents from ONOS CLI
-        routeIntents_actual = main.QuaggaCliHost3.extract_actual_routeIntents(
-            get_intents_result )
-        routeIntents_str_expected = str( sorted( routeIntents_expected ) )
-        routeIntents_str_actual = str( routeIntents_actual ).replace( 'u', "" )
+        routeIntentsActual = \
+            main.QuaggaCliHost3.extractActualRouteIntents(
+                getIntentsResult )
+        routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
+        routeIntentsStrActual = str( routeIntentsActual ).replace( 'u', "" )
         main.log.info( "MultiPointToSinglePoint intents expected:" )
-        main.log.info( routeIntents_str_expected )
+        main.log.info( routeIntentsStrExpected )
         main.log.info( "MultiPointToSinglePoint intents get from ONOS CLI:" )
-        main.log.info( routeIntents_str_actual )
-        utilities.assert_equals(
+        main.log.info( routeIntentsStrActual )
+        utilities.assertEquals(
             expect=True,
-            actual=eq(
-                routeIntents_str_expected,
-                routeIntents_str_actual ),
-            onpass="***MultiPointToSinglePoint Intents in SDN-IP are correct!***",
-            onfail="***MultiPointToSinglePoint Intents in SDN-IP are wrong!***" )
+            actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
+            onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
+            correct!***",
+            onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
+            wrong!***" )
 
-        if( eq( routeIntents_str_expected, routeIntents_str_actual ) ):
-            main.log.report(
-                "***MultiPointToSinglePoint Intents before deleting routes correct!***" )
+        if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+            main.log.report( "***MultiPointToSinglePoint Intents before \
+            deleting routes correct!***" )
         else:
-            main.log.report(
-                "***MultiPointToSinglePoint Intents before deleting routes wrong!***" )
+            main.log.report( "***MultiPointToSinglePoint Intents before \
+            deleting routes wrong!***" )
 
         main.step( "Check BGP PointToPointIntent intents installed" )
         # bgp intents expected
-        bgpIntents_expected = main.QuaggaCliHost3.generate_expected_bgpIntents(
-            SDNIP_JSON_FILE_PATH )
+        bgpIntentsExpected = \
+            main.QuaggaCliHost3.generateExpectedBgpIntents( SDNIPJSONFILEPATH )
         # get BGP intents from ONOS CLI
-        bgpIntents_actual = main.QuaggaCliHost3.extract_actual_bgpIntents(
-            get_intents_result )
+        bgpIntentsActual = \
+            main.QuaggaCliHost3.extractActualBgpIntents( getIntentsResult )
 
-        bgpIntents_str_expected = str( bgpIntents_expected ).replace( 'u', "" )
-        bgpIntents_str_actual = str( bgpIntents_actual )
+        bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
+        bgpIntentsStrActual = str( bgpIntentsActual )
         main.log.info( "PointToPointIntent intents expected:" )
-        main.log.info( bgpIntents_str_expected )
+        main.log.info( bgpIntentsStrExpected )
         main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
-        main.log.info( bgpIntents_str_actual )
+        main.log.info( bgpIntentsStrActual )
 
-        utilities.assert_equals(
+        utilities.assertEquals(
             expect=True,
-            actual=eq(
-                bgpIntents_str_expected,
-                bgpIntents_str_actual ),
+            actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
             onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
             onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
 
-        if ( eq( bgpIntents_str_expected, bgpIntents_str_actual ) ):
+        if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
             main.log.report(
                 "***PointToPointIntent Intents in SDN-IP are correct!***" )
         else:
@@ -210,71 +245,634 @@
         #============================= Ping Test ========================
         # wait until all MultiPointToSinglePoint
         time.sleep( 20 )
-        ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-        ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/log/CASE1-ping-results-before-delete-routes-" + \
-            strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
-        ping_test_results = main.QuaggaCliHost.ping_test(
-            "1.168.30.100",
-            ping_test_script,
-            ping_test_results_file )
-        main.log.info( ping_test_results )
-
-        # ping test
+        pingTestScript = "~/SDNIP/test-tools/CASE4-ping-as2host.sh"
+        pingTestResultsFile = \
+        "~/SDNIP/SdnIpIntentDemo/log/CASE4-ping-results-before-delete-routes-" \
+            + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+        pingTestResults = main.QuaggaCliHost.pingTest(
+            "1.168.30.100", pingTestScript, pingTestResultsFile )
+        main.log.info( pingTestResults )
+        time.sleep( 20 )
 
         #============================= Deleting Routes ==================
         main.step( "Check deleting routes installed" )
-        main.QuaggaCliHost3.delete_routes( prefixes_host3, 1 )
-        main.QuaggaCliHost4.delete_routes( prefixes_host4, 1 )
+        main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+        main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+        main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
 
-        # main.log.info( "main.ONOScli.get_routes_num() = " )
-        # main.log.info( main.ONOScli.get_routes_num() )
-        # utilities.assert_equals( expect="Total SDN-IP routes = 1", actual=
-        # main.ONOScli.get_routes_num(),
-        get_routes_result = main.ONOScli.routes( json_format=True )
-        allRoutes_actual = main.QuaggaCliHost3.extract_actual_routes(
-            get_routes_result )
+        for i in range( 101, 201 ):
+            prefixesHostX = main.QuaggaCliHost.generatePrefixes( str( i ), 10 )
+            main.log.info( prefixesHostX )
+            QuaggaCliHostX = getattr( main, ( 'QuaggaCliHost' + str( i ) ) )
+            QuaggaCliHostX.deleteRoutes( prefixesHostX, 1 )
+
+        getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+        allRoutesActual = \
+            main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
         main.log.info( "allRoutes_actual = " )
-        main.log.info( allRoutes_actual )
+        main.log.info( allRoutesActual )
 
-        utilities.assert_equals(
-            expect="[]",
-            actual=str( allRoutes_actual ),
+        utilities.assertEquals(
+            expect="[]", actual=str( allRoutesActual ),
             onpass="***Route number in SDN-IP is 0, correct!***",
             onfail="***Routes number in SDN-IP is not 0, wrong!***" )
 
-        if( eq( allRoutes_str_expected, allRoutes_str_actual ) ):
+        if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
             main.log.report( "***Routes in SDN-IP after deleting correct!***" )
         else:
             main.log.report( "***Routes in SDN-IP after deleting wrong!***" )
 
         main.step( "Check intents after deleting routes" )
-        get_intents_result = main.ONOScli.intents( json_format=True )
-        routeIntents_actual = main.QuaggaCliHost3.extract_actual_routeIntents(
-            get_intents_result )
+        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+        routeIntentsActual = \
+            main.QuaggaCliHost3.extractActualRouteIntents(
+                getIntentsResult )
         main.log.info( "main.ONOScli.intents()= " )
-        main.log.info( routeIntents_actual )
-        utilities.assert_equals(
-            expect="[]",
-            actual=str( routeIntents_actual ),
-            onpass="***MultiPointToSinglePoint Intents number in SDN-IP is 0, correct!***",
-            onfail="***MultiPointToSinglePoint Intents number in SDN-IP is 0, wrong!***" )
+        main.log.info( routeIntentsActual )
+        utilities.assertEquals(
+            expect="[]", actual=str( routeIntentsActual ),
+            onpass="***MultiPointToSinglePoint Intents number in SDN-IP is 0, \
+            correct!***",
+            onfail="***MultiPointToSinglePoint Intents number in SDN-IP is 0, \
+            wrong!***" )
 
-        if( eq( routeIntents_str_expected, routeIntents_str_actual ) ):
-            main.log.report(
-                "***MultiPointToSinglePoint Intents after deleting routes correct!***" )
+        if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+            main.log.report( "***MultiPointToSinglePoint Intents after \
+            deleting routes correct!***" )
         else:
-            main.log.report(
-                "***MultiPointToSinglePoint Intents after deleting routes wrong!***" )
+            main.log.report( "***MultiPointToSinglePoint Intents after \
+            deleting routes wrong!***" )
 
         time.sleep( 20 )
-        ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-        ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/log/CASE1-ping-results-after-delete-routes-" + \
-            strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
-        ping_test_results = main.QuaggaCliHost.ping_test(
-            "1.168.30.100",
-            ping_test_script,
-            ping_test_results_file )
-        main.log.info( ping_test_results )
+        pingTestScript = "~/SDNIP/test-tools/CASE4-ping-as2host.sh"
+        pingTestResultsFile = \
+        "~/SDNIP/SdnIpIntentDemo/log/CASE4-ping-results-after-delete-routes-" \
+            + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+        pingTestResults = main.QuaggaCliHost.pingTest(
+            "1.168.30.100", pingTestScript, pingTestResultsFile )
+        main.log.info( pingTestResults )
+        time.sleep( 100 )
+
+        # main.step( "Test whether Mininet is started" )
+        # main.Mininet2.handle.sendline( "xterm host1" )
+        # main.Mininet2.handle.expect( "mininet>" )
+
+    def CASE3( self, main ):
+        """
+        Test the SDN-IP functionality
+        allRoutesExpected: all expected routes for all BGP peers
+        routeIntentsExpected: all expected MultiPointToSinglePointIntent intents
+        bgpIntentsExpected: expected PointToPointIntent intents
+        allRoutesActual: all routes from ONOS LCI
+        routeIntentsActual: actual MultiPointToSinglePointIntent intents from \
+        ONOS CLI
+        bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
+        """
+        import time
+        import json
+        from operator import eq
+        # from datetime import datetime
+        from time import localtime, strftime
+
+        main.case( "The test case is to help to setup the TestON \
+            environment and test new drivers" )
+        # SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
+        SDNIPJSONFILEPATH = \
+            "/home/admin/workspace/onos/tools/package/config/sdnip.json"
+        # all expected routes for all BGP peers
+        allRoutesExpected = []
+        main.step( "Start to generate routes for all BGP peers" )
+        main.log.info( "Generate prefixes for host3" )
+        prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+        main.log.info( prefixesHost3 )
+        # generate route with next hop
+        for prefix in prefixesHost3:
+            allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+        routeIntentsExpectedHost3 = \
+            main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+            prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+            SDNIPJSONFILEPATH )
+
+        main.log.info( "Generate prefixes for host4" )
+        prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+        main.log.info( prefixesHost4 )
+        # generate route with next hop
+        for prefix in prefixesHost4:
+            allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+        routeIntentsExpectedHost4 = \
+            main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+            prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+            SDNIPJSONFILEPATH )
+
+        routeIntentsExpected = routeIntentsExpectedHost3 + \
+            routeIntentsExpectedHost4
+
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        main.step( "Set cell for ONOS-cli environment" )
+        main.ONOScli.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
+
+        main.log.report( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftLogs()
+        main.log.report( "Uninstalling ONOS" )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+
+        main.step( "Installing ONOS package" )
+        onos1InstallResult = main.ONOSbench.onosInstall(
+            options="-f", node=ONOS1Ip )
+
+        main.step( "Checking if ONOS is up yet" )
+        time.sleep( 60 )
+        onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+        if not onos1Isup:
+            main.log.report( "ONOS1 didn't start!" )
+
+        main.step( "Start ONOS-cli" )
+
+        main.ONOScli.startOnosCli( ONOS1Ip )
+
+        main.step( "Get devices in the network" )
+        listResult = main.ONOScli.devices( jsonFormat=False )
+        main.log.info( listResult )
+        time.sleep( 10 )
+        main.log.info( "Installing sdn-ip feature" )
+        main.ONOScli.featureInstall( "onos-app-sdnip" )
+        time.sleep( 10 )
+        main.step( "Login all BGP peers and add routes into peers" )
+
+        main.log.info( "Login Quagga CLI on host3" )
+        main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+        main.log.info( "Enter configuration model of Quagga CLI on host3" )
+        main.QuaggaCliHost3.enterConfig( 64514 )
+        main.log.info( "Add routes to Quagga on host3" )
+        main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+        main.log.info( "Login Quagga CLI on host4" )
+        main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+        main.log.info( "Enter configuration model of Quagga CLI on host4" )
+        main.QuaggaCliHost4.enterConfig( 64516 )
+        main.log.info( "Add routes to Quagga on host4" )
+        main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+        for i in range( 101, 201 ):
+            prefixesHostX = \
+                main.QuaggaCliHost.generatePrefixes( str( i ), 10 )
+            main.log.info( prefixesHostX )
+            for prefix in prefixesHostX:
+                allRoutesExpected.append(
+                    prefix + "/" + "192.168.40." + str( i - 100 ) )
+
+            routeIntentsExpectedHostX = \
+                main.QuaggaCliHost.generateExpectedOnePeerRouteIntents(
+                prefixesHostX, "192.168.40." + str( i - 100 ),
+                "00:00:%02d:00:00:90" % ( i - 101 ), SDNIPJSONFILEPATH )
+            routeIntentsExpected = routeIntentsExpected + \
+                routeIntentsExpectedHostX
+
+            main.log.info( "Login Quagga CLI on host" + str( i ) )
+            QuaggaCliHostX = getattr( main, ( 'QuaggaCliHost' + str( i ) ) )
+            QuaggaCliHostX.loginQuagga( "1.168.30." + str( i ) )
+            main.log.info(
+                "Enter configuration model of Quagga CLI on host" + str( i ) )
+            QuaggaCliHostX.enterConfig( 65000 + i - 100 )
+            main.log.info( "Add routes to Quagga on host" + str( i ) )
+            QuaggaCliHostX.addRoutes( prefixesHostX, 1 )
+
+        time.sleep( 60 )
+
+        # get routes inside SDN-IP
+        getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+        # parse routes from ONOS CLI
+        allRoutesActual = \
+            main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+        allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+        allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+        main.step( "Check routes installed" )
+        main.log.info( "Routes expected:" )
+        main.log.info( allRoutesStrExpected )
+        main.log.info( "Routes get from ONOS CLI:" )
+        main.log.info( allRoutesStrActual )
+        utilities.assertEquals(
+            expect=allRoutesStrExpected, actual=allRoutesStrActual,
+            onpass="***Routes in SDN-IP are correct!***",
+            onfail="***Routes in SDN-IP are wrong!***" )
+        if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+            main.log.report(
+                "***Routes in SDN-IP after adding routes are correct!***" )
+        else:
+            main.log.report(
+                "***Routes in SDN-IP after adding routes are wrong!***" )
+
+        time.sleep( 20 )
+        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+
+        main.step( "Check MultiPointToSinglePointIntent intents installed" )
+        # routeIntentsExpected are generated when generating routes
+        # get rpoute intents from ONOS CLI
+        routeIntentsActual = \
+            main.QuaggaCliHost3.extractActualRouteIntents(
+                getIntentsResult )
+        routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
+        routeIntentsStrActual = str( routeIntentsActual ).replace( 'u', "" )
+        main.log.info( "MultiPointToSinglePoint intents expected:" )
+        main.log.info( routeIntentsStrExpected )
+        main.log.info( "MultiPointToSinglePoint intents get from ONOS CLI:" )
+        main.log.info( routeIntentsStrActual )
+        utilities.assertEquals(
+            expect=True,
+            actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
+            onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
+            correct!***",
+            onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
+            wrong!***" )
+
+        if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+            main.log.report(
+                "***MultiPointToSinglePoint Intents before deleting routes \
+                correct!***" )
+        else:
+            main.log.report(
+                "***MultiPointToSinglePoint Intents before deleting routes \
+                wrong!***" )
+
+        main.step( "Check BGP PointToPointIntent intents installed" )
+        # bgp intents expected
+        bgpIntentsExpected = main.QuaggaCliHost3.generateExpectedBgpIntents(
+            SDNIPJSONFILEPATH )
+        # get BGP intents from ONOS CLI
+        bgpIntentsActual = main.QuaggaCliHost3.extractActualBgpIntents(
+            getIntentsResult )
+
+        bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
+        bgpIntentsStrActual = str( bgpIntentsActual )
+        main.log.info( "PointToPointIntent intents expected:" )
+        main.log.info( bgpIntentsStrExpected )
+        main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
+        main.log.info( bgpIntentsStrActual )
+
+        utilities.assertEquals(
+            expect=True,
+            actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
+            onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
+            onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+        if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
+            main.log.report(
+                "***PointToPointIntent Intents in SDN-IP are correct!***" )
+        else:
+            main.log.report(
+                "***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+        #============================= Ping Test ========================
+        # wait until all MultiPointToSinglePoint
+        time.sleep( 20 )
+        pingTestScript = "~/SDNIP/test-tools/CASE3-ping-as2host.sh"
+        pingTestResultsFile = \
+        "~/SDNIP/SdnIpIntentDemo/log/CASE3-ping-results-before-delete-routes-" \
+            + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+        pingTestResults = main.QuaggaCliHost.pingTest(
+            "1.168.30.100", pingTestScript, pingTestResultsFile )
+        main.log.info( pingTestResults )
+        time.sleep( 20 )
+
+        #============================= Deleting Routes ==================
+        main.step( "Check deleting routes installed" )
+        main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+        main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+        for i in range( 101, 201 ):
+            prefixesHostX = \
+                main.QuaggaCliHost.generatePrefixes( str( i ), 10 )
+            main.log.info( prefixesHostX )
+            QuaggaCliHostX = getattr( main, ( 'QuaggaCliHost' + str( i ) ) )
+            QuaggaCliHostX.deleteRoutes( prefixesHostX, 1 )
+
+        getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+        allRoutesActual = main.QuaggaCliHost3.extractActualRoutes(
+            getRoutesResult )
+        main.log.info( "allRoutes_actual = " )
+        main.log.info( allRoutesActual )
+
+        utilities.assertEquals(
+            expect="[]", actual=str( allRoutesActual ),
+            onpass="***Route number in SDN-IP is 0, correct!***",
+            onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+        if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+            main.log.report(
+                "***Routes in SDN-IP after deleting correct!***" )
+        else:
+            main.log.report(
+                "***Routes in SDN-IP after deleting wrong!***" )
+
+        main.step( "Check intents after deleting routes" )
+        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+        routeIntentsActual = \
+            main.QuaggaCliHost3.extractActualRouteIntents(
+                getIntentsResult )
+        main.log.info( "main.ONOScli.intents()= " )
+        main.log.info( routeIntentsActual )
+        utilities.assertEquals(
+            expect="[]", actual=str( routeIntentsActual ),
+            onpass="***MultiPointToSinglePoint Intents number in SDN-IP is \
+            0, correct!***",
+            onfail="***MultiPointToSinglePoint Intents number in SDN-IP is \
+            0, wrong!***" )
+
+        if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+            main.log.report(
+                "***MultiPointToSinglePoint Intents after deleting routes \
+                correct!***" )
+        else:
+            main.log.report(
+                "***MultiPointToSinglePoint Intents after deleting routes \
+                wrong!***" )
+
+        time.sleep( 20 )
+        pingTestScript = "~/SDNIP/test-tools/CASE3-ping-as2host.sh"
+        pingTestResultsFile = \
+        "~/SDNIP/SdnIpIntentDemo/log/CASE3-ping-results-after-delete-routes-" \
+            + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+        pingTestResults = main.QuaggaCliHost.pingTest(
+            "1.168.30.100", pingTestScript, pingTestResultsFile )
+        main.log.info( pingTestResults )
+        time.sleep( 100 )
+
+        # main.step( "Test whether Mininet is started" )
+        # main.Mininet2.handle.sendline( "xterm host1" )
+        # main.Mininet2.handle.expect( "mininet>" )
+
+    def CASE1( self, main ):
+        """
+        Test the SDN-IP functionality
+        allRoutesExpected: all expected routes for all BGP peers
+        routeIntentsExpected: all expected MultiPointToSinglePointIntent \
+        intents
+        bgpIntentsExpected: expected PointToPointIntent intents
+        allRoutesActual: all routes from ONOS LCI
+        routeIntentsActual: actual MultiPointToSinglePointIntent intents \
+        from ONOS CLI
+        bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
+        """
+        import time
+        import json
+        from operator import eq
+        # from datetime import datetime
+        from time import localtime, strftime
+
+        main.case("The test case is to help to setup the TestON environment \
+            and test new drivers" )
+        SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
+        # all expected routes for all BGP peers
+        allRoutesExpected = []
+        main.step( "Start to generate routes for all BGP peers" )
+        # bgpPeerHosts = []
+        # for i in range( 3, 5 ):
+        #    bgpPeerHosts.append( "host" + str( i ) )
+        # main.log.info( "BGP Peer Hosts are:" + bgpPeerHosts )
+
+        # for i in range( 3, 5 ):
+         #   QuaggaCliHost = "QuaggaCliHost" + str( i )
+          #  prefixes = main.QuaggaCliHost.generatePrefixes( 3, 10 )
+
+           # main.log.info( prefixes )
+            # allRoutesExpected.append( prefixes )
+        main.log.info( "Generate prefixes for host3" )
+        prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+        main.log.info( prefixesHost3 )
+        # generate route with next hop
+        for prefix in prefixesHost3:
+            allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+        routeIntentsExpectedHost3 = \
+            main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+            prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+            SDNIPJSONFILEPATH )
+
+        main.log.info( "Generate prefixes for host4" )
+        prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+        main.log.info( prefixesHost4 )
+        # generate route with next hop
+        for prefix in prefixesHost4:
+            allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+        routeIntentsExpectedHost4 = \
+            main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+            prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+            SDNIPJSONFILEPATH )
+
+        routeIntentsExpected = routeIntentsExpectedHost3 + \
+            routeIntentsExpectedHost4
+
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        main.step( "Set cell for ONOS-cli environment" )
+        main.ONOScli.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
+        main.log.report( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftLogs()
+        main.log.report( "Uninstalling ONOS" )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+
+        main.step( "Starting ONOS service" )
+        # TODO: start ONOS from Mininet Script
+        # startResult = main.ONOSbench.onosStart( "127.0.0.1" )
+        main.step( "Installing ONOS package" )
+        onos1InstallResult = main.ONOSbench.onosInstall(
+            options="-f", node=ONOS1Ip )
+
+        main.step( "Checking if ONOS is up yet" )
+        time.sleep( 60 )
+        onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+        if not onos1Isup:
+            main.log.report( "ONOS1 didn't start!" )
+
+        main.step( "Start ONOS-cli" )
+        # TODO: change the hardcode in startOnosCli method in ONOS CLI driver
+
+        main.ONOScli.startOnosCli( ONOS1Ip )
+
+        main.step( "Get devices in the network" )
+        listResult = main.ONOScli.devices( jsonFormat=False )
+        main.log.info( listResult )
+        time.sleep( 10 )
+        main.log.info( "Installing sdn-ip feature" )
+        main.ONOScli.featureInstall( "onos-app-sdnip" )
+        time.sleep( 10 )
+        main.step( "Login all BGP peers and add routes into peers" )
+        main.log.info( "Login Quagga CLI on host3" )
+        main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+        main.log.info( "Enter configuration model of Quagga CLI on host3" )
+        main.QuaggaCliHost3.enterConfig( 64514 )
+        main.log.info( "Add routes to Quagga on host3" )
+        main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+        main.log.info( "Login Quagga CLI on host4" )
+        main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+        main.log.info( "Enter configuration model of Quagga CLI on host4" )
+        main.QuaggaCliHost4.enterConfig( 64516 )
+        main.log.info( "Add routes to Quagga on host4" )
+        main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+        time.sleep( 60 )
+
+        # get all routes inside SDN-IP
+        getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+        # parse routes from ONOS CLI
+        allRoutesActual = \
+            main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+        allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+        allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+        main.step( "Check routes installed" )
+        main.log.info( "Routes expected:" )
+        main.log.info( allRoutesStrExpected )
+        main.log.info( "Routes get from ONOS CLI:" )
+        main.log.info( allRoutesStrActual )
+        utilities.assertEquals(
+            expect=allRoutesStrExpected, actual=allRoutesStrActual,
+            onpass="***Routes in SDN-IP are correct!***",
+            onfail="***Routes in SDN-IP are wrong!***" )
+        if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+            main.log.report(
+                "***Routes in SDN-IP after adding routes are correct!***" )
+        else:
+            main.log.report(
+                "***Routes in SDN-IP after adding routes are wrong!***" )
+
+        time.sleep( 20 )
+        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+
+        main.step( "Check MultiPointToSinglePointIntent intents installed" )
+        # routeIntentsExpected are generated when generating routes
+        # get rpoute intents from ONOS CLI
+        routeIntentsActual = \
+            main.QuaggaCliHost3.extractActualRouteIntents(
+                getIntentsResult )
+        routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
+        routeIntentsStrActual = str( routeIntentsActual ).replace( 'u', "" )
+        main.log.info( "MultiPointToSinglePoint intents expected:" )
+        main.log.info( routeIntentsStrExpected )
+        main.log.info( "MultiPointToSinglePoint intents get from ONOS CLI:" )
+        main.log.info( routeIntentsStrActual )
+        utilities.assertEquals(
+            expect=True,
+            actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
+            onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
+            correct!***",
+            onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
+            wrong!***" )
+
+        if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+            main.log.report(
+                "***MultiPointToSinglePoint Intents before deleting routes \
+                correct!***" )
+        else:
+            main.log.report(
+                "***MultiPointToSinglePoint Intents before deleting routes \
+                wrong!***" )
+
+        main.step( "Check BGP PointToPointIntent intents installed" )
+        # bgp intents expected
+        bgpIntentsExpected = \
+            main.QuaggaCliHost3.generateExpectedBgpIntents( SDNIPJSONFILEPATH )
+        # get BGP intents from ONOS CLI
+        bgpIntentsActual = main.QuaggaCliHost3.extractActualBgpIntents(
+            getIntentsResult )
+
+        bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
+        bgpIntentsStrActual = str( bgpIntentsActual )
+        main.log.info( "PointToPointIntent intents expected:" )
+        main.log.info( bgpIntentsStrExpected )
+        main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
+        main.log.info( bgpIntentsStrActual )
+
+        utilities.assertEquals(
+            expect=True,
+            actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
+            onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
+            onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+        if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
+            main.log.report(
+                "***PointToPointIntent Intents in SDN-IP are correct!***" )
+        else:
+            main.log.report(
+                "***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+        #============================= Ping Test ========================
+        # wait until all MultiPointToSinglePoint
+        time.sleep( 20 )
+        pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+        pingTestResultsFile = \
+        "~/SDNIP/SdnIpIntentDemo/log/CASE1-ping-results-before-delete-routes-" \
+             + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+        pingTestResults = main.QuaggaCliHost.pingTest(
+            "1.168.30.100", pingTestScript, pingTestResultsFile )
+        main.log.info( pingTestResults )
+
+        # ping test
+
+        #============================= Deleting Routes ==================
+        main.step( "Check deleting routes installed" )
+        main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+        main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+
+        # main.log.info( "main.ONOScli.get_routes_num() = " )
+        # main.log.info( main.ONOScli.getRoutesNum() )
+        # utilities.assertEquals( expect="Total SDN-IP routes = 1", actual=
+        # main.ONOScli.getRoutesNum(),
+        getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+        allRoutesActual = \
+            main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+        main.log.info( "allRoutes_actual = " )
+        main.log.info( allRoutesActual )
+
+        utilities.assertEquals(
+            expect="[]", actual=str( allRoutesActual ),
+            onpass="***Route number in SDN-IP is 0, correct!***",
+            onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+        if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+            main.log.report(
+                "***Routes in SDN-IP after deleting correct!***" )
+        else:
+            main.log.report(
+                "***Routes in SDN-IP after deleting wrong!***" )
+
+        main.step( "Check intents after deleting routes" )
+        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+        routeIntentsActual = \
+            main.QuaggaCliHost3.extractActualRouteIntents(
+                getIntentsResult )
+        main.log.info( "main.ONOScli.intents()= " )
+        main.log.info( routeIntentsActual )
+        utilities.assertEquals(
+            expect="[]", actual=str( routeIntentsActual ),
+            onpass="***MultiPointToSinglePoint Intents number in SDN-IP is \
+            0, correct!***",
+            onfail="***MultiPointToSinglePoint Intents number in SDN-IP is \
+            0, wrong!***" )
+
+        if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+            main.log.report(
+                "***MultiPointToSinglePoint Intents after deleting routes \
+                correct!***" )
+        else:
+            main.log.report(
+                "***MultiPointToSinglePoint Intents after deleting routes \
+                wrong!***" )
+
+        time.sleep( 20 )
+        pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+        pingTestResultsFile = \
+        "~/SDNIP/SdnIpIntentDemo/log/CASE1-ping-results-after-delete-routes-" \
+             + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+        pingTestResults = main.QuaggaCliHost.pingTest(
+            "1.168.30.100", pingTestScript, pingTestResultsFile )
+        main.log.info( pingTestResults )
         time.sleep( 30 )
 
         # main.step( "Test whether Mininet is started" )
@@ -284,12 +882,14 @@
     def CASE2( self, main ):
         """
         Test the SDN-IP functionality
-        allRoutes_expected: all expected routes for all BGP peers
-        routeIntents_expected: all expected MultiPointToSinglePointIntent intents
-        bgpIntents_expected: expected PointToPointIntent intents
-        allRoutes_actual: all routes from ONOS LCI
-        routeIntents_actual: actual MultiPointToSinglePointIntent intents from ONOS CLI
-        bgpIntents_actual: actual PointToPointIntent intents from ONOS CLI
+        allRoutesExpected: all expected routes for all BGP peers
+        routeIntentsExpected: all expected MultiPointToSinglePointIntent \
+        intents
+        bgpIntentsExpected: expected PointToPointIntent intents
+        allRoutesActual: all routes from ONOS LCI
+        routeIntentsActual: actual MultiPointToSinglePointIntent intents \
+        from ONOS CLI
+        bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
         """
         import time
         import json
@@ -297,227 +897,225 @@
         from time import localtime, strftime
 
         main.case(
-            "The test case is to help to setup the TestON environment and test new drivers" )
-        SDNIP_JSON_FILE_PATH = "../tests/SdnIpTest/sdnip.json"
+            "The test case is to help to setup the TestON environment and \
+            test new drivers" )
+        SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
         # all expected routes for all BGP peers
-        allRoutes_expected = []
+        allRoutesExpected = []
         main.step( "Start to generate routes for all BGP peers" )
 
         main.log.info( "Generate prefixes for host3" )
-        prefixes_host3 = main.QuaggaCliHost3.generate_prefixes( 3, 10 )
-        main.log.info( prefixes_host3 )
+        prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+        main.log.info( prefixesHost3 )
         # generate route with next hop
-        for prefix in prefixes_host3:
-            allRoutes_expected.append( prefix + "/" + "192.168.20.1" )
-        routeIntents_expected_host3 = main.QuaggaCliHost3.generate_expected_onePeerRouteIntents(
-            prefixes_host3,
-            "192.168.20.1",
-            "00:00:00:00:02:02",
-            SDNIP_JSON_FILE_PATH )
+        for prefix in prefixesHost3:
+            allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+        routeIntentsExpectedHost3 = \
+            main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+            prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+            SDNIPJSONFILEPATH )
 
         main.log.info( "Generate prefixes for host4" )
-        prefixes_host4 = main.QuaggaCliHost4.generate_prefixes( 4, 10 )
-        main.log.info( prefixes_host4 )
+        prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+        main.log.info( prefixesHost4 )
         # generate route with next hop
-        for prefix in prefixes_host4:
-            allRoutes_expected.append( prefix + "/" + "192.168.30.1" )
-        routeIntents_expected_host4 = main.QuaggaCliHost4.generate_expected_onePeerRouteIntents(
-            prefixes_host4,
-            "192.168.30.1",
-            "00:00:00:00:03:01",
-            SDNIP_JSON_FILE_PATH )
+        for prefix in prefixesHost4:
+            allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+        routeIntentsExpectedHost4 = \
+            main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+            prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+            SDNIPJSONFILEPATH )
 
-        routeIntents_expected = routeIntents_expected_host3 + \
-            routeIntents_expected_host4
+        routeIntentsExpected = routeIntentsExpectedHost3 + \
+            routeIntentsExpectedHost4
 
         main.log.report( "Removing raft logs" )
-        main.ONOSbench.onos_remove_raft_logs()
+        main.ONOSbench.onosRemoveRaftLogs()
         main.log.report( "Uninstalling ONOS" )
-        main.ONOSbench.onos_uninstall( ONOS1_ip )
+        main.ONOSbench.onosUninstall( ONOS1Ip )
 
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
         main.step( "Set cell for ONOS-cli environment" )
-        main.ONOScli.set_cell( cell_name )
-        verify_result = main.ONOSbench.verify_cell()
-        #main.log.report( "Removing raft logs" )
-        # main.ONOSbench.onos_remove_raft_logs()
-        #main.log.report( "Uninstalling ONOS" )
-        # main.ONOSbench.onos_uninstall( ONOS1_ip )
+        main.ONOScli.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
+        # main.log.report( "Removing raft logs" )
+        # main.ONOSbench.onosRemoveRaftLogs()
+        # main.log.report( "Uninstalling ONOS" )
+        # main.ONOSbench.onosUninstall( ONOS1Ip )
         main.step( "Creating ONOS package" )
-        package_result = main.ONOSbench.onos_package()
+        # packageResult = main.ONOSbench.onosPackage()
 
         main.step( "Installing ONOS package" )
-        onos1_install_result = main.ONOSbench.onos_install(
-            options="-f",
-            node=ONOS1_ip )
+        # onos1InstallResult = main.ONOSbench.onosInstall( options="-f",
+        # node=ONOS1Ip )
 
         main.step( "Checking if ONOS is up yet" )
-        time.sleep( 60 )
-        onos1_isup = main.ONOSbench.isup( ONOS1_ip )
-        if not onos1_isup:
+        # time.sleep( 60 )
+        onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+        if not onos1Isup:
             main.log.report( "ONOS1 didn't start!" )
 
         main.step( "Start ONOS-cli" )
-        main.ONOScli.start_onos_cli( ONOS1_ip )
+        main.ONOScli.startOnosCli( ONOS1Ip )
 
         main.step( "Get devices in the network" )
-        list_result = main.ONOScli.devices( json_format=False )
-        main.log.info( list_result )
+        listResult = main.ONOScli.devices( jsonFormat=False )
+        main.log.info( listResult )
         time.sleep( 10 )
         main.log.info( "Installing sdn-ip feature" )
-        main.ONOScli.feature_install( "onos-app-sdnip" )
+        main.ONOScli.featureInstall( "onos-app-sdnip" )
         time.sleep( 10 )
 
         main.step( "Check BGP PointToPointIntent intents installed" )
         # bgp intents expected
-        bgpIntents_expected = main.QuaggaCliHost3.generate_expected_bgpIntents(
-            SDNIP_JSON_FILE_PATH )
+        bgpIntentsExpected = main.QuaggaCliHost3.generateExpectedBgpIntents(
+            SDNIPJSONFILEPATH )
         # get BGP intents from ONOS CLI
-        get_intents_result = main.ONOScli.intents( json_format=True )
-        bgpIntents_actual = main.QuaggaCliHost3.extract_actual_bgpIntents(
-            get_intents_result )
+        getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+        bgpIntentsActual = main.QuaggaCliHost3.extractActualBgpIntents(
+            getIntentsResult )
 
-        bgpIntents_str_expected = str( bgpIntents_expected ).replace( 'u', "" )
-        bgpIntents_str_actual = str( bgpIntents_actual )
+        bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
+        bgpIntentsStrActual = str( bgpIntentsActual )
         main.log.info( "PointToPointIntent intents expected:" )
-        main.log.info( bgpIntents_str_expected )
+        main.log.info( bgpIntentsStrExpected )
         main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
-        main.log.info( bgpIntents_str_actual )
+        main.log.info( bgpIntentsStrActual )
 
-        utilities.assert_equals(
+        utilities.assertEquals(
             expect=True,
-            actual=eq(
-                bgpIntents_str_expected,
-                bgpIntents_str_actual ),
+            actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
             onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
             onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
 
-        if ( eq( bgpIntents_str_expected, bgpIntents_str_actual ) ):
+        if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
             main.log.report(
                 "***PointToPointIntent Intents in SDN-IP are correct!***" )
         else:
             main.log.report(
                 "***PointToPointIntent Intents in SDN-IP are wrong!***" )
 
-        allRoutes_str_expected = str( sorted( allRoutes_expected ) )
-        routeIntents_str_expected = str( sorted( routeIntents_expected ) )
-        ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-        # round_num = 0;
+        allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+        routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
+        pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+        # roundNum = 0;
         # while( True ):
-        for round_num in range( 1, 6 ):
+        for roundNum in range( 1, 6 ):
             # round = round + 1;
-            main.log.report(
-                "The Round " +
-                str( round_num ) +
-                " test starts........................................" )
+            main.log.report( "The Round " + str( roundNum ) +
+                             " test starts................................" )
 
             main.step( "Login all BGP peers and add routes into peers" )
             main.log.info( "Login Quagga CLI on host3" )
             main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
-            main.log.info( "Enter configuration model of Quagga CLI on host3" )
-            main.QuaggaCliHost3.enter_config( 64514 )
+            main.log.info(
+                "Enter configuration model of Quagga CLI on host3" )
+            main.QuaggaCliHost3.enterConfig( 64514 )
             main.log.info( "Add routes to Quagga on host3" )
-            main.QuaggaCliHost3.add_routes( prefixes_host3, 1 )
+            main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
 
             main.log.info( "Login Quagga CLI on host4" )
             main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
-            main.log.info( "Enter configuration model of Quagga CLI on host4" )
-            main.QuaggaCliHost4.enter_config( 64516 )
+            main.log.info(
+                "Enter configuration model of Quagga CLI on host4" )
+            main.QuaggaCliHost4.enterConfig( 64516 )
             main.log.info( "Add routes to Quagga on host4" )
-            main.QuaggaCliHost4.add_routes( prefixes_host4, 1 )
+            main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
             time.sleep( 60 )
 
             # get all routes inside SDN-IP
-            get_routes_result = main.ONOScli.routes( json_format=True )
+            getRoutesResult = main.ONOScli.routes( jsonFormat=True )
 
             # parse routes from ONOS CLI
-            allRoutes_actual = main.QuaggaCliHost3.extract_actual_routes(
-                get_routes_result )
+            allRoutesActual = \
+                main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
 
-            # allRoutes_str_expected = str( sorted( allRoutes_expected ) )
-            allRoutes_str_actual = str( allRoutes_actual ).replace( 'u', "" )
+            # allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+            allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
             main.step( "Check routes installed" )
             main.log.info( "Routes expected:" )
-            main.log.info( allRoutes_str_expected )
+            main.log.info( allRoutesStrExpected )
             main.log.info( "Routes get from ONOS CLI:" )
-            main.log.info( allRoutes_str_actual )
-            utilities.assert_equals(
-                expect=allRoutes_str_expected,
-                actual=allRoutes_str_actual,
+            main.log.info( allRoutesStrActual )
+            utilities.assertEquals(
+                expect=allRoutesStrExpected, actual=allRoutesStrActual,
                 onpass="***Routes in SDN-IP are correct!***",
                 onfail="***Routes in SDN-IP are wrong!***" )
-            if( eq( allRoutes_str_expected, allRoutes_str_actual ) ):
+            if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
                 main.log.report(
                     "***Routes in SDN-IP after adding correct!***" )
             else:
-                main.log.report( "***Routes in SDN-IP after adding wrong!***" )
+                main.log.report(
+                    "***Routes in SDN-IP after adding wrong!***" )
 
             time.sleep( 20 )
-            get_intents_result = main.ONOScli.intents( json_format=True )
+            getIntentsResult = main.ONOScli.intents( jsonFormat=True )
 
             main.step(
                 "Check MultiPointToSinglePointIntent intents installed" )
-            # route_intents_expected are generated when generating routes
+            # routeIntentsExpected are generated when generating routes
             # get route intents from ONOS CLI
-            routeIntents_actual = main.QuaggaCliHost3.extract_actual_routeIntents(
-                get_intents_result )
-            # routeIntents_str_expected = str( sorted( routeIntents_expected ) )
-            routeIntents_str_actual = str(
-                routeIntents_actual ).replace( 'u', "" )
+            routeIntentsActual = \
+                main.QuaggaCliHost3.extractActualRouteIntents(
+                    getIntentsResult )
+            # routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
+            routeIntentsStrActual = str(
+                routeIntentsActual ).replace( 'u', "" )
             main.log.info( "MultiPointToSinglePoint intents expected:" )
-            main.log.info( routeIntents_str_expected )
+            main.log.info( routeIntentsStrExpected )
             main.log.info(
                 "MultiPointToSinglePoint intents get from ONOS CLI:" )
-            main.log.info( routeIntents_str_actual )
-            utilities.assert_equals(
+            main.log.info( routeIntentsStrActual )
+            utilities.assertEquals(
                 expect=True,
-                actual=eq(
-                    routeIntents_str_expected,
-                    routeIntents_str_actual ),
-                onpass="***MultiPointToSinglePoint Intents in SDN-IP are correct!***",
-                onfail="***MultiPointToSinglePoint Intents in SDN-IP are wrong!***" )
+                actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
+                onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
+                correct!***",
+                onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
+                wrong!***" )
 
-            if( eq( routeIntents_str_expected, routeIntents_str_actual ) ):
+            if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
                 main.log.report(
-                    "***MultiPointToSinglePoint Intents after adding routes correct!***" )
+                    "***MultiPointToSinglePoint Intents after adding routes \
+                    correct!***" )
             else:
                 main.log.report(
-                    "***MultiPointToSinglePoint Intents after adding routes wrong!***" )
+                    "***MultiPointToSinglePoint Intents after adding routes \
+                    wrong!***" )
 
             #============================= Ping Test ========================
             # wait until all MultiPointToSinglePoint
             time.sleep( 20 )
-            # ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-            ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/log/CASE2-Round" + \
-                str( round_num ) + "-ping-results-before-delete-routes-" + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
-            ping_test_results = main.QuaggaCliHost.ping_test(
-                "1.168.30.100",
-                ping_test_script,
-                ping_test_results_file )
-            main.log.info( ping_test_results )
+            # pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+            pingTestResultsFile = \
+                "~/SDNIP/SdnIpIntentDemo/log/CASE2-Round" \
+                + str( roundNum ) + "-ping-results-before-delete-routes-" \
+                + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+            pingTestResults = main.QuaggaCliHost.pingTest(
+                "1.168.30.100", pingTestScript, pingTestResultsFile )
+            main.log.info( pingTestResults )
             # ping test
 
             #============================= Deleting Routes ==================
             main.step( "Check deleting routes installed" )
             main.log.info( "Delete routes to Quagga on host3" )
-            main.QuaggaCliHost3.delete_routes( prefixes_host3, 1 )
+            main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
             main.log.info( "Delete routes to Quagga on host4" )
-            main.QuaggaCliHost4.delete_routes( prefixes_host4, 1 )
+            main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
 
-            get_routes_result = main.ONOScli.routes( json_format=True )
-            allRoutes_actual = main.QuaggaCliHost3.extract_actual_routes(
-                get_routes_result )
+            getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+            allRoutesActual = \
+                main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
             main.log.info( "allRoutes_actual = " )
-            main.log.info( allRoutes_actual )
+            main.log.info( allRoutesActual )
 
-            utilities.assert_equals(
-                expect="[]",
-                actual=str( allRoutes_actual ),
+            utilities.assertEquals(
+                expect="[]", actual=str( allRoutesActual ),
                 onpass="***Route number in SDN-IP is 0, correct!***",
                 onfail="***Routes number in SDN-IP is not 0, wrong!***" )
 
-            if( eq( allRoutes_str_expected, allRoutes_str_actual ) ):
+            if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
                 main.log.report(
                     "***Routes in SDN-IP after deleting correct!***" )
             else:
@@ -525,31 +1123,37 @@
                     "***Routes in SDN-IP after deleting wrong!***" )
 
             main.step( "Check intents after deleting routes" )
-            get_intents_result = main.ONOScli.intents( json_format=True )
-            routeIntents_actual = main.QuaggaCliHost3.extract_actual_routeIntents(
-                get_intents_result )
+            getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+            routeIntentsActual = \
+                main.QuaggaCliHost3.extractActualRouteIntents(
+                    getIntentsResult )
             main.log.info( "main.ONOScli.intents()= " )
-            main.log.info( routeIntents_actual )
-            utilities.assert_equals(
-                expect="[]",
-                actual=str( routeIntents_actual ),
-                onpass="***MultiPointToSinglePoint Intents number in SDN-IP is 0, correct!***",
-                onfail="***MultiPointToSinglePoint Intents number in SDN-IP is 0, wrong!***" )
+            main.log.info( routeIntentsActual )
+            utilities.assertEquals(
+                expect="[]", actual=str( routeIntentsActual ),
+                onpass=
+                "***MultiPointToSinglePoint Intents number in SDN-IP \
+                is 0, correct!***",
+                onfail="***MultiPointToSinglePoint Intents number in SDN-IP \
+                is 0, wrong!***" )
 
-            if( eq( routeIntents_str_expected, routeIntents_str_actual ) ):
+            if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
                 main.log.report(
-                    "***MultiPointToSinglePoint Intents after deleting routes correct!***" )
+                    "***MultiPointToSinglePoint Intents after deleting \
+                    routes correct!***" )
             else:
                 main.log.report(
-                    "***MultiPointToSinglePoint Intents after deleting routes wrong!***" )
+                    "***MultiPointToSinglePoint Intents after deleting \
+                    routes wrong!***" )
 
             time.sleep( 20 )
-            # ping_test_script = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
-            ping_test_results_file = "~/SDNIP/SdnIpIntentDemo/log/CASE2-Round" + \
-                str( round_num ) + "-ping-results-after-delete-routes-" + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
-            ping_test_results = main.QuaggaCliHost.ping_test(
-                "1.168.30.100",
-                ping_test_script,
-                ping_test_results_file )
-            main.log.info( ping_test_results )
+            # pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+            pingTestResultsFile = \
+                "~/SDNIP/SdnIpIntentDemo/log/CASE2-Round" \
+                + str( roundNum ) + "-ping-results-after-delete-routes-" \
+                + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+            pingTestResults = main.QuaggaCliHost.pingTest(
+                "1.168.30.100", pingTestScript, pingTestResultsFile )
+            main.log.info( pingTestResults )
             time.sleep( 30 )
+
diff --git a/TestON/tests/SdnIpTest/SdnIpTest.topo b/TestON/tests/SdnIpTest/SdnIpTest.topo
index 6df1975..fe9d1bb 100755
--- a/TestON/tests/SdnIpTest/SdnIpTest.topo
+++ b/TestON/tests/SdnIpTest/SdnIpTest.topo
@@ -33,7 +33,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>QuaggaCliDriver</type>
-            <connect_order>5</connect_order>
+            <connect_order>4</connect_order>
             <COMPONENTS> </COMPONENTS>
         </QuaggaCliHost3>
         <QuaggaCliHost4>
@@ -44,14 +44,827 @@
             <connect_order>5</connect_order>
             <COMPONENTS> </COMPONENTS>
         </QuaggaCliHost4>
+        <QuaggaCliHost5>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost5>
+
         <QuaggaCliHost>
             <host>127.0.0.1</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>QuaggaCliDriver</type>
-            <connect_order>5</connect_order>
+            <connect_order>7</connect_order>
             <COMPONENTS> </COMPONENTS>
         </QuaggaCliHost>
 
+        <QuaggaCliHost101>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>101</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost101>
+        <QuaggaCliHost102>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>102</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost102>
+        <QuaggaCliHost103>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>103</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost103>
+        <QuaggaCliHost104>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>104</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost104>
+        <QuaggaCliHost105>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>105</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost105>
+        <QuaggaCliHost106>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>106</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost106>
+        <QuaggaCliHost107>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>107</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost107>
+        <QuaggaCliHost108>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>108</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost108>
+        <QuaggaCliHost109>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>109</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost109>
+        <QuaggaCliHost110>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>110</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost110>
+        <QuaggaCliHost111>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>111</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost111>
+        <QuaggaCliHost112>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>112</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost112>
+        <QuaggaCliHost113>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>113</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost113>
+        <QuaggaCliHost114>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>114</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost114>
+        <QuaggaCliHost115>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>115</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost115>
+        <QuaggaCliHost116>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>116</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost116>
+        <QuaggaCliHost117>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>117</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost117>
+        <QuaggaCliHost118>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>118</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost118>
+        <QuaggaCliHost119>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>119</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost119>
+        <QuaggaCliHost120>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>120</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost120>
+        <QuaggaCliHost121>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>121</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost121>
+        <QuaggaCliHost122>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>122</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost122>
+        <QuaggaCliHost123>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>123</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost123>
+        <QuaggaCliHost124>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>124</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost124>
+        <QuaggaCliHost125>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>125</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost125>
+        <QuaggaCliHost126>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>126</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost126>
+        <QuaggaCliHost127>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>127</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost127>
+        <QuaggaCliHost128>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>128</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost128>
+        <QuaggaCliHost129>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>129</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost129>
+        <QuaggaCliHost130>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>130</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost130>
+        <QuaggaCliHost131>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>131</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost131>
+        <QuaggaCliHost132>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>132</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost132>
+        <QuaggaCliHost133>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>133</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost133>
+        <QuaggaCliHost134>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>134</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost134>
+        <QuaggaCliHost135>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>135</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost135>
+        <QuaggaCliHost136>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>136</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost136>
+        <QuaggaCliHost137>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>137</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost137>
+        <QuaggaCliHost138>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>138</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost138>
+        <QuaggaCliHost139>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>139</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost139>
+        <QuaggaCliHost140>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>140</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost140>
+        <QuaggaCliHost141>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>141</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost141>
+        <QuaggaCliHost142>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>142</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost142>
+        <QuaggaCliHost143>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>143</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost143>
+        <QuaggaCliHost144>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>144</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost144>
+        <QuaggaCliHost145>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>145</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost145>
+        <QuaggaCliHost146>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>146</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost146>
+        <QuaggaCliHost147>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>147</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost147>
+        <QuaggaCliHost148>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>148</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost148>
+        <QuaggaCliHost149>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>149</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost149>
+        <QuaggaCliHost150>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>150</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost150>
+        <QuaggaCliHost151>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>151</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost151>
+        <QuaggaCliHost152>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>152</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost152>
+        <QuaggaCliHost153>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>153</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost153>
+        <QuaggaCliHost154>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>154</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost154>
+        <QuaggaCliHost155>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>155</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost155>
+        <QuaggaCliHost156>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>156</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost156>
+        <QuaggaCliHost157>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>157</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost157>
+        <QuaggaCliHost158>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>158</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost158>
+        <QuaggaCliHost159>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>159</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost159>
+        <QuaggaCliHost160>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>160</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost160>
+        <QuaggaCliHost161>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>161</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost161>
+        <QuaggaCliHost162>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>162</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost162>
+        <QuaggaCliHost163>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>163</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost163>
+        <QuaggaCliHost164>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>164</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost164>
+        <QuaggaCliHost165>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>165</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost165>
+        <QuaggaCliHost166>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>166</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost166>
+        <QuaggaCliHost167>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>167</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost167>
+        <QuaggaCliHost168>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>168</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost168>
+        <QuaggaCliHost169>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>169</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost169>
+        <QuaggaCliHost170>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>170</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost170>
+        <QuaggaCliHost171>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>171</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost171>
+        <QuaggaCliHost172>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>172</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost172>
+        <QuaggaCliHost173>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>173</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost173>
+        <QuaggaCliHost174>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>174</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost174>
+        <QuaggaCliHost175>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>175</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost175>
+        <QuaggaCliHost176>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>176</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost176>
+        <QuaggaCliHost177>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>177</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost177>
+        <QuaggaCliHost178>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>178</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost178>
+        <QuaggaCliHost179>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>179</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost179>
+        <QuaggaCliHost180>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>180</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost180>
+        <QuaggaCliHost181>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>181</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost181>
+        <QuaggaCliHost182>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>182</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost182>
+        <QuaggaCliHost183>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>183</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost183>
+        <QuaggaCliHost184>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>184</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost184>
+        <QuaggaCliHost185>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>185</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost185>
+        <QuaggaCliHost186>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>186</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost186>
+        <QuaggaCliHost187>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>187</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost187>
+        <QuaggaCliHost188>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>188</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost188>
+        <QuaggaCliHost189>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>189</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost189>
+        <QuaggaCliHost190>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>190</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost190>
+        <QuaggaCliHost191>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>191</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost191>
+        <QuaggaCliHost192>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>192</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost192>
+        <QuaggaCliHost193>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>193</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost193>
+
+        <QuaggaCliHost194>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>194</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost194>
+        <QuaggaCliHost195>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>195</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost195>
+        <QuaggaCliHost196>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>196</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost196>
+        <QuaggaCliHost197>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>197</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost197>
+        <QuaggaCliHost198>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>198</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost198>
+        <QuaggaCliHost199>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>199</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost199>
+        <QuaggaCliHost200>
+            <host>127.0.0.1</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>QuaggaCliDriver</type>
+            <connect_order>200</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </QuaggaCliHost200>
+
+
     </COMPONENT>
 </TOPOLOGY>
+
diff --git a/TestON/tests/TopoConvNext/__init__.py b/TestON/tests/TopoConvNext/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/TopoConvNext/__init__.py
diff --git a/TestON/tests/TopoPerfNext/Backup/TopoPerfNext.py b/TestON/tests/TopoPerfNext/Backup/TopoPerfNext.py
new file mode 100644
index 0000000..cc40b94
--- /dev/null
+++ b/TestON/tests/TopoPerfNext/Backup/TopoPerfNext.py
@@ -0,0 +1,1710 @@
+#TopoPerfNext
+#
+#Topology Performance test for ONOS-next
+#
+#andrew@onlab.us
+#
+#If your machine does not come with numpy
+#run the following command:
+#sudo apt-get install python-numpy python-scipy 
+
+import time
+import sys
+import os
+import re
+
+class TopoPerfNext:
+    def __init__(self):
+        self.default = ''
+
+    def CASE1(self, main):
+        '''
+        ONOS startup sequence
+        '''
+        import time
+        
+        ## Global cluster count for scale-out purposes
+        global cluster_count
+        #Set initial cluster count
+        cluster_count = 1 
+        ##
+
+        cell_name = main.params['ENV']['cellName']
+
+        git_pull = main.params['GIT']['autoPull']
+        checkout_branch = main.params['GIT']['checkout']
+
+        ONOS1_ip = main.params['CTRL']['ip1']
+        ONOS2_ip = main.params['CTRL']['ip2']
+        ONOS3_ip = main.params['CTRL']['ip3']
+        
+        #### Hardcoded ONOS nodes particular to my env ####
+        ONOS4_ip = "10.128.174.4"
+        ONOS5_ip = "10.128.174.5"
+        ONOS6_ip = "10.128.174.6"
+        ONOS7_ip = "10.128.174.7"
+        #### ####
+
+        MN1_ip = main.params['MN']['ip1']
+        BENCH_ip = main.params['BENCH']['ip']
+
+        topo_cfg_file = main.params['TEST']['topo_config_file']
+        topo_cfg_name = main.params['TEST']['topo_config_name']
+        
+        main.case("Setting up test environment")
+        main.log.info("Copying topology event accumulator config"+\
+            " to ONOS /package/etc")
+        main.ONOSbench.handle.sendline("cp ~/"+\
+            topo_cfg_file+\
+            " ~/ONOS/tools/package/etc/"+\
+            topo_cfg_name)
+        main.ONOSbench.handle.expect("\$")
+
+        main.log.report("Setting up test environment")
+
+        main.step("Cleaning previously installed ONOS if any")
+        main.ONOSbench.onos_uninstall(node_ip=ONOS2_ip)
+        main.ONOSbench.onos_uninstall(node_ip=ONOS3_ip)
+        main.ONOSbench.onos_uninstall(node_ip=ONOS4_ip)
+        main.ONOSbench.onos_uninstall(node_ip=ONOS5_ip)
+        main.ONOSbench.onos_uninstall(node_ip=ONOS6_ip)
+        main.ONOSbench.onos_uninstall(node_ip=ONOS7_ip)
+
+        main.step("Creating cell file")
+        cell_file_result = main.ONOSbench.create_cell_file(
+                BENCH_ip, cell_name, MN1_ip, "onos-core,onos-app-metrics",
+                ONOS1_ip)
+
+        main.step("Applying cell file to environment")
+        cell_apply_result = main.ONOSbench.set_cell(cell_name)
+        verify_cell_result = main.ONOSbench.verify_cell()
+        
+        #NOTE: This step may be removed after proper 
+        #      copy cat log functionality
+        main.step("Removing raft/copy-cat logs from ONOS nodes")
+        main.ONOSbench.onos_remove_raft_logs()
+        time.sleep(30)
+
+        main.step("Git checkout and pull "+checkout_branch)
+        if git_pull == 'on':
+            checkout_result = \
+                    main.ONOSbench.git_checkout(checkout_branch)
+            pull_result = main.ONOSbench.git_pull()
+        else:
+            checkout_result = main.TRUE
+            pull_result = main.TRUE
+            main.log.info("Skipped git checkout and pull")
+
+        main.log.report("Commit information - ")
+        main.ONOSbench.get_version(report=True)
+
+        main.step("Using mvn clean & install")
+        mvn_result = main.ONOSbench.clean_install()
+        mvn_result = main.TRUE
+
+        main.step("Set cell for ONOS cli env")
+        main.ONOS1cli.set_cell(cell_name)
+        #main.ONOS2cli.set_cell(cell_name)
+        #main.ONOS3cli.set_cell(cell_name)
+
+        main.step("Creating ONOS package")
+        package_result = main.ONOSbench.onos_package()
+
+        main.step("Installing ONOS package")
+        install1_result = main.ONOSbench.onos_install(node=ONOS1_ip)
+        #install2_result = main.ONOSbench.onos_install(node=ONOS2_ip)
+        #install3_result = main.ONOSbench.onos_install(node=ONOS3_ip)
+
+        time.sleep(10)
+
+        main.step("Start onos cli")
+        cli1 = main.ONOS1cli.start_onos_cli(ONOS1_ip)
+        #cli2 = main.ONOS2cli.start_onos_cli(ONOS2_ip)
+        #cli3 = main.ONOS3cli.start_onos_cli(ONOS3_ip)
+
+        utilities.assert_equals(expect=main.TRUE,
+                actual= cell_file_result and cell_apply_result and\
+                        verify_cell_result and checkout_result and\
+                        pull_result and mvn_result and\
+                        install1_result, #and install2_result and\
+                        #install3_result,
+                onpass="Test Environment setup successful",
+                onfail="Failed to setup test environment")
+
+    def CASE2(self, main):
+        '''
+        Assign s1 to ONOS1 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
+        2) OFP-to-graph measurement: 'ONOS processing' snippet of
+           measurement from OFP Vendor message to Graph change
+        3) OFP-to-device measurement: 'ONOS processing without 
+           graph change' snippet of measurement from OFP vendor
+           message to Device change timestamp
+        4) T0-to-device measurement: Measurement that includes
+           the switch handshake to devices timestamp without 
+           the graph view change. (TCP handshake -> Device 
+           change)
+        '''
+        import time
+        import subprocess
+        import json
+        import requests
+        import os
+        import numpy
+        global cluster_count
+
+        ONOS1_ip = main.params['CTRL']['ip1']
+        ONOS2_ip = main.params['CTRL']['ip2']
+        ONOS3_ip = main.params['CTRL']['ip3']
+        ONOS4_ip = main.params['CTRL']['ip4']
+        ONOS5_ip = main.params['CTRL']['ip5']
+        ONOS6_ip = main.params['CTRL']['ip6']
+        ONOS7_ip = main.params['CTRL']['ip7']
+
+        ONOS_user = main.params['CTRL']['user']
+
+        default_sw_port = main.params['CTRL']['port1']
+       
+        #Number of iterations of case
+        num_iter = main.params['TEST']['numIter']
+        #Number of first 'x' iterations to ignore:
+        iter_ignore = int(main.params['TEST']['iterIgnore'])
+
+        #Timestamp 'keys' for json metrics output.
+        #These are subject to change, hence moved into params
+        deviceTimestamp = main.params['JSON']['deviceTimestamp']
+        graphTimestamp = main.params['JSON']['graphTimestamp']
+
+        debug_mode = main.params['TEST']['debugMode']
+        onos_log = main.params['TEST']['onosLogFile']
+
+        #Threshold for the test
+        threshold_str = main.params['TEST']['singleSwThreshold']
+        threshold_obj = threshold_str.split(",")
+        threshold_min = int(threshold_obj[0])
+        threshold_max = int(threshold_obj[1])
+
+        #List of switch add latency collected from
+        #all iterations
+        latency_end_to_end_list = []
+        latency_ofp_to_graph_list = []
+        latency_ofp_to_device_list = []
+        latency_t0_to_device_list = []
+        latency_tcp_to_ofp_list = []
+
+        #Directory/file to store tshark results
+        tshark_of_output = "/tmp/tshark_of_topo.txt"
+        tshark_tcp_output = "/tmp/tshark_tcp_topo.txt"
+
+        #String to grep in tshark output
+        tshark_tcp_string = "TCP 74 "+default_sw_port
+        tshark_of_string = "OFP 86 Vendor"
+     
+        #Initialize assertion to TRUE
+        assertion = main.TRUE
+      
+        local_time = time.strftime('%x %X')
+        local_time = local_time.replace("/","")
+        local_time = local_time.replace(" ","_")
+        local_time = local_time.replace(":","")
+        if debug_mode == 'on':
+            main.ONOS1.tshark_pcap("eth0",
+                    "/tmp/single_sw_lat_pcap_"+local_time) 
+
+            main.log.info("Debug mode is on")
+
+        main.log.report("Latency of adding one switch to controller")
+        main.log.report("First "+str(iter_ignore)+" iterations ignored"+
+                " for jvm warmup time")
+        main.log.report("Total iterations of test: "+str(num_iter))
+
+        for i in range(0, int(num_iter)):
+            main.log.info("Starting tshark capture")
+
+            #* TCP [ACK, SYN] is used as t0_a, the
+            #  very first "exchange" between ONOS and 
+            #  the switch for end-to-end measurement
+            #* OFP [Stats Reply] is used for t0_b
+            #  the very last OFP message between ONOS
+            #  and the switch for ONOS measurement
+            main.ONOS1.tshark_grep(tshark_tcp_string,
+                    tshark_tcp_output)
+            main.ONOS1.tshark_grep(tshark_of_string,
+                    tshark_of_output)
+
+            #Wait and ensure tshark is started and 
+            #capturing
+            time.sleep(10)
+
+            main.log.info("Assigning s1 to controller")
+
+            main.Mininet1.assign_sw_controller(sw="1",
+                    ip1=ONOS1_ip, port1=default_sw_port)
+
+            #Wait and ensure switch is assigned
+            #before stopping tshark
+            time.sleep(30)
+   
+            main.log.info("Stopping all Tshark processes")
+            main.ONOS1.stop_tshark()
+
+            #tshark output is saved in ONOS. Use subprocess
+            #to copy over files to TestON for parsing
+            main.log.info("Copying over tshark files")
+            
+            #TCP CAPTURE ****
+            #Copy the tshark output from ONOS machine to
+            #TestON machine in tshark_tcp_output directory>file
+            os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
+                    tshark_tcp_output+" /tmp/") 
+            tcp_file = open(tshark_tcp_output, 'r')
+            temp_text = tcp_file.readline()
+            temp_text = temp_text.split(" ")
+
+            main.log.info("Object read in from TCP capture: "+
+                    str(temp_text))
+            if len(temp_text) > 1:
+                t0_tcp = float(temp_text[1])*1000.0
+            else:
+                main.log.error("Tshark output file for TCP"+
+                        " returned unexpected results")
+                t0_tcp = 0
+                assertion = main.FALSE
+            
+            tcp_file.close()
+            #****************
+
+            #OF CAPTURE ****
+            os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
+                    tshark_of_output+" /tmp/")
+            of_file = open(tshark_of_output, 'r')
+           
+            line_ofp = ""
+            #Read until last line of file
+            while True:
+                temp_text = of_file.readline()
+                if temp_text !='':
+                    line_ofp = temp_text
+                else:
+                    break 
+            obj = line_ofp.split(" ")
+            
+            main.log.info("Object read in from OFP capture: "+
+                    str(line_ofp))
+    
+            if len(line_ofp) > 1:
+                t0_ofp = float(obj[1])*1000.0
+            else:
+                main.log.error("Tshark output file for OFP"+
+                        " returned unexpected results")
+                t0_ofp = 0
+                assertion = main.FALSE
+            
+            of_file.close()
+            #****************
+           
+            json_str_1 = main.ONOS1cli.topology_events_metrics()
+            #Initialize scale-out variables 
+            json_str_2 = "" 
+            json_str_3 = ""
+            json_str_4 = ""
+            json_str_5 = ""
+            json_str_6 = ""
+            json_str_7 = ""
+
+            json_obj_1 = json.loads(json_str_1)
+            json_obj_2 = json.loads(json_str_2)
+            json_obj_3 = json.loads(json_str_3)
+            #Initialize scale-out variables
+            json_obj_4 = ""
+            json_obj_5 = ""
+            json_obj_6 = ""
+            json_obj_7 = ""
+
+            #Include scale-out measurements when applicable
+            if cluster_count == 5:
+                json_str_4 = main.ONOS4cli.topology_events_metrics()
+                json_str_5 = main.ONOS5cli.topology_events_metrics()
+                
+                json_obj_4 = json.loads(json_str_4)
+                json_obj_5 = json.loads(json_str_5)
+            elif cluster_count == 6:
+                main.log.info("TODO: create even number cluster events")
+            elif cluster_count == 7:
+                json_str_6 = main.ONOS6cli.topology_events_metrics()
+                json_str_7 = main.ONOS7cli.topology_events_metrics()
+
+                json_obj_6 = json.loads(json_str_6)
+                json_obj_7 = json.loads(json_str_7)
+
+            #Obtain graph timestamp. This timestsamp captures
+            #the epoch time at which the topology graph was updated.
+            graph_timestamp_1 = \
+                    json_obj_1[graphTimestamp]['value']
+            graph_timestamp_2 = \
+                    json_obj_2[graphTimestamp]['value']
+            graph_timestamp_3 = \
+                    json_obj_3[graphTimestamp]['value']
+
+            #Obtain device timestamp. This timestamp captures
+            #the epoch time at which the device event happened
+            device_timestamp_1 = \
+                    json_obj_1[deviceTimestamp]['value'] 
+            device_timestamp_2 = \
+                    json_obj_2[deviceTimestamp]['value'] 
+            device_timestamp_3 = \
+                    json_obj_3[deviceTimestamp]['value'] 
+
+            #t0 to device processing latency 
+            delta_device_1 = int(device_timestamp_1) - int(t0_tcp)
+            delta_device_2 = int(device_timestamp_2) - int(t0_tcp)
+            delta_device_3 = int(device_timestamp_3) - int(t0_tcp)
+        
+            #Get average of delta from all instances
+            avg_delta_device = \
+                    (int(delta_device_1)+\
+                     int(delta_device_2)+\
+                     int(delta_device_3)) / 3
+
+            #Ensure avg delta meets the threshold before appending
+            if avg_delta_device > 0.0 and avg_delta_device < 10000\
+                    and int(i) > iter_ignore:
+                latency_t0_to_device_list.append(avg_delta_device)
+            else:
+                main.log.info("Results for t0-to-device ignored"+\
+                        "due to excess in threshold / warmup iteration.")
+
+            #t0 to graph processing latency (end-to-end)
+            delta_graph_1 = int(graph_timestamp_1) - int(t0_tcp)
+            delta_graph_2 = int(graph_timestamp_2) - int(t0_tcp)
+            delta_graph_3 = int(graph_timestamp_3) - int(t0_tcp)
+        
+            #Get average of delta from all instances
+            #TODO: use max delta graph
+            #max_delta_graph = max(three)
+            avg_delta_graph = \
+                    (int(delta_graph_1)+\
+                     int(delta_graph_2)+\
+                     int(delta_graph_3)) / 3
+
+            #Ensure avg delta meets the threshold before appending
+            if avg_delta_graph > 0.0 and avg_delta_graph < 10000\
+                    and int(i) > iter_ignore:
+                latency_end_to_end_list.append(avg_delta_graph)
+            else:
+                main.log.info("Results for end-to-end ignored"+\
+                        "due to excess in threshold")
+
+            #ofp to graph processing latency (ONOS processing)
+            delta_ofp_graph_1 = int(graph_timestamp_1) - int(t0_ofp)
+            delta_ofp_graph_2 = int(graph_timestamp_2) - int(t0_ofp)
+            delta_ofp_graph_3 = int(graph_timestamp_3) - int(t0_ofp)
+            
+            avg_delta_ofp_graph = \
+                    (int(delta_ofp_graph_1)+\
+                     int(delta_ofp_graph_2)+\
+                     int(delta_ofp_graph_3)) / 3
+            
+            if avg_delta_ofp_graph > threshold_min \
+                    and avg_delta_ofp_graph < threshold_max\
+                    and int(i) > iter_ignore:
+                latency_ofp_to_graph_list.append(avg_delta_ofp_graph)
+            elif avg_delta_ofp_graph > (-10) and \
+                    avg_delta_ofp_graph < 0.0 and\
+                    int(i) > iter_ignore:
+                main.log.info("Sub-millisecond result likely; "+
+                    "negative result was rounded to 0")
+                #NOTE: Current metrics framework does not 
+                #support sub-millisecond accuracy. Therefore,
+                #if the result is negative, we can reasonably
+                #conclude sub-millisecond results and just 
+                #append the best rounded effort - 0 ms. 
+                latency_ofp_to_graph_list.append(0)
+            else:
+                main.log.info("Results for ofp-to-graph "+\
+                        "ignored due to excess in threshold")
+
+            #ofp to device processing latency (ONOS processing)
+            delta_ofp_device_1 = float(device_timestamp_1) - float(t0_ofp)
+            delta_ofp_device_2 = float(device_timestamp_2) - float(t0_ofp)
+            delta_ofp_device_3 = float(device_timestamp_3) - float(t0_ofp)
+            
+            avg_delta_ofp_device = \
+                    (float(delta_ofp_device_1)+\
+                     float(delta_ofp_device_2)+\
+                     float(delta_ofp_device_3)) / 3
+            
+            #NOTE: ofp - delta measurements are occasionally negative
+            #      due to system time misalignment.
+            latency_ofp_to_device_list.append(avg_delta_ofp_device)
+
+            delta_ofp_tcp = int(t0_ofp) - int(t0_tcp)
+            if delta_ofp_tcp > threshold_min \
+                    and delta_ofp_tcp < threshold_max and\
+                    int(i) > iter_ignore:
+                latency_tcp_to_ofp_list.append(delta_ofp_tcp)
+            else:
+                main.log.info("Results fo tcp-to-ofp "+\
+                        "ignored due to excess in threshold")
+
+            #TODO:
+            #Fetch logs upon threshold excess
+
+            main.log.info("ONOS1 delta end-to-end: "+
+                    str(delta_graph_1) + " ms")
+            main.log.info("ONOS2 delta end-to-end: "+
+                    str(delta_graph_2) + " ms")
+            main.log.info("ONOS3 delta end-to-end: "+
+                    str(delta_graph_3) + " ms")
+
+            main.log.info("ONOS1 delta OFP - graph: "+
+                    str(delta_ofp_graph_1) + " ms")
+            main.log.info("ONOS2 delta OFP - graph: "+
+                    str(delta_ofp_graph_2) + " ms")
+            main.log.info("ONOS3 delta OFP - graph: "+
+                    str(delta_ofp_graph_3) + " ms")
+            
+            main.log.info("ONOS1 delta device - t0: "+
+                    str(delta_device_1) + " ms")
+            main.log.info("ONOS2 delta device - t0: "+
+                    str(delta_device_2) + " ms")
+            main.log.info("ONOS3 delta device - t0: "+
+                    str(delta_device_3) + " ms")
+         
+            main.log.info("TCP to OFP delta: "+
+                    str(delta_ofp_tcp) + " ms")
+            #main.log.info("ONOS1 delta OFP - device: "+
+            #        str(delta_ofp_device_1) + " ms")
+            #main.log.info("ONOS2 delta OFP - device: "+
+            #        str(delta_ofp_device_2) + " ms")
+            #main.log.info("ONOS3 delta OFP - device: "+
+            #        str(delta_ofp_device_3) + " ms")
+
+            main.step("Remove switch from controller")
+            main.Mininet1.delete_sw_controller("s1")
+
+            time.sleep(5)
+
+        #END of for loop iteration
+
+        #If there is at least 1 element in each list,
+        #pass the test case
+        if len(latency_end_to_end_list) > 0 and\
+           len(latency_ofp_to_graph_list) > 0 and\
+           len(latency_ofp_to_device_list) > 0 and\
+           len(latency_t0_to_device_list) > 0 and\
+           len(latency_tcp_to_ofp_list) > 0:
+            assertion = main.TRUE
+        elif len(latency_end_to_end_list) == 0:
+            #The appending of 0 here is to prevent 
+            #the min,max,sum functions from failing 
+            #below
+            latency_end_to_end_list.append(0)
+            assertion = main.FALSE
+        elif len(latency_ofp_to_graph_list) == 0:
+            latency_ofp_to_graph_list.append(0)
+            assertion = main.FALSE
+        elif len(latency_ofp_to_device_list) == 0:
+            latency_ofp_to_device_list.append(0)
+            assertion = main.FALSE
+        elif len(latency_t0_to_device_list) == 0:
+            latency_t0_to_device_list.append(0)
+            assertion = main.FALSE
+        elif len(latency_tcp_to_ofp_list) == 0:
+            latency_tcp_to_ofp_list.append(0)
+            assertion = main.FALSE
+
+        #Calculate min, max, avg of latency lists
+        latency_end_to_end_max = \
+                int(max(latency_end_to_end_list))
+        latency_end_to_end_min = \
+                int(min(latency_end_to_end_list))
+        latency_end_to_end_avg = \
+                (int(sum(latency_end_to_end_list)) / \
+                 len(latency_end_to_end_list))
+        latency_end_to_end_std_dev = \
+                str(round(numpy.std(latency_end_to_end_list),1))
+
+        latency_ofp_to_graph_max = \
+                int(max(latency_ofp_to_graph_list))
+        latency_ofp_to_graph_min = \
+                int(min(latency_ofp_to_graph_list))
+        latency_ofp_to_graph_avg = \
+                (int(sum(latency_ofp_to_graph_list)) / \
+                 len(latency_ofp_to_graph_list))
+        latency_ofp_to_graph_std_dev = \
+                str(round(numpy.std(latency_ofp_to_graph_list),1))
+
+        latency_ofp_to_device_max = \
+                int(max(latency_ofp_to_device_list))
+        latency_ofp_to_device_min = \
+                int(min(latency_ofp_to_device_list))
+        latency_ofp_to_device_avg = \
+                (int(sum(latency_ofp_to_device_list)) / \
+                 len(latency_ofp_to_device_list))
+        latency_ofp_to_device_std_dev = \
+                str(round(numpy.std(latency_ofp_to_device_list),1))
+
+        latency_t0_to_device_max = \
+                int(max(latency_t0_to_device_list))
+        latency_t0_to_device_min = \
+                int(min(latency_t0_to_device_list))
+        latency_t0_to_device_avg = \
+                (int(sum(latency_t0_to_device_list)) / \
+                 len(latency_t0_to_device_list))
+        latency_ofp_to_device_std_dev = \
+                str(round(numpy.std(latency_t0_to_device_list),1))
+
+        latency_tcp_to_ofp_max = \
+                int(max(latency_tcp_to_ofp_list))
+        latency_tcp_to_ofp_min = \
+                int(min(latency_tcp_to_ofp_list))
+        latency_tcp_to_ofp_avg = \
+                (int(sum(latency_tcp_to_ofp_list)) / \
+                 len(latency_tcp_to_ofp_list))
+        latency_tcp_to_ofp_std_dev = \
+                str(round(numpy.std(latency_tcp_to_ofp_list),1))
+
+        main.log.report("Switch add - End-to-end latency: "+\
+                "Avg: "+str(latency_end_to_end_avg)+" ms "+
+                "Std Deviation: "+latency_end_to_end_std_dev+" ms")
+        main.log.report("Switch add - OFP-to-Graph latency: "+\
+                "Note: results are not accurate to sub-millisecond. "+
+                "Any sub-millisecond results are rounded to 0 ms. ")
+        main.log.report("Avg: "+str(latency_ofp_to_graph_avg)+" ms "+
+                "Std Deviation: "+latency_ofp_to_graph_std_dev+" ms")
+        main.log.report("Switch add - TCP-to-OFP latency: "+\
+                "Avg: "+str(latency_tcp_to_ofp_avg)+" ms "+
+                "Std Deviation: "+latency_tcp_to_ofp_std_dev+" ms")
+
+        if debug_mode == 'on':
+            main.ONOS1.cp_logs_to_dir("/opt/onos/log/karaf.log",
+                    "/tmp/", copy_file_name="sw_lat_karaf")
+
+        utilities.assert_equals(expect=main.TRUE, actual=assertion,
+                onpass="Switch latency test successful",
+                onfail="Switch latency test failed")
+
+    def CASE3(self, main):
+        '''
+        Bring port up / down and measure latency.
+        Port enable / disable is simulated by ifconfig up / down
+        
+        In ONOS-next, we must ensure that the port we are 
+        manipulating is connected to another switch with a valid
+        connection. Otherwise, graph view will not be updated.
+        '''
+        import time
+        import subprocess
+        import os
+        import requests
+        import json
+        import numpy
+
+        ONOS1_ip = main.params['CTRL']['ip1']
+        ONOS2_ip = main.params['CTRL']['ip2']
+        ONOS3_ip = main.params['CTRL']['ip3']
+        ONOS_user = main.params['CTRL']['user']
+
+        default_sw_port = main.params['CTRL']['port1']
+      
+        assertion = main.TRUE
+        #Number of iterations of case
+        num_iter = main.params['TEST']['numIter']
+       
+        #Timestamp 'keys' for json metrics output.
+        #These are subject to change, hence moved into params
+        deviceTimestamp = main.params['JSON']['deviceTimestamp']
+        graphTimestamp = main.params['JSON']['graphTimestamp']
+        
+        debug_mode = main.params['TEST']['debugMode']
+
+        local_time = time.strftime('%x %X')
+        local_time = local_time.replace("/","")
+        local_time = local_time.replace(" ","_")
+        local_time = local_time.replace(":","")
+        if debug_mode == 'on':
+            main.ONOS1.tshark_pcap("eth0",
+                    "/tmp/port_lat_pcap_"+local_time) 
+
+        #Threshold for this test case
+        up_threshold_str = main.params['TEST']['portUpThreshold']
+        down_threshold_str = main.params['TEST']['portDownThreshold']
+        
+        up_threshold_obj = up_threshold_str.split(",")
+        down_threshold_obj = down_threshold_str.split(",")
+
+        up_threshold_min = int(up_threshold_obj[0])
+        up_threshold_max = int(up_threshold_obj[1])
+
+        down_threshold_min = int(down_threshold_obj[0])
+        down_threshold_max = int(down_threshold_obj[1])
+
+        #NOTE: Some hardcoded variables you may need to configure
+        #      besides the params
+            
+        tshark_port_status = "OFP 130 Port Status"
+
+        tshark_port_up = "/tmp/tshark_port_up.txt"
+        tshark_port_down = "/tmp/tshark_port_down.txt"
+        interface_config = "s1-eth1"
+
+        main.log.report("Port enable / disable latency")
+        main.log.report("Simulated by ifconfig up / down")
+        main.log.report("Total iterations of test: "+str(num_iter))
+
+        main.step("Assign switches s1 and s2 to controller 1")
+        main.Mininet1.assign_sw_controller(sw="1",ip1=ONOS1_ip,
+                port1=default_sw_port)
+        main.Mininet1.assign_sw_controller(sw="2",ip1=ONOS1_ip,
+                port1=default_sw_port)
+
+        #Give enough time for metrics to propagate the 
+        #assign controller event. Otherwise, these events may
+        #carry over to our measurements
+        time.sleep(15)
+
+        port_up_device_to_ofp_list = []
+        port_up_graph_to_ofp_list = []
+        port_down_device_to_ofp_list = []
+        port_down_graph_to_ofp_list = []
+
+        for i in range(0, int(num_iter)):
+            main.step("Starting wireshark capture for port status down")
+            main.ONOS1.tshark_grep(tshark_port_status,
+                    tshark_port_down)
+            
+            time.sleep(5)
+
+            #Disable interface that is connected to switch 2
+            main.step("Disable port: "+interface_config)
+            main.Mininet1.handle.sendline("sh ifconfig "+
+                    interface_config+" down")
+            main.Mininet1.handle.expect("mininet>")
+
+            time.sleep(3)
+            main.ONOS1.tshark_stop()
+            
+            main.step("Obtain t1 by metrics call")
+            json_str_up_1 = main.ONOS1cli.topology_events_metrics()
+            json_str_up_2 = main.ONOS2cli.topology_events_metrics()
+            json_str_up_3 = main.ONOS3cli.topology_events_metrics()
+
+            json_obj_1 = json.loads(json_str_up_1)
+            json_obj_2 = json.loads(json_str_up_2)
+            json_obj_3 = json.loads(json_str_up_3)
+            
+            #Copy tshark output file from ONOS to TestON instance
+            #/tmp directory
+            os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
+                    tshark_port_down+" /tmp/")
+
+            f_port_down = open(tshark_port_down, 'r')
+            #Get first line of port down event from tshark
+            f_line = f_port_down.readline()
+            obj_down = f_line.split(" ")
+            if len(f_line) > 0:
+                timestamp_begin_pt_down = int(float(obj_down[1])*1000)
+                main.log.info("Port down begin timestamp: "+
+                        str(timestamp_begin_pt_down))
+            else:
+                main.log.info("Tshark output file returned unexpected"+
+                        " results: "+str(obj_down))
+                timestamp_begin_pt_down = 0
+            
+            f_port_down.close()
+
+            main.log.info("TEST tshark obj: "+str(obj_down))
+
+            time.sleep(3)
+
+            #Obtain graph timestamp. This timestsamp captures
+            #the epoch time at which the topology graph was updated.
+            graph_timestamp_1 = \
+                    json_obj_1[graphTimestamp]['value']
+            graph_timestamp_2 = \
+                    json_obj_2[graphTimestamp]['value']
+            graph_timestamp_3 = \
+                    json_obj_3[graphTimestamp]['value']
+
+            main.log.info("TEST graph timestamp ONOS1: "+
+                    str(graph_timestamp_1))
+
+            #Obtain device timestamp. This timestamp captures
+            #the epoch time at which the device event happened
+            device_timestamp_1 = \
+                    json_obj_1[deviceTimestamp]['value'] 
+            device_timestamp_2 = \
+                    json_obj_2[deviceTimestamp]['value'] 
+            device_timestamp_3 = \
+                    json_obj_3[deviceTimestamp]['value'] 
+
+            #Get delta between graph event and OFP 
+            pt_down_graph_to_ofp_1 = int(graph_timestamp_1) -\
+                    int(timestamp_begin_pt_down)
+            pt_down_graph_to_ofp_2 = int(graph_timestamp_2) -\
+                    int(timestamp_begin_pt_down)
+            pt_down_graph_to_ofp_3 = int(graph_timestamp_3) -\
+                    int(timestamp_begin_pt_down)
+
+            #Get delta between device event and OFP
+            pt_down_device_to_ofp_1 = int(device_timestamp_1) -\
+                    int(timestamp_begin_pt_down)
+            pt_down_device_to_ofp_2 = int(device_timestamp_2) -\
+                    int(timestamp_begin_pt_down)
+            pt_down_device_to_ofp_3 = int(device_timestamp_3) -\
+                    int(timestamp_begin_pt_down)
+       
+            #Caluclate average across clusters
+            pt_down_graph_to_ofp_avg =\
+                    (int(pt_down_graph_to_ofp_1) +
+                     int(pt_down_graph_to_ofp_2) + 
+                     int(pt_down_graph_to_ofp_3)) / 3
+            pt_down_device_to_ofp_avg = \
+                    (int(pt_down_device_to_ofp_1) + 
+                     int(pt_down_device_to_ofp_2) +
+                     int(pt_down_device_to_ofp_3)) / 3
+
+            if pt_down_graph_to_ofp_avg > down_threshold_min and \
+                    pt_down_graph_to_ofp_avg < down_threshold_max:
+                port_down_graph_to_ofp_list.append(
+                    pt_down_graph_to_ofp_avg)
+                main.log.info("Port down: graph to ofp avg: "+
+                    str(pt_down_graph_to_ofp_avg) + " ms")
+            else:
+                main.log.info("Average port down graph-to-ofp result" +
+                        " exceeded the threshold: "+
+                        str(pt_down_graph_to_ofp_avg))
+
+            if pt_down_device_to_ofp_avg > 0 and \
+                    pt_down_device_to_ofp_avg < 1000:
+                port_down_device_to_ofp_list.append(
+                    pt_down_device_to_ofp_avg)
+                main.log.info("Port down: device to ofp avg: "+
+                    str(pt_down_device_to_ofp_avg) + " ms")
+            else:
+                main.log.info("Average port down device-to-ofp result" +
+                        " exceeded the threshold: "+
+                        str(pt_down_device_to_ofp_avg))
+
+            #Port up events 
+            main.step("Enable port and obtain timestamp")
+            main.step("Starting wireshark capture for port status up")
+            main.ONOS1.tshark_grep(tshark_port_status, tshark_port_up)
+            time.sleep(5)
+
+            main.Mininet1.handle.sendline("sh ifconfig "+
+                    interface_config+" up")
+            main.Mininet1.handle.expect("mininet>")
+            
+            #Allow time for tshark to capture event
+            time.sleep(3)
+            main.ONOS1.tshark_stop()
+
+            #Obtain metrics shortly afterwards
+            #This timestsamp captures
+            #the epoch time at which the topology graph was updated.
+            main.step("Obtain t1 by REST call")
+            json_str_up_1 = main.ONOS1cli.topology_events_metrics()
+            json_str_up_2 = main.ONOS2cli.topology_events_metrics()
+            json_str_up_3 = main.ONOS3cli.topology_events_metrics()
+            
+            json_obj_1 = json.loads(json_str_up_1)
+            json_obj_2 = json.loads(json_str_up_2)
+            json_obj_3 = json.loads(json_str_up_3)
+
+            os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
+                    tshark_port_up+" /tmp/")
+
+            f_port_up = open(tshark_port_up, 'r')
+            f_line = f_port_up.readline()
+            obj_up = f_line.split(" ")
+            if len(f_line) > 0:
+                timestamp_begin_pt_up = int(float(obj_up[1])*1000)
+                main.log.info("Port up begin timestamp: "+
+                        str(timestamp_begin_pt_up))
+            else:
+                main.log.info("Tshark output file returned unexpected"+
+                        " results.")
+                timestamp_begin_pt_up = 0
+            
+            f_port_up.close()
+
+            graph_timestamp_1 = \
+                    json_obj_1[graphTimestamp]['value']
+            graph_timestamp_2 = \
+                    json_obj_2[graphTimestamp]['value']
+            graph_timestamp_3 = \
+                    json_obj_3[graphTimestamp]['value']
+
+            #Obtain device timestamp. This timestamp captures
+            #the epoch time at which the device event happened
+            device_timestamp_1 = \
+                    json_obj_1[deviceTimestamp]['value'] 
+            device_timestamp_2 = \
+                    json_obj_2[deviceTimestamp]['value'] 
+            device_timestamp_3 = \
+                    json_obj_3[deviceTimestamp]['value'] 
+
+            #Get delta between graph event and OFP 
+            pt_up_graph_to_ofp_1 = int(graph_timestamp_1) -\
+                    int(timestamp_begin_pt_up)
+            pt_up_graph_to_ofp_2 = int(graph_timestamp_2) -\
+                    int(timestamp_begin_pt_up)
+            pt_up_graph_to_ofp_3 = int(graph_timestamp_3) -\
+                    int(timestamp_begin_pt_up)
+
+            #Get delta between device event and OFP
+            pt_up_device_to_ofp_1 = int(device_timestamp_1) -\
+                    int(timestamp_begin_pt_up)
+            pt_up_device_to_ofp_2 = int(device_timestamp_2) -\
+                    int(timestamp_begin_pt_up)
+            pt_up_device_to_ofp_3 = int(device_timestamp_3) -\
+                    int(timestamp_begin_pt_up)
+
+            main.log.info("ONOS1 delta G2O: "+str(pt_up_graph_to_ofp_1))
+            main.log.info("ONOS2 delta G2O: "+str(pt_up_graph_to_ofp_2))
+            main.log.info("ONOS3 delta G2O: "+str(pt_up_graph_to_ofp_3))
+
+            main.log.info("ONOS1 delta D2O: "+str(pt_up_device_to_ofp_1))
+            main.log.info("ONOS2 delta D2O: "+str(pt_up_device_to_ofp_2)) 
+            main.log.info("ONOS3 delta D2O: "+str(pt_up_device_to_ofp_3)) 
+
+            pt_up_graph_to_ofp_avg = \
+                    (int(pt_up_graph_to_ofp_1) + 
+                     int(pt_up_graph_to_ofp_2) +
+                     int(pt_up_graph_to_ofp_3)) / 3
+
+            pt_up_device_to_ofp_avg = \
+                    (int(pt_up_device_to_ofp_1) + 
+                     int(pt_up_device_to_ofp_2) +
+                     int(pt_up_device_to_ofp_3)) / 3
+
+            if pt_up_graph_to_ofp_avg > up_threshold_min and \
+                    pt_up_graph_to_ofp_avg < up_threshold_max: 
+                port_up_graph_to_ofp_list.append(
+                        pt_up_graph_to_ofp_avg)
+                main.log.info("Port down: graph to ofp avg: "+
+                    str(pt_up_graph_to_ofp_avg) + " ms")
+            else:
+                main.log.info("Average port up graph-to-ofp result"+
+                        " exceeded the threshold: "+
+                        str(pt_up_graph_to_ofp_avg))
+            
+            if pt_up_device_to_ofp_avg > up_threshold_min and \
+                    pt_up_device_to_ofp_avg < up_threshold_max:
+                port_up_device_to_ofp_list.append(
+                        pt_up_device_to_ofp_avg)
+                main.log.info("Port up: device to ofp avg: "+
+                    str(pt_up_device_to_ofp_avg) + " ms")
+            else:
+                main.log.info("Average port up device-to-ofp result"+
+                        " exceeded the threshold: "+
+                        str(pt_up_device_to_ofp_avg))
+            
+            #END ITERATION FOR LOOP
+        
+        #Check all list for latency existence and set assertion
+        if (port_down_graph_to_ofp_list and port_down_device_to_ofp_list\
+           and port_up_graph_to_ofp_list and port_up_device_to_ofp_list):
+            assertion = main.TRUE
+
+        #Calculate and report latency measurements
+        port_down_graph_to_ofp_min = min(port_down_graph_to_ofp_list)
+        port_down_graph_to_ofp_max = max(port_down_graph_to_ofp_list)
+        port_down_graph_to_ofp_avg = \
+                (sum(port_down_graph_to_ofp_list) / 
+                 len(port_down_graph_to_ofp_list))
+        port_down_graph_to_ofp_std_dev = \
+                str(round(numpy.std(port_down_graph_to_ofp_list),1))
+        
+        main.log.report("Port down graph-to-ofp "+
+                "Avg: "+str(port_down_graph_to_ofp_avg)+" ms "+
+                "Std Deviation: "+port_down_graph_to_ofp_std_dev+" ms")
+        
+        port_down_device_to_ofp_min = min(port_down_device_to_ofp_list)
+        port_down_device_to_ofp_max = max(port_down_device_to_ofp_list)
+        port_down_device_to_ofp_avg = \
+                (sum(port_down_device_to_ofp_list) /\
+                 len(port_down_device_to_ofp_list))
+        port_down_device_to_ofp_std_dev = \
+                str(round(numpy.std(port_down_device_to_ofp_list),1))
+        
+        main.log.report("Port down device-to-ofp "+
+                "Avg: "+str(port_down_device_to_ofp_avg)+" ms "+
+                "Std Deviation: "+port_down_device_to_ofp_std_dev+" ms")
+        
+        port_up_graph_to_ofp_min = min(port_up_graph_to_ofp_list)
+        port_up_graph_to_ofp_max = max(port_up_graph_to_ofp_list)
+        port_up_graph_to_ofp_avg = \
+                (sum(port_up_graph_to_ofp_list) /\
+                 len(port_up_graph_to_ofp_list))
+        port_up_graph_to_ofp_std_dev = \
+                str(round(numpy.std(port_up_graph_to_ofp_list),1))
+        
+        main.log.report("Port up graph-to-ofp "+
+                "Avg: "+str(port_up_graph_to_ofp_avg)+" ms "+
+                "Std Deviation: "+port_up_graph_to_ofp_std_dev+" ms")
+          
+        port_up_device_to_ofp_min = min(port_up_device_to_ofp_list)
+        port_up_device_to_ofp_max = max(port_up_device_to_ofp_list)
+        port_up_device_to_ofp_avg = \
+                (sum(port_up_device_to_ofp_list) /\
+                 len(port_up_device_to_ofp_list))
+        port_up_device_to_ofp_std_dev = \
+                str(round(numpy.std(port_up_device_to_ofp_list),1))
+        
+        main.log.report("Port up device-to-ofp "+
+                "Avg: "+str(port_up_device_to_ofp_avg)+" ms "+
+                "Std Deviation: "+port_up_device_to_ofp_std_dev+" ms")
+
+        utilities.assert_equals(expect=main.TRUE, actual=assertion,
+                onpass="Port discovery latency calculation successful",
+                onfail="Port discovery test failed")
+
+    def CASE4(self, main):
+        '''
+        Link down event using loss rate 100%
+        
+        Important:
+            Use a simple 2 switch topology with 1 link between
+            the two switches. Ensure that mac addresses of the 
+            switches are 1 / 2 respectively
+        '''
+        import time
+        import subprocess
+        import os
+        import requests
+        import json
+        import numpy 
+    
+        ONOS1_ip = main.params['CTRL']['ip1']
+        ONOS2_ip = main.params['CTRL']['ip2']
+        ONOS3_ip = main.params['CTRL']['ip3']
+        ONOS_user = main.params['CTRL']['user']
+
+        default_sw_port = main.params['CTRL']['port1']
+       
+        #Number of iterations of case
+        num_iter = main.params['TEST']['numIter']
+       
+        #Timestamp 'keys' for json metrics output.
+        #These are subject to change, hence moved into params
+        deviceTimestamp = main.params['JSON']['deviceTimestamp']
+        linkTimestamp = main.params['JSON']['linkTimestamp'] 
+        graphTimestamp = main.params['JSON']['graphTimestamp']
+        
+        debug_mode = main.params['TEST']['debugMode']
+
+        local_time = time.strftime('%x %X')
+        local_time = local_time.replace("/","")
+        local_time = local_time.replace(" ","_")
+        local_time = local_time.replace(":","")
+        if debug_mode == 'on':
+            main.ONOS1.tshark_pcap("eth0",
+                    "/tmp/link_lat_pcap_"+local_time) 
+
+        #Threshold for this test case
+        up_threshold_str = main.params['TEST']['linkUpThreshold']
+        down_threshold_str = main.params['TEST']['linkDownThreshold']
+
+        up_threshold_obj = up_threshold_str.split(",")
+        down_threshold_obj = down_threshold_str.split(",")
+
+        up_threshold_min = int(up_threshold_obj[0])
+        up_threshold_max = int(up_threshold_obj[1])
+
+        down_threshold_min = int(down_threshold_obj[0])
+        down_threshold_max = int(down_threshold_obj[1])
+
+        assertion = main.TRUE
+        #Link event timestamp to system time list
+        link_down_link_to_system_list = []
+        link_up_link_to_system_list = []
+        #Graph event timestamp to system time list
+        link_down_graph_to_system_list = []
+        link_up_graph_to_system_list = [] 
+
+        main.log.report("Link up / down discovery latency between "+
+                "two switches")
+        main.log.report("Simulated by setting loss-rate 100%")
+        main.log.report("'tc qdisc add dev <intfs> root netem loss 100%'") 
+        main.log.report("Total iterations of test: "+str(num_iter))
+
+        main.step("Assign all switches")
+        main.Mininet1.assign_sw_controller(sw="1",
+                ip1=ONOS1_ip, port1=default_sw_port)
+        main.Mininet1.assign_sw_controller(sw="2",
+                ip1=ONOS1_ip, port1=default_sw_port)
+
+        main.step("Verifying switch assignment")
+        result_s1 = main.Mininet1.get_sw_controller(sw="s1")
+        result_s2 = main.Mininet1.get_sw_controller(sw="s2")
+          
+        #Allow time for events to finish before taking measurements
+        time.sleep(10)
+
+        link_down1 = False
+        link_down2 = False
+        link_down3 = False
+        #Start iteration of link event test
+        for i in range(0, int(num_iter)):
+            main.step("Getting initial system time as t0")
+        
+            #System time in epoch ms
+            timestamp_link_down_t0 = time.time() * 1000
+            #Link down is simulated by 100% loss rate using traffic 
+            #control command
+            main.Mininet1.handle.sendline(
+                    "sh tc qdisc add dev s1-eth1 root netem loss 100%")
+
+            #TODO: Iterate through 'links' command to verify that
+            #      link s1 -> s2 went down (loop timeout 30 seconds) 
+            #      on all 3 ONOS instances
+            main.log.info("Checking ONOS for link update")
+            loop_count = 0
+            while( not (link_down1 and link_down2 and link_down3)\
+                    and loop_count < 30 ):
+                json_str1 = main.ONOS1cli.links()
+                json_str2 = main.ONOS2cli.links()
+                json_str3 = main.ONOS3cli.links()
+                
+                if not (json_str1 and json_str2 and json_str3):
+                    main.log.error("CLI command returned error ")
+                    break
+                else:
+                    json_obj1 = json.loads(json_str1)
+                    json_obj2 = json.loads(json_str2)
+                    json_obj3 = json.loads(json_str3)
+                for obj1 in json_obj1:
+                    if '01' not in obj1['src']['device']:
+                        link_down1 = True
+                        main.log.info("Link down from "+
+                                "s1 -> s2 on ONOS1 detected")
+                for obj2 in json_obj2:
+                    if '01' not in obj2['src']['device']:
+                        link_down2 = True
+                        main.log.info("Link down from "+
+                                "s1 -> s2 on ONOS2 detected")
+                for obj3 in json_obj3:
+                    if '01' not in obj3['src']['device']:
+                        link_down3 = True
+                        main.log.info("Link down from "+
+                                "s1 -> s2 on ONOS3 detected")
+                
+                loop_count += 1
+                #If CLI doesn't like the continuous requests
+                #and exits in this loop, increase the sleep here.
+                #Consequently, while loop timeout will increase
+                time.sleep(1)
+    
+            #Give time for metrics measurement to catch up
+            #NOTE: May need to be configured more accurately
+            time.sleep(10)
+            #If we exited the while loop and link down 1,2,3 are still 
+            #false, then ONOS has failed to discover link down event
+            if not (link_down1 and link_down2 and link_down3):
+                main.log.info("Link down discovery failed")
+                
+                link_down_lat_graph1 = 0
+                link_down_lat_graph2 = 0
+                link_down_lat_graph3 = 0
+                link_down_lat_device1 = 0
+                link_down_lat_device2 = 0
+                link_down_lat_device3 = 0
+                
+                assertion = main.FALSE
+            else:
+                json_topo_metrics_1 =\
+                        main.ONOS1cli.topology_events_metrics()
+                json_topo_metrics_2 =\
+                        main.ONOS2cli.topology_events_metrics()
+                json_topo_metrics_3 =\
+                        main.ONOS3cli.topology_events_metrics()
+                json_topo_metrics_1 = json.loads(json_topo_metrics_1)
+                json_topo_metrics_2 = json.loads(json_topo_metrics_2)
+                json_topo_metrics_3 = json.loads(json_topo_metrics_3)
+
+                main.log.info("Obtaining graph and device timestamp")
+                graph_timestamp_1 = \
+                    json_topo_metrics_1[graphTimestamp]['value']
+                graph_timestamp_2 = \
+                    json_topo_metrics_2[graphTimestamp]['value']
+                graph_timestamp_3 = \
+                    json_topo_metrics_3[graphTimestamp]['value']
+
+                link_timestamp_1 = \
+                    json_topo_metrics_1[linkTimestamp]['value']
+                link_timestamp_2 = \
+                    json_topo_metrics_2[linkTimestamp]['value']
+                link_timestamp_3 = \
+                    json_topo_metrics_3[linkTimestamp]['value']
+
+                if graph_timestamp_1 and graph_timestamp_2 and\
+                        graph_timestamp_3 and link_timestamp_1 and\
+                        link_timestamp_2 and link_timestamp_3:
+                    link_down_lat_graph1 = int(graph_timestamp_1) -\
+                            int(timestamp_link_down_t0)
+                    link_down_lat_graph2 = int(graph_timestamp_2) -\
+                            int(timestamp_link_down_t0)
+                    link_down_lat_graph3 = int(graph_timestamp_3) -\
+                            int(timestamp_link_down_t0)
+                
+                    link_down_lat_link1 = int(link_timestamp_1) -\
+                            int(timestamp_link_down_t0)
+                    link_down_lat_link2 = int(link_timestamp_2) -\
+                            int(timestamp_link_down_t0)
+                    link_down_lat_link3 = int(link_timestamp_3) -\
+                            int(timestamp_link_down_t0)
+                else:
+                    main.log.error("There was an error calculating"+
+                        " the delta for link down event")
+                    link_down_lat_graph1 = 0
+                    link_down_lat_graph2 = 0
+                    link_down_lat_graph3 = 0
+                    
+                    link_down_lat_device1 = 0
+                    link_down_lat_device2 = 0
+                    link_down_lat_device3 = 0
+        
+            main.log.info("Link down latency ONOS1 iteration "+
+                    str(i)+" (end-to-end): "+
+                    str(link_down_lat_graph1)+" ms")
+            main.log.info("Link down latency ONOS2 iteration "+
+                    str(i)+" (end-to-end): "+
+                    str(link_down_lat_graph2)+" ms")
+            main.log.info("Link down latency ONOS3 iteration "+
+                    str(i)+" (end-to-end): "+
+                    str(link_down_lat_graph3)+" ms")
+            
+            main.log.info("Link down latency ONOS1 iteration "+
+                    str(i)+" (link-event-to-system-timestamp): "+
+                    str(link_down_lat_link1)+" ms")
+            main.log.info("Link down latency ONOS2 iteration "+
+                    str(i)+" (link-event-to-system-timestamp): "+
+                    str(link_down_lat_link2)+" ms")
+            main.log.info("Link down latency ONOS3 iteration "+
+                    str(i)+" (link-event-to-system-timestamp): "+
+                    str(link_down_lat_link3))
+      
+            #Calculate avg of node calculations
+            link_down_lat_graph_avg =\
+                    (link_down_lat_graph1 +
+                     link_down_lat_graph2 +
+                     link_down_lat_graph3) / 3
+            link_down_lat_link_avg =\
+                    (link_down_lat_link1 +
+                     link_down_lat_link2 +
+                     link_down_lat_link3) / 3
+
+            #Set threshold and append latency to list
+            if link_down_lat_graph_avg > down_threshold_min and\
+               link_down_lat_graph_avg < down_threshold_max:
+                link_down_graph_to_system_list.append(
+                        link_down_lat_graph_avg)
+            else:
+                main.log.info("Link down latency exceeded threshold")
+                main.log.info("Results for iteration "+str(i)+
+                        "have been omitted")
+            if link_down_lat_link_avg > down_threshold_min and\
+               link_down_lat_link_avg < down_threshold_max:
+                link_down_link_to_system_list.append(
+                        link_down_lat_link_avg)
+            else:
+                main.log.info("Link down latency exceeded threshold")
+                main.log.info("Results for iteration "+str(i)+
+                        "have been omitted")
+
+            #NOTE: To remove loss rate and measure latency:
+            #       'sh tc qdisc del dev s1-eth1 root'
+            timestamp_link_up_t0 = time.time() * 1000
+            main.Mininet1.handle.sendline("sh tc qdisc del dev "+
+                    "s1-eth1 root")
+            main.Mininet1.handle.expect("mininet>")
+            
+            main.log.info("Checking ONOS for link update")
+            
+            link_down1 = True
+            link_down2 = True
+            link_down3 = True
+            loop_count = 0
+            while( (link_down1 and link_down2 and link_down3)\
+                    and loop_count < 30 ):
+                json_str1 = main.ONOS1cli.links()
+                json_str2 = main.ONOS2cli.links()
+                json_str3 = main.ONOS3cli.links()
+                if not (json_str1 and json_str2 and json_str3):
+                    main.log.error("CLI command returned error ")
+                    break
+                else:
+                    json_obj1 = json.loads(json_str1)
+                    json_obj2 = json.loads(json_str2)
+                    json_obj3 = json.loads(json_str3)
+                
+                for obj1 in json_obj1:
+                    if '01' in obj1['src']['device']:
+                        link_down1 = False 
+                        main.log.info("Link up from "+
+                            "s1 -> s2 on ONOS1 detected")
+                for obj2 in json_obj2:
+                    if '01' in obj2['src']['device']:
+                        link_down2 = False 
+                        main.log.info("Link up from "+
+                            "s1 -> s2 on ONOS2 detected")
+                for obj3 in json_obj3:
+                    if '01' in obj3['src']['device']:
+                        link_down3 = False 
+                        main.log.info("Link up from "+
+                            "s1 -> s2 on ONOS3 detected")
+                
+                loop_count += 1
+                time.sleep(1)
+            
+            if (link_down1 and link_down2 and link_down3):
+                main.log.info("Link up discovery failed")
+                
+                link_up_lat_graph1 = 0
+                link_up_lat_graph2 = 0
+                link_up_lat_graph3 = 0
+                link_up_lat_device1 = 0
+                link_up_lat_device2 = 0
+                link_up_lat_device3 = 0
+                
+                assertion = main.FALSE
+            else:
+                json_topo_metrics_1 =\
+                        main.ONOS1cli.topology_events_metrics()
+                json_topo_metrics_2 =\
+                        main.ONOS2cli.topology_events_metrics()
+                json_topo_metrics_3 =\
+                        main.ONOS3cli.topology_events_metrics()
+                json_topo_metrics_1 = json.loads(json_topo_metrics_1)
+                json_topo_metrics_2 = json.loads(json_topo_metrics_2)
+                json_topo_metrics_3 = json.loads(json_topo_metrics_3)
+
+                main.log.info("Obtaining graph and device timestamp")
+                graph_timestamp_1 = \
+                    json_topo_metrics_1[graphTimestamp]['value']
+                graph_timestamp_2 = \
+                    json_topo_metrics_2[graphTimestamp]['value']
+                graph_timestamp_3 = \
+                    json_topo_metrics_3[graphTimestamp]['value']
+
+                link_timestamp_1 = \
+                    json_topo_metrics_1[linkTimestamp]['value']
+                link_timestamp_2 = \
+                    json_topo_metrics_2[linkTimestamp]['value']
+                link_timestamp_3 = \
+                    json_topo_metrics_3[linkTimestamp]['value']
+
+                if graph_timestamp_1 and graph_timestamp_2 and\
+                        graph_timestamp_3 and link_timestamp_1 and\
+                        link_timestamp_2 and link_timestamp_3:
+                    link_up_lat_graph1 = int(graph_timestamp_1) -\
+                            int(timestamp_link_up_t0)
+                    link_up_lat_graph2 = int(graph_timestamp_2) -\
+                            int(timestamp_link_up_t0)
+                    link_up_lat_graph3 = int(graph_timestamp_3) -\
+                            int(timestamp_link_up_t0)
+                
+                    link_up_lat_link1 = int(link_timestamp_1) -\
+                            int(timestamp_link_up_t0)
+                    link_up_lat_link2 = int(link_timestamp_2) -\
+                            int(timestamp_link_up_t0)
+                    link_up_lat_link3 = int(link_timestamp_3) -\
+                            int(timestamp_link_up_t0)
+                else:
+                    main.log.error("There was an error calculating"+
+                        " the delta for link down event")
+                    link_up_lat_graph1 = 0
+                    link_up_lat_graph2 = 0
+                    link_up_lat_graph3 = 0
+                    
+                    link_up_lat_device1 = 0
+                    link_up_lat_device2 = 0
+                    link_up_lat_device3 = 0
+       
+            if debug_mode == 'on':
+                main.log.info("Link up latency ONOS1 iteration "+
+                    str(i)+" (end-to-end): "+
+                    str(link_up_lat_graph1)+" ms")
+                main.log.info("Link up latency ONOS2 iteration "+
+                    str(i)+" (end-to-end): "+
+                    str(link_up_lat_graph2)+" ms")
+                main.log.info("Link up latency ONOS3 iteration "+
+                    str(i)+" (end-to-end): "+
+                    str(link_up_lat_graph3)+" ms")
+            
+                main.log.info("Link up latency ONOS1 iteration "+
+                    str(i)+" (link-event-to-system-timestamp): "+
+                    str(link_up_lat_link1)+" ms")
+                main.log.info("Link up latency ONOS2 iteration "+
+                    str(i)+" (link-event-to-system-timestamp): "+
+                    str(link_up_lat_link2)+" ms")
+                main.log.info("Link up latency ONOS3 iteration "+
+                    str(i)+" (link-event-to-system-timestamp): "+
+                    str(link_up_lat_link3))
+      
+            #Calculate avg of node calculations
+            link_up_lat_graph_avg =\
+                    (link_up_lat_graph1 +
+                     link_up_lat_graph2 +
+                     link_up_lat_graph3) / 3
+            link_up_lat_link_avg =\
+                    (link_up_lat_link1 +
+                     link_up_lat_link2 +
+                     link_up_lat_link3) / 3
+
+            #Set threshold and append latency to list
+            if link_up_lat_graph_avg > up_threshold_min and\
+               link_up_lat_graph_avg < up_threshold_max:
+                link_up_graph_to_system_list.append(
+                        link_up_lat_graph_avg)
+            else:
+                main.log.info("Link up latency exceeded threshold")
+                main.log.info("Results for iteration "+str(i)+
+                        "have been omitted")
+            if link_up_lat_link_avg > up_threshold_min and\
+               link_up_lat_link_avg < up_threshold_max:
+                link_up_link_to_system_list.append(
+                        link_up_lat_link_avg)
+            else:
+                main.log.info("Link up latency exceeded threshold")
+                main.log.info("Results for iteration "+str(i)+
+                        "have been omitted")
+
+        #Calculate min, max, avg of list and report
+        link_down_min = min(link_down_graph_to_system_list)
+        link_down_max = max(link_down_graph_to_system_list)
+        link_down_avg = sum(link_down_graph_to_system_list) / \
+                        len(link_down_graph_to_system_list)
+        link_up_min = min(link_up_graph_to_system_list)
+        link_up_max = max(link_up_graph_to_system_list)
+        link_up_avg = sum(link_up_graph_to_system_list) / \
+                        len(link_up_graph_to_system_list)
+        link_down_std_dev = \
+                str(round(numpy.std(link_down_graph_to_system_list),1))
+        link_up_std_dev = \
+                str(round(numpy.std(link_up_graph_to_system_list),1))
+
+        main.log.report("Link down latency " +
+                "Avg: "+str(link_down_avg)+" ms "+
+                "Std Deviation: "+link_down_std_dev+" ms")
+        main.log.report("Link up latency "+
+                "Avg: "+str(link_up_avg)+" ms "+
+                "Std Deviation: "+link_up_std_dev+" ms")
+
+        utilities.assert_equals(expect=main.TRUE, actual=assertion,
+                onpass="Link discovery latency calculation successful",
+                onfail="Link discovery latency case failed")
+
+    def CASE5(self, main):
+        '''
+        100 Switch discovery latency
+
+        Important:
+            This test case can be potentially dangerous if 
+            your machine has previously set iptables rules.
+            One of the steps of the test case will flush
+            all existing iptables rules.
+        Note:
+            You can specify the number of switches in the 
+            params file to adjust the switch discovery size
+            (and specify the corresponding topology in Mininet1 
+            .topo file)
+        '''
+        import time
+        import subprocess
+        import os
+        import requests
+        import json
+
+        ONOS1_ip = main.params['CTRL']['ip1']
+        ONOS2_ip = main.params['CTRL']['ip2']
+        ONOS3_ip = main.params['CTRL']['ip3']
+        MN1_ip = main.params['MN']['ip1']
+        ONOS_user = main.params['CTRL']['user']
+
+        default_sw_port = main.params['CTRL']['port1']
+       
+        #Number of iterations of case
+        num_iter = main.params['TEST']['numIter']
+        num_sw = main.params['TEST']['numSwitch']
+
+        #Timestamp 'keys' for json metrics output.
+        #These are subject to change, hence moved into params
+        deviceTimestamp = main.params['JSON']['deviceTimestamp']
+        graphTimestamp = main.params['JSON']['graphTimestamp']
+        
+        debug_mode = main.params['TEST']['debugMode']
+
+        local_time = time.strftime('%X')
+        local_time = local_time.replace("/","")
+        local_time = local_time.replace(" ","_")
+        local_time = local_time.replace(":","")
+        if debug_mode == 'on':
+            main.ONOS1.tshark_pcap("eth0",
+                    "/tmp/100_sw_lat_pcap_"+local_time) 
+ 
+        #Threshold for this test case
+        sw_disc_threshold_str = main.params['TEST']['swDisc100Threshold']
+        sw_disc_threshold_obj = sw_disc_threshold_str.split(",")
+        sw_disc_threshold_min = int(sw_disc_threshold_obj[0])
+        sw_disc_threshold_max = int(sw_disc_threshold_obj[1])
+
+        tshark_ofp_output = "/tmp/tshark_ofp_"+num_sw+"sw.txt"
+        tshark_tcp_output = "/tmp/tshark_tcp_"+num_sw+"sw.txt"
+
+        tshark_ofp_result_list = []
+        tshark_tcp_result_list = []
+
+        sw_discovery_lat_list = []
+
+        main.case(num_sw+" Switch discovery latency")
+        main.step("Assigning all switches to ONOS1")
+        for i in range(1, int(num_sw)+1):
+            main.Mininet1.assign_sw_controller(
+                    sw=str(i),
+                    ip1=ONOS1_ip,
+                    port1=default_sw_port)
+        
+        #Ensure that nodes are configured with ptpd
+        #Just a warning message
+        main.log.info("Please check ptpd configuration to ensure"+\
+                " All nodes' system times are in sync")
+        time.sleep(5)
+
+        for i in range(0, int(num_iter)):
+            
+            main.step("Set iptables rule to block incoming sw connections")
+            #Set iptables rule to block incoming switch connections
+            #The rule description is as follows:
+            #   Append to INPUT rule,
+            #   behavior DROP that matches following:
+            #       * packet type: tcp
+            #       * source IP: MN1_ip
+            #       * destination PORT: 6633
+            main.ONOS1.handle.sendline(
+                    "sudo iptables -A INPUT -p tcp -s "+MN1_ip+
+                    " --dport "+default_sw_port+" -j DROP")
+            main.ONOS1.handle.expect("\$") 
+            #   Append to OUTPUT rule, 
+            #   behavior DROP that matches following:
+            #       * packet type: tcp
+            #       * source IP: MN1_ip
+            #       * destination PORT: 6633
+            main.ONOS1.handle.sendline(
+                    "sudo iptables -A OUTPUT -p tcp -s "+MN1_ip+
+                    " --dport "+default_sw_port+" -j DROP")
+            main.ONOS1.handle.expect("\$")
+            #Give time to allow rule to take effect
+            #NOTE: Sleep period may need to be configured 
+            #      based on the number of switches in the topology
+            main.log.info("Please wait for switch connection to "+
+                    "time out")
+            time.sleep(60)
+            
+            #Gather vendor OFP with tshark
+            main.ONOS1.tshark_grep("OFP 86 Vendor", 
+                    tshark_ofp_output)
+            main.ONOS1.tshark_grep("TCP 74 ",
+                    tshark_tcp_output)
+
+            #NOTE: Remove all iptables rule quickly (flush)
+            #      Before removal, obtain TestON timestamp at which 
+            #      removal took place
+            #      (ensuring nodes are configured via ptp)
+            #      sudo iptables -F
+            
+            t0_system = time.time() * 1000
+            main.ONOS1.handle.sendline(
+                    "sudo iptables -F")
+
+            #Counter to track loop count
+            counter_loop = 0
+            counter_avail1 = 0
+            counter_avail2 = 0
+            counter_avail3 = 0
+            onos1_dev = False
+            onos2_dev = False
+            onos3_dev = False
+            while counter_loop < 60:
+                #Continue to check devices for all device 
+                #availability. When all devices in all 3
+                #ONOS instances indicate that devices are available
+                #obtain graph event timestamp for t1.
+                device_str_obj1 = main.ONOS1cli.devices()
+                device_str_obj2 = main.ONOS2cli.devices()
+                device_str_obj3 = main.ONOS3cli.devices()
+
+                device_json1 = json.loads(device_str_obj1)                
+                device_json2 = json.loads(device_str_obj2)                
+                device_json3 = json.loads(device_str_obj3)           
+                
+                for device1 in device_json1:
+                    if device1['available'] == True:
+                        counter_avail1 += 1
+                        if counter_avail1 == int(num_sw):
+                            onos1_dev = True
+                            main.log.info("All devices have been "+
+                                    "discovered on ONOS1")
+                    else:
+                        counter_avail1 = 0
+                for device2 in device_json2:
+                    if device2['available'] == True:
+                        counter_avail2 += 1
+                        if counter_avail2 == int(num_sw):
+                            onos2_dev = True
+                            main.log.info("All devices have been "+
+                                    "discovered on ONOS2")
+                    else:
+                        counter_avail2 = 0
+                for device3 in device_json3:
+                    if device3['available'] == True:
+                        counter_avail3 += 1
+                        if counter_avail3 == int(num_sw):
+                            onos3_dev = True
+                            main.log.info("All devices have been "+
+                                    "discovered on ONOS3")
+                    else:
+                        counter_avail3 = 0
+
+                if onos1_dev and onos2_dev and onos3_dev:
+                    main.log.info("All devices have been discovered "+
+                            "on all ONOS instances")
+                    json_str_topology_metrics_1 =\
+                        main.ONOS1cli.topology_events_metrics()
+                    json_str_topology_metrics_2 =\
+                        main.ONOS2cli.topology_events_metrics()
+                    json_str_topology_metrics_3 =\
+                        main.ONOS3cli.topology_events_metrics()
+                   
+                    #Exit while loop if all devices discovered
+                    break 
+                
+                counter_loop += 1
+                #Give some time in between CLI calls
+                #(will not affect measurement)
+                time.sleep(3)
+
+            main.ONOS1.tshark_stop()
+            
+            os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
+                    tshark_ofp_output+" /tmp/") 
+            os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
+                    tshark_tcp_output+" /tmp/")
+
+            #TODO: Automate OFP output analysis
+            #Debug mode - print out packets captured at runtime     
+            if debug_mode == 'on': 
+                ofp_file = open(tshark_ofp_output, 'r')
+                main.log.info("Tshark OFP Vendor output: ")
+                for line in ofp_file:
+                    tshark_ofp_result_list.append(line)
+                    main.log.info(line)
+                ofp_file.close()
+
+                tcp_file = open(tshark_tcp_output, 'r')
+                main.log.info("Tshark TCP 74 output: ")
+                for line in tcp_file:
+                    tshark_tcp_result_list.append(line)
+                    main.log.info(line)
+                tcp_file.close()
+
+            json_obj_1 = json.loads(json_str_topology_metrics_1)
+            json_obj_2 = json.loads(json_str_topology_metrics_2)
+            json_obj_3 = json.loads(json_str_topology_metrics_3)
+
+            graph_timestamp_1 = \
+                    json_obj_1[graphTimestamp]['value']
+            graph_timestamp_2 = \
+                    json_obj_2[graphTimestamp]['value']
+            graph_timestamp_3 = \
+                    json_obj_3[graphTimestamp]['value']
+
+            graph_lat_1 = int(graph_timestamp_1) - int(t0_system)
+            graph_lat_2 = int(graph_timestamp_2) - int(t0_system)
+            graph_lat_3 = int(graph_timestamp_3) - int(t0_system)
+
+            avg_graph_lat = \
+                    (int(graph_lat_1) +\
+                     int(graph_lat_2) +\
+                     int(graph_lat_3)) / 3
+    
+            if avg_graph_lat > sw_disc_threshold_min \
+                    and avg_graph_lat < sw_disc_threshold_max:
+                sw_discovery_lat_list.append(
+                        avg_graph_lat)
+            else:
+                main.log.info("100 Switch discovery latency "+
+                        "exceeded the threshold.")
+            
+            #END ITERATION FOR LOOP
+
+        sw_lat_min = min(sw_discovery_lat_list)
+        sw_lat_max = max(sw_discovery_lat_list)
+        sw_lat_avg = sum(sw_discovery_lat_list) /\
+                     len(sw_discovery_lat_list)
+
+        main.log.report("100 Switch discovery lat "+\
+                "Min: "+str(sw_lat_min)+" ms"+\
+                "Max: "+str(sw_lat_max)+" ms"+\
+                "Avg: "+str(sw_lat_avg)+" ms")
+
+    def CASE6(self, main):
+        '''
+        Increase number of nodes and initiate CLI
+        '''
+        import time
+        
+        ONOS1_ip = main.params['CTRL']['ip1']
+        ONOS2_ip = main.params['CTRL']['ip2']
+        ONOS3_ip = main.params['CTRL']['ip3']
+        ONOS4_ip = main.params['CTRL']['ip4']
+        ONOS5_ip = main.params['CTRL']['ip5']
+        ONOS6_ip = main.params['CTRL']['ip6']
+        ONOS7_ip = main.params['CTRL']['ip7']
+
+        cell_name = main.params['ENV']['cellName']
+    
+        global cluster_count
+        
+        #Cluster size increased everytime the case is defined
+        cluster_count += 2 
+
+        main.log.report("Increasing cluster size to "+
+                str(cluster_count))
+
+        install_result = main.FALSE
+        if cluster_count == 5:
+            main.log.info("Installing nodes 4 and 5")
+            node4_result = \
+                main.ONOSbench.onos_install(node=ONOS4_ip)
+            node5_result = \
+                main.ONOSbench.onos_install(node=ONOS5_ip)
+            install_result = node4_result and node5_result
+
+            time.sleep(5)
+
+            main.ONOS4cli.start_onos_cli(ONOS4_ip)
+            main.ONOS5cli.start_onos_cli(ONOS5_ip)
+
+        elif cluster_count == 7:
+            main.log.info("Installing nodes 4 and 5")
+            node6_result = \
+                main.ONOSbench.onos_install(node=ONOS6_ip)
+            node7_result = \
+                main.ONOSbench.onos_install(node=ONOS7_ip)
+            install_result = node6_result and node7_result
+
+            time.sleep(5)
+
+            main.ONOS6cli.start_onos_cli(ONOS6_ip)
+            main.ONOS7cli.start_onos_cli(ONOS7_ip)
+
+
+
+
diff --git a/TestON/tests/TopoPerfNext/TopoPerfNext.params b/TestON/tests/TopoPerfNext/TopoPerfNext.params
index 851522c..dc2d519 100644
--- a/TestON/tests/TopoPerfNext/TopoPerfNext.params
+++ b/TestON/tests/TopoPerfNext/TopoPerfNext.params
@@ -1,5 +1,5 @@
 <PARAMS>
-    <testcases>1,2,3</testcases>
+    <testcases>1,2,3,6,2,3,6,2,3,6,2,3</testcases>
 
     <ENV>
         <cellName>topo_perf_test</cellName>
@@ -19,6 +19,11 @@
         <port2>6633</port2>
         <ip3>10.128.174.3</ip3>
         <port3>6633</port3>
+        <ip4>10.128.174.4</ip4>
+        
+        <ip5>10.128.174.5</ip5>
+        <ip6>10.128.174.6</ip6>
+        <ip7>10.128.174.7</ip7>
     </CTRL>
 
     <MN>
@@ -37,16 +42,17 @@
         #pcap file located at /tmp/'capture_name'
         <debugMode>off</debugMode>
         <onosLogFile>/opt/onos/log/karaf*</onosLogFile>
+        <mci>off</mci>
 
-        <topo_config_file>
+        <topoConfigFile>
         single_topo_event_accumulator.cfg
-        </topo_config_file>
-        <topo_config_name>
+        </topoConfigFile>
+        <topoConfigName>
         org.onlab.onos.net.topology.impl.DefaultTopologyProvider.cfg
-        </topo_config_name>
+        </topoConfigName>
 
         #Number of times to iterate each case
-        <numIter>20</numIter>
+        <numIter>10</numIter>
         <numSwitch>2</numSwitch>
         #Number of iterations to ignore initially
         <iterIgnore>2</iterIgnore>
@@ -61,6 +67,16 @@
         <tabletFile>tablets_3node.json</tabletFile>
    </TEST>
 
+    <DB>
+        <postToDB>on</postToDB>
+        <portEventResultPath>
+        /home/admin/ONLabTest/TestON/tests/TopoPerfNext/portEventResultDb.log
+        </portEventResultPath>
+        <switchEventResultPath>
+        /home/admin/ONLabTest/TestON/tests/TopoPerfNext/switchEventResultDb.log
+        </switchEventResultPath>
+    </DB>
+
     <JSON>
         <deviceTimestamp>topologyDeviceEventTimestamp</deviceTimestamp>
         <hostTimestamp>topologyHostEventTimestamp</hostTimestamp>
diff --git a/TestON/tests/TopoPerfNext/TopoPerfNext.py b/TestON/tests/TopoPerfNext/TopoPerfNext.py
index 87d7378..0f37909 100644
--- a/TestON/tests/TopoPerfNext/TopoPerfNext.py
+++ b/TestON/tests/TopoPerfNext/TopoPerfNext.py
@@ -25,106 +25,134 @@
         """
         import time
 
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
+        # Global cluster count for scale-out purposes
+        global clusterCount
+        #TODO: fix run number implementation
+        global runNum 
+        global timeToPost
 
-        git_pull = main.params[ 'GIT' ][ 'autoPull' ]
-        checkout_branch = main.params[ 'GIT' ][ 'checkout' ]
+        #Test run time
+        timeToPost = time.strftime("%Y-%m-%d %H:%M:%S")
+        # Set initial cluster count
+        clusterCount = 1
+        ##
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
+        runNum = time.strftime("%d%H%M%S")
 
-        #### Hardcoded ONOS nodes particular to my env ####
-        ONOS4_ip = "10.128.174.4"
-        ONOS5_ip = "10.128.174.5"
-        ONOS6_ip = "10.128.174.6"
-        ONOS7_ip = "10.128.174.7"
-        #### ####
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
 
-        MN1_ip = main.params[ 'MN' ][ 'ip1' ]
-        BENCH_ip = main.params[ 'BENCH' ][ 'ip' ]
+        gitPull = main.params[ 'GIT' ][ 'autoPull' ]
+        checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
 
-        topo_cfg_file = main.params[ 'TEST' ][ 'topo_config_file' ]
-        topo_cfg_name = main.params[ 'TEST' ][ 'topo_config_name' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ] 
+        ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ] 
 
+        MN1Ip = main.params[ 'MN' ][ 'ip1' ]
+        BENCHIp = main.params[ 'BENCH' ][ 'ip' ]
+
+        topoCfgFile = main.params[ 'TEST' ][ 'topoConfigFile' ]
+        topoCfgName = main.params[ 'TEST' ][ 'topoConfigName' ]
+
+        portEventResultPath = main.params[ 'DB' ][ 'portEventResultPath' ]
+        switchEventResultPath = main.params[ 'DB' ][ 'switchEventResultPath' ]
+
+        mvnCleanInstall = main.params[ 'TEST' ][ 'mci' ]
+        
         main.case( "Setting up test environment" )
         main.log.info( "Copying topology event accumulator config" +
                        " to ONOS /package/etc" )
         main.ONOSbench.handle.sendline( "cp ~/" +
-                                        topo_cfg_file +
+                                        topoCfgFile +
                                         " ~/ONOS/tools/package/etc/" +
-                                        topo_cfg_name )
+                                        topoCfgName )
         main.ONOSbench.handle.expect( "\$" )
 
         main.log.report( "Setting up test environment" )
 
-        main.step( "Cleaning previously installed ONOS if any" )
-        main.ONOSbench.onos_uninstall( node_ip=ONOS4_ip )
-        main.ONOSbench.onos_uninstall( node_ip=ONOS5_ip )
-        main.ONOSbench.onos_uninstall( node_ip=ONOS6_ip )
-        main.ONOSbench.onos_uninstall( node_ip=ONOS7_ip )
+        main.step( "Starting mininet topology " )
+        main.Mininet1.startNet()
 
+        main.step( "Cleaning previously installed ONOS if any" )
+        main.ONOSbench.onosUninstall( nodeIp=ONOS2Ip )
+        main.ONOSbench.onosUninstall( nodeIp=ONOS3Ip )
+        main.ONOSbench.onosUninstall( nodeIp=ONOS4Ip )
+        main.ONOSbench.onosUninstall( nodeIp=ONOS5Ip )
+        main.ONOSbench.onosUninstall( nodeIp=ONOS6Ip )
+        main.ONOSbench.onosUninstall( nodeIp=ONOS7Ip )
+
+        main.step( "Clearing previous DB log files" )
+        fPortLog = open(portEventResultPath, 'w')
+        fPortLog.write('')
+        fPortLog.close()
+        fSwitchLog = open(switchEventResultPath, 'w')
+        fSwitchLog.write('')
+        fSwitchLog.close()
+        
         main.step( "Creating cell file" )
-        cell_file_result = main.ONOSbench.create_cell_file(
-            BENCH_ip, cell_name, MN1_ip, "onos-core,onos-app-metrics",
-            ONOS1_ip, ONOS2_ip, ONOS3_ip )
+        cellFileResult = main.ONOSbench.createCellFile(
+            BENCHIp, cellName, MN1Ip,
+            ("onos-core,onos-api,webconsole,onos-app-metrics,onos-app-gui,"
+            "onos-cli,onos-openflow"),
+            ONOS1Ip )
 
         main.step( "Applying cell file to environment" )
-        cell_apply_result = main.ONOSbench.set_cell( cell_name )
-        verify_cell_result = main.ONOSbench.verify_cell()
+        cellApplyResult = main.ONOSbench.setCell( cellName )
+        verifyCellResult = main.ONOSbench.verifyCell()
 
         # NOTE: This step may be removed after proper
         #      copy cat log functionality
         main.step( "Removing raft/copy-cat logs from ONOS nodes" )
-        main.ONOSbench.onos_remove_raft_logs()
+        main.ONOSbench.onosRemoveRaftLogs()
         time.sleep( 30 )
 
-        main.step( "Git checkout and pull " + checkout_branch )
-        if git_pull == 'on':
-            checkout_result = \
-                main.ONOSbench.git_checkout( checkout_branch )
-            pull_result = main.ONOSbench.git_pull()
+        main.step( "Git checkout and pull " + checkoutBranch )
+        if gitPull == 'on':
+            # checkoutResult = \
+                    #        main.ONOSbench.gitCheckout( checkoutBranch )
+            checkoutResult = main.TRUE
+            pullResult = main.ONOSbench.gitPull()
         else:
-            checkout_result = main.TRUE
-            pull_result = main.TRUE
+            checkoutResult = main.TRUE
+            pullResult = main.TRUE
             main.log.info( "Skipped git checkout and pull" )
 
-        # TODO: Uncomment when wiki posting works
-        #main.log.report( "Commit information - " )
-        # main.ONOSbench.get_version( report=True )
+        main.log.report( "Commit information - " )
+        main.ONOSbench.getVersion( report=True )
 
         main.step( "Using mvn clean & install" )
-        #mvn_result = main.ONOSbench.clean_install()
-        mvn_result = main.TRUE
+        if mvnCleanInstall == 'on':
+            mvnResult = main.ONOSbench.cleanInstall()
+        elif mvnCleanInstall == 'off':
+            main.log.info("mci turned off by settings")
+            mvnResult = main.TRUE
 
         main.step( "Set cell for ONOS cli env" )
-        main.ONOS1cli.set_cell( cell_name )
-        main.ONOS2cli.set_cell( cell_name )
-        main.ONOS3cli.set_cell( cell_name )
+        main.ONOS1cli.setCell( cellName )
 
         main.step( "Creating ONOS package" )
-        package_result = main.ONOSbench.onos_package()
+        packageResult = main.ONOSbench.onosPackage()
 
         main.step( "Installing ONOS package" )
-        install1_result = main.ONOSbench.onos_install( node=ONOS1_ip )
-        install2_result = main.ONOSbench.onos_install( node=ONOS2_ip )
-        install3_result = main.ONOSbench.onos_install( node=ONOS3_ip )
+        install1Result = main.ONOSbench.onosInstall( node=ONOS1Ip )
 
         time.sleep( 10 )
 
         main.step( "Start onos cli" )
-        cli1 = main.ONOS1cli.start_onos_cli( ONOS1_ip )
-        cli2 = main.ONOS2cli.start_onos_cli( ONOS2_ip )
-        cli3 = main.ONOS3cli.start_onos_cli( ONOS3_ip )
+        cli1 = main.ONOS1cli.startOnosCli( ONOS1Ip )
 
         utilities.assert_equals( expect=main.TRUE,
-                                 actual=cell_file_result and cell_apply_result and
-                                 verify_cell_result and checkout_result and
-                                 pull_result and mvn_result and
-                                 install1_result and install2_result and
-                                 install3_result,
-                                 onpass="Test Environment setup successful",
-                                 onfail="Failed to setup test environment" )
+                                actual=cellFileResult and cellApplyResult and
+                                verifyCellResult and checkoutResult and
+                                pullResult and mvnResult and
+                                install1Result,  # and install2Result and
+                                # install3Result,
+                                onpass="Test Environment setup successful",
+                                onfail="Failed to setup test environment" )
 
     def CASE2( self, main ):
         """
@@ -149,83 +177,94 @@
         import requests
         import os
         import numpy
+        global clusterCount
+        global timeToPost
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS_user = main.params[ 'CTRL' ][ 'user' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
 
-        default_sw_port = main.params[ 'CTRL' ][ 'port1' ]
+        ONOSUser = main.params[ 'CTRL' ][ 'user' ]
+
+        defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
 
         # Number of iterations of case
-        num_iter = main.params[ 'TEST' ][ 'numIter' ]
+        numIter = main.params[ 'TEST' ][ 'numIter' ]
         # Number of first 'x' iterations to ignore:
-        iter_ignore = int( main.params[ 'TEST' ][ 'iterIgnore' ] )
+        iterIgnore = int( main.params[ 'TEST' ][ 'iterIgnore' ] )
 
         # Timestamp 'keys' for json metrics output.
         # These are subject to change, hence moved into params
         deviceTimestamp = main.params[ 'JSON' ][ 'deviceTimestamp' ]
         graphTimestamp = main.params[ 'JSON' ][ 'graphTimestamp' ]
 
-        debug_mode = main.params[ 'TEST' ][ 'debugMode' ]
-        onos_log = main.params[ 'TEST' ][ 'onosLogFile' ]
+        debugMode = main.params[ 'TEST' ][ 'debugMode' ]
+        onosLog = main.params[ 'TEST' ][ 'onosLogFile' ]
+        resultPath = main.params[ 'DB' ][ 'switchEventResultPath' ]
 
         # Threshold for the test
-        threshold_str = main.params[ 'TEST' ][ 'singleSwThreshold' ]
-        threshold_obj = threshold_str.split( "," )
-        threshold_min = int( threshold_obj[ 0 ] )
-        threshold_max = int( threshold_obj[ 1 ] )
+        thresholdStr = main.params[ 'TEST' ][ 'singleSwThreshold' ]
+        thresholdObj = thresholdStr.split( "," )
+        thresholdMin = int( thresholdObj[ 0 ] )
+        thresholdMax = int( thresholdObj[ 1 ] )
 
         # List of switch add latency collected from
         # all iterations
-        latency_end_to_end_list = []
-        latency_ofp_to_graph_list = []
-        latency_ofp_to_device_list = []
-        latency_t0_to_device_list = []
-        latency_tcp_to_ofp_list = []
+        latencyEndToEndList = []
+        latencyOfpToGraphList = []
+        latencyOfpToDeviceList = []
+        latencyT0ToDeviceList = []
+        latencyTcpToOfpList = []
+
+        # Initialize 2d array for [node][iteration] storage
+        endToEndLatNodeIter = numpy.zeros(( clusterCount, int(numIter) ))
+        ofpToGraphLatNodeIter = numpy.zeros(( clusterCount, int(numIter) ))
+        # tcp-to-ofp measurements are same throughout each iteration 
+        tcpToOfpLatIter = [] 
 
         # Directory/file to store tshark results
-        tshark_of_output = "/tmp/tshark_of_topo.txt"
-        tshark_tcp_output = "/tmp/tshark_tcp_topo.txt"
+        tsharkOfOutput = "/tmp/tshark_of_topo.txt"
+        tsharkTcpOutput = "/tmp/tshark_tcp_topo.txt"
 
         # String to grep in tshark output
-        tshark_tcp_string = "TCP 74 " + default_sw_port
-        tshark_of_string = "OFP 86 Vendor"
+        tsharkTcpString = "TCP 74 " + defaultSwPort
+        tsharkOfString = "OFP 86 Vendor"
 
         # Initialize assertion to TRUE
         assertion = main.TRUE
 
-        local_time = time.strftime( '%x %X' )
-        local_time = local_time.replace( "/", "" )
-        local_time = local_time.replace( " ", "_" )
-        local_time = local_time.replace( ":", "" )
-        if debug_mode == 'on':
-            main.ONOS1.tshark_pcap( "eth0",
-                                    "/tmp/single_sw_lat_pcap_" + local_time )
+        localTime = time.strftime( '%x %X' )
+        localTime = localTime.replace( "/", "" )
+        localTime = localTime.replace( " ", "_" )
+        localTime = localTime.replace( ":", "" )
+        if debugMode == 'on':
+            main.ONOS1.tsharkPcap( "eth0",
+                                   "/tmp/single_sw_lat_pcap_" + localTime )
 
-            main.log.info( "TEST" )
+            main.log.info( "Debug mode is on" )
 
         main.log.report( "Latency of adding one switch to controller" )
-        main.log.report(
-            "First " +
-            str( iter_ignore ) +
-            " iterations ignored" +
-            " for jvm warmup time" )
-        main.log.report( "Total iterations of test: " + str( num_iter ) )
+        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( num_iter ) ):
+        for i in range( 0, int( numIter ) ):
             main.log.info( "Starting tshark capture" )
 
-            #* TCP [ ACK, SYN ] is used as t0_a, the
+            #* TCP [ ACK, SYN ] is used as t0A, the
             #  very first "exchange" between ONOS and
             #  the switch for end-to-end measurement
-            #* OFP [ Stats Reply ] is used for t0_b
+            #* OFP [ Stats Reply ] is used for t0B
             #  the very last OFP message between ONOS
             #  and the switch for ONOS measurement
-            main.ONOS1.tshark_grep( tshark_tcp_string,
-                                    tshark_tcp_output )
-            main.ONOS1.tshark_grep( tshark_of_string,
-                                    tshark_of_output )
+            main.ONOS1.tsharkGrep( tsharkTcpString,
+                                   tsharkTcpOutput )
+            main.ONOS1.tsharkGrep( tsharkOfString,
+                                   tsharkOfOutput )
 
             # Wait and ensure tshark is started and
             # capturing
@@ -233,17 +272,17 @@
 
             main.log.info( "Assigning s1 to controller" )
 
-            main.Mininet1.assign_sw_controller(
+            main.Mininet1.assignSwController(
                 sw="1",
-                ip1=ONOS1_ip,
-                port1=default_sw_port )
+                ip1=ONOS1Ip,
+                port1=defaultSwPort )
 
             # Wait and ensure switch is assigned
             # before stopping tshark
             time.sleep( 30 )
 
             main.log.info( "Stopping all Tshark processes" )
-            main.ONOS1.stop_tshark()
+            main.ONOS1.stopTshark()
 
             # tshark output is saved in ONOS. Use subprocess
             # to copy over files to TestON for parsing
@@ -251,325 +290,349 @@
 
             # TCP CAPTURE ****
             # Copy the tshark output from ONOS machine to
-            # TestON machine in tshark_tcp_output directory>file
-            os.system( "scp " + ONOS_user + "@" + ONOS1_ip + ":" +
-                       tshark_tcp_output + " /tmp/" )
-            tcp_file = open( tshark_tcp_output, 'r' )
-            temp_text = tcp_file.readline()
-            temp_text = temp_text.split( " " )
+            # TestON machine in tsharkTcpOutput directory>file
+            os.system( "scp " + ONOSUser + "@" + ONOS1Ip + ":" +
+                       tsharkTcpOutput + " /tmp/" )
+            tcpFile = open( tsharkTcpOutput, 'r' )
+            tempText = tcpFile.readline()
+            tempText = tempText.split( " " )
 
             main.log.info( "Object read in from TCP capture: " +
-                           str( temp_text ) )
-            if len( temp_text ) > 1:
-                t0_tcp = float( temp_text[ 1 ] ) * 1000.0
+                           str( tempText ) )
+            if len( tempText ) > 1:
+                t0Tcp = float( tempText[ 1 ] ) * 1000.0
             else:
                 main.log.error( "Tshark output file for TCP" +
                                 " returned unexpected results" )
-                t0_tcp = 0
+                t0Tcp = 0
                 assertion = main.FALSE
 
-            tcp_file.close()
+            tcpFile.close()
             #****************
 
             # OF CAPTURE ****
-            os.system( "scp " + ONOS_user + "@" + ONOS1_ip + ":" +
-                       tshark_of_output + " /tmp/" )
-            of_file = open( tshark_of_output, 'r' )
+            os.system( "scp " + ONOSUser + "@" + ONOS1Ip + ":" +
+                       tsharkOfOutput + " /tmp/" )
+            ofFile = open( tsharkOfOutput, 'r' )
 
-            line_ofp = ""
+            lineOfp = ""
             # Read until last line of file
             while True:
-                temp_text = of_file.readline()
-                if temp_text != '':
-                    line_ofp = temp_text
+                tempText = ofFile.readline()
+                if tempText != '':
+                    lineOfp = tempText
                 else:
                     break
-            obj = line_ofp.split( " " )
+            obj = lineOfp.split( " " )
 
             main.log.info( "Object read in from OFP capture: " +
-                           str( line_ofp ) )
+                           str( lineOfp ) )
 
-            if len( line_ofp ) > 1:
-                t0_ofp = float( obj[ 1 ] ) * 1000.0
+            if len( obj ) > 1:
+                t0Ofp = float( obj[ 1 ] ) * 1000.0
             else:
                 main.log.error( "Tshark output file for OFP" +
                                 " returned unexpected results" )
-                t0_ofp = 0
+                t0Ofp = 0
                 assertion = main.FALSE
 
-            of_file.close()
+            ofFile.close()
             #****************
 
-            json_str_1 = main.ONOS1cli.topology_events_metrics()
-            json_str_2 = main.ONOS2cli.topology_events_metrics()
-            json_str_3 = main.ONOS3cli.topology_events_metrics()
+            jsonStr1 = main.ONOS1cli.topologyEventsMetrics()
+            # Initialize scale-out variables
+            jsonStr2 = ""
+            jsonStr3 = ""
+            jsonStr4 = ""
+            jsonStr5 = ""
+            jsonStr6 = ""
+            jsonStr7 = ""
 
-            json_obj_1 = json.loads( json_str_1 )
-            json_obj_2 = json.loads( json_str_2 )
-            json_obj_3 = json.loads( json_str_3 )
+            jsonObj1 = json.loads( jsonStr1 )
+            # Initialize scale-out variables
+            jsonObj2 = ""
+            jsonObj3 = ""
+            jsonObj4 = ""
+            jsonObj5 = ""
+            jsonObj6 = ""
+            jsonObj7 = ""
 
             # Obtain graph timestamp. This timestsamp captures
             # the epoch time at which the topology graph was updated.
-            graph_timestamp_1 = \
-                json_obj_1[ graphTimestamp ][ 'value' ]
-            graph_timestamp_2 = \
-                json_obj_2[ graphTimestamp ][ 'value' ]
-            graph_timestamp_3 = \
-                json_obj_3[ graphTimestamp ][ 'value' ]
-
+            graphTimestamp1 = \
+                jsonObj1[ graphTimestamp ][ 'value' ]
             # Obtain device timestamp. This timestamp captures
             # the epoch time at which the device event happened
-            device_timestamp_1 = \
-                json_obj_1[ deviceTimestamp ][ 'value' ]
-            device_timestamp_2 = \
-                json_obj_2[ deviceTimestamp ][ 'value' ]
-            device_timestamp_3 = \
-                json_obj_3[ deviceTimestamp ][ 'value' ]
+            deviceTimestamp1 = \
+                jsonObj1[ deviceTimestamp ][ 'value' ]
 
             # t0 to device processing latency
-            delta_device_1 = int( device_timestamp_1 ) - int( t0_tcp )
-            delta_device_2 = int( device_timestamp_2 ) - int( t0_tcp )
-            delta_device_3 = int( device_timestamp_3 ) - int( t0_tcp )
-
-            # Get average of delta from all instances
-            avg_delta_device = \
-                ( int( delta_device_1 ) +
-                  int( delta_device_2 ) +
-                  int( delta_device_3 ) ) / 3
-
-            # Ensure avg delta meets the threshold before appending
-            if avg_delta_device > 0.0 and avg_delta_device < 10000\
-                    and int( i ) > iter_ignore:
-                latency_t0_to_device_list.append( avg_delta_device )
-            else:
-                main.log.info(
-                    "Results for t0-to-device ignored" +
-                    "due to excess in threshold / warmup iteration." )
-
+            deltaDevice1 = int( deviceTimestamp1 ) - int( t0Tcp )
             # t0 to graph processing latency ( end-to-end )
-            delta_graph_1 = int( graph_timestamp_1 ) - int( t0_tcp )
-            delta_graph_2 = int( graph_timestamp_2 ) - int( t0_tcp )
-            delta_graph_3 = int( graph_timestamp_3 ) - int( t0_tcp )
-
-            # Get average of delta from all instances
-            avg_delta_graph = \
-                ( int( delta_graph_1 ) +
-                  int( delta_graph_2 ) +
-                  int( delta_graph_3 ) ) / 3
-
-            # Ensure avg delta meets the threshold before appending
-            if avg_delta_graph > 0.0 and avg_delta_graph < 10000\
-                    and int( i ) > iter_ignore:
-                latency_end_to_end_list.append( avg_delta_graph )
-            else:
-                main.log.info( "Results for end-to-end ignored" +
-                               "due to excess in threshold" )
-
+            deltaGraph1 = int( graphTimestamp1 ) - int( t0Tcp )
             # ofp to graph processing latency ( ONOS processing )
-            delta_ofp_graph_1 = int( graph_timestamp_1 ) - int( t0_ofp )
-            delta_ofp_graph_2 = int( graph_timestamp_2 ) - int( t0_ofp )
-            delta_ofp_graph_3 = int( graph_timestamp_3 ) - int( t0_ofp )
-
-            avg_delta_ofp_graph = \
-                ( int( delta_ofp_graph_1 ) +
-                  int( delta_ofp_graph_2 ) +
-                  int( delta_ofp_graph_3 ) ) / 3
-
-            if avg_delta_ofp_graph > threshold_min \
-                    and avg_delta_ofp_graph < threshold_max\
-                    and int( i ) > iter_ignore:
-                latency_ofp_to_graph_list.append( avg_delta_ofp_graph )
-            elif avg_delta_ofp_graph > ( -10 ) and \
-                    avg_delta_ofp_graph < 0.0 and\
-                    int( i ) > iter_ignore:
-                main.log.info( "Sub-millisecond result likely; " +
-                               "negative result was rounded to 0" )
-                # NOTE: Current metrics framework does not
-                # support sub-millisecond accuracy. Therefore,
-                # if the result is negative, we can reasonably
-                # conclude sub-millisecond results and just
-                # append the best rounded effort - 0 ms.
-                latency_ofp_to_graph_list.append( 0 )
-            else:
-                main.log.info( "Results for ofp-to-graph " +
-                               "ignored due to excess in threshold" )
-
+            deltaOfpGraph1 = int( graphTimestamp1 ) - int( t0Ofp )
             # ofp to device processing latency ( ONOS processing )
-            delta_ofp_device_1 = float( device_timestamp_1 ) - float( t0_ofp )
-            delta_ofp_device_2 = float( device_timestamp_2 ) - float( t0_ofp )
-            delta_ofp_device_3 = float( device_timestamp_3 ) - float( t0_ofp )
+            deltaOfpDevice1 = float( deviceTimestamp1 ) - float( t0Ofp )
+            # tcp to ofp processing latency ( switch connection )
+            deltaTcpOfp1 = int(t0Ofp) - int(t0Tcp)
 
-            avg_delta_ofp_device = \
-                ( float( delta_ofp_device_1 ) +
-                  float( delta_ofp_device_2 ) +
-                  float( delta_ofp_device_3 ) ) / 3
-
-            # NOTE: ofp - delta measurements are occasionally negative
-            #      due to system time misalignment.
-            latency_ofp_to_device_list.append( avg_delta_ofp_device )
-
-            delta_ofp_tcp = int( t0_ofp ) - int( t0_tcp )
-            if delta_ofp_tcp > threshold_min \
-                    and delta_ofp_tcp < threshold_max and\
-                    int( i ) > iter_ignore:
-                latency_tcp_to_ofp_list.append( delta_ofp_tcp )
+            if deltaTcpOfp1 > thresholdMin and deltaTcpOfp1 < thresholdMax\
+               and i >= iterIgnore:
+                tcpToOfpLatIter.append(deltaTcpOfp1)
+                main.log.info("iter"+str(i)+" tcp-to-ofp: "+
+                          str(deltaTcpOfp1)+" ms")
             else:
-                main.log.info( "Results fo tcp-to-ofp " +
-                               "ignored due to excess in threshold" )
+                tcpToOfpLatIter.append(0)
+                main.log.info("iter"+str(i)+" tcp-to-ofp: "+
+                          str(deltaTcpOfp1)+" ms - ignored this iteration")
 
-            # TODO:
-            # Fetch logs upon threshold excess
+            # Store initial measurements in data array
+            #This measurement is for node 1
+           
+            if deltaGraph1 > thresholdMin and deltaGraph1 < thresholdMax\
+               and i >= iterIgnore:
+                endToEndLatNodeIter[0][i] = deltaGraph1
+                main.log.info("ONOS1 iter"+str(i)+" end-to-end: "+
+                          str(deltaGraph1)+" ms")
+            else:
+                main.log.info("ONOS1 iter"+str(i)+" end-to-end: "+
+                          str(deltaGraph1)+" ms - ignored this iteration")
 
-            main.log.info( "ONOS1 delta end-to-end: " +
-                           str( delta_graph_1 ) + " ms" )
-            main.log.info( "ONOS2 delta end-to-end: " +
-                           str( delta_graph_2 ) + " ms" )
-            main.log.info( "ONOS3 delta end-to-end: " +
-                           str( delta_graph_3 ) + " ms" )
 
-            main.log.info( "ONOS1 delta OFP - graph: " +
-                           str( delta_ofp_graph_1 ) + " ms" )
-            main.log.info( "ONOS2 delta OFP - graph: " +
-                           str( delta_ofp_graph_2 ) + " ms" )
-            main.log.info( "ONOS3 delta OFP - graph: " +
-                           str( delta_ofp_graph_3 ) + " ms" )
+            if deltaOfpGraph1 > thresholdMin and deltaOfpGraph1 < thresholdMax\
+               and i >= iterIgnore:
+                ofpToGraphLatNodeIter[0][i] = deltaOfpGraph1
+             
+            main.log.info("ONOS1 iter"+str(i)+" ofp-to-graph: "+
+                          str(deltaOfpGraph1)+" ms")
 
-            main.log.info( "ONOS1 delta device - t0: " +
-                           str( delta_device_1 ) + " ms" )
-            main.log.info( "ONOS2 delta device - t0: " +
-                           str( delta_device_2 ) + " ms" )
-            main.log.info( "ONOS3 delta device - t0: " +
-                           str( delta_device_3 ) + " ms" )
+            # TODO: Create even cluster number events
 
-            main.log.info( "TCP to OFP delta: " +
-                           str( delta_ofp_tcp ) + " ms" )
-            # main.log.info( "ONOS1 delta OFP - device: "+
-            #        str( delta_ofp_device_1 ) + " ms" )
-            # main.log.info( "ONOS2 delta OFP - device: "+
-            #        str( delta_ofp_device_2 ) + " ms" )
-            # main.log.info( "ONOS3 delta OFP - device: "+
-            #        str( delta_ofp_device_3 ) + " ms" )
+            # Include scale-out measurements when applicable
+            if clusterCount >= 3:
+                jsonStr2 = main.ONOS2cli.topologyEventsMetrics()
+                jsonStr3 = main.ONOS3cli.topologyEventsMetrics()
+                jsonObj2 = json.loads( jsonStr2 )
+                jsonObj3 = json.loads( jsonStr3 )
+                graphTimestamp2 = \
+                    jsonObj2[ graphTimestamp ][ 'value' ]
+                graphTimestamp3 = \
+                    jsonObj3[ graphTimestamp ][ 'value' ]
+                deviceTimestamp2 = \
+                    jsonObj2[ deviceTimestamp ][ 'value' ]
+                deviceTimestamp3 = \
+                    jsonObj3[ deviceTimestamp ][ 'value' ]
+                deltaDevice2 = int( deviceTimestamp2 ) - int( t0Tcp )
+                deltaDevice3 = int( deviceTimestamp3 ) - int( t0Tcp )
+                deltaGraph2 = int( graphTimestamp2 ) - int( t0Tcp )
+                deltaGraph3 = int( graphTimestamp3 ) - int( t0Tcp )
+                deltaOfpGraph2 = int( graphTimestamp2 ) - int( t0Ofp )
+                deltaOfpGraph3 = int( graphTimestamp3 ) - int( t0Ofp )
+                deltaOfpDevice2 = float( deviceTimestamp2 ) -\
+                    float( t0Ofp )
+                deltaOfpDevice3 = float( deviceTimestamp3 ) -\
+                    float( t0Ofp )
+
+                if deltaGraph2 > thresholdMin and\
+                   deltaGraph2 < thresholdMax and i >= iterIgnore:
+                    endToEndLatNodeIter[1][i] = deltaGraph2
+                    main.log.info("ONOS2 iter"+str(i)+" end-to-end: "+
+                            str(deltaGraph2)+" ms")
+                
+                if deltaOfpGraph2 > thresholdMin and\
+                   deltaOfpGraph2 < thresholdMax and i >= iterIgnore:
+                    ofpToGraphLatNodeIter[1][i] = deltaOfpGraph2
+                    main.log.info("ONOS2 iter"+str(i)+" ofp-to-graph: "+
+                            str(deltaOfpGraph2)+" ms")
+
+                if deltaGraph3 > thresholdMin and\
+                   deltaGraph3 < thresholdMax and i >= iterIgnore:
+                    endToEndLatNodeIter[2][i] = deltaGraph3
+                    main.log.info("ONOS3 iter"+str(i)+" end-to-end: "+
+                            str(deltaGraph3)+" ms")
+                
+                if deltaOfpGraph3 > thresholdMin and\
+                   deltaOfpGraph3 < thresholdMax and i >= iterIgnore:
+                    ofpToGraphLatNodeIter[2][i] = deltaOfpGraph3
+                    main.log.info("ONOS3 iter"+str(i)+" ofp-to-graph: "+
+                            str(deltaOfpGraph3)+" ms")
+                
+            if clusterCount >= 5:
+                jsonStr4 = main.ONOS4cli.topologyEventsMetrics()
+                jsonStr5 = main.ONOS5cli.topologyEventsMetrics()
+                jsonObj4 = json.loads( jsonStr4 )
+                jsonObj5 = json.loads( jsonStr5 )
+                graphTimestamp4 = \
+                    jsonObj4[ graphTimestamp ][ 'value' ]
+                graphTimestamp5 = \
+                    jsonObj5[ graphTimestamp ][ 'value' ]
+                deviceTimestamp4 = \
+                    jsonObj4[ deviceTimestamp ][ 'value' ]
+                deviceTimestamp5 = \
+                    jsonObj5[ deviceTimestamp ][ 'value' ]
+                deltaDevice4 = int( deviceTimestamp4 ) - int( t0Tcp )
+                deltaDevice5 = int( deviceTimestamp5 ) - int( t0Tcp )
+                deltaGraph4 = int( graphTimestamp4 ) - int( t0Tcp )
+                deltaGraph5 = int( graphTimestamp5 ) - int( t0Tcp )
+                deltaOfpGraph4 = int( graphTimestamp4 ) - int( t0Ofp )
+                deltaOfpGraph5 = int( graphTimestamp5 ) - int( t0Ofp )
+                deltaOfpDevice4 = float( deviceTimestamp4 ) -\
+                    float( t0Ofp )
+                deltaOfpDevice5 = float( deviceTimestamp5 ) -\
+                    float( t0Ofp )
+                
+                if deltaGraph4 > thresholdMin and\
+                   deltaGraph4 < thresholdMax and i >= iterIgnore:
+                    endToEndLatNodeIter[3][i] = deltaGraph4
+                    main.log.info("ONOS4 iter"+str(i)+" end-to-end: "+
+                            str(deltaGraph4)+" ms")
+                
+                    #TODO:
+                if deltaOfpGraph4 > thresholdMin and\
+                   deltaOfpGraph4 < thresholdMax and i >= iterIgnore:
+                    ofpToGraphLatNodeIter[3][i] = deltaOfpGraph4
+                    main.log.info("ONOS4 iter"+str(i)+" ofp-to-graph: "+
+                            str(deltaOfpGraph4)+" ms")
+
+                if deltaGraph5 > thresholdMin and\
+                   deltaGraph5 < thresholdMax and i >= iterIgnore:
+                    endToEndLatNodeIter[4][i] = deltaGraph5
+                    main.log.info("ONOS5 iter"+str(i)+" end-to-end: "+
+                            str(deltaGraph5)+" ms")
+                
+                if deltaOfpGraph5 > thresholdMin and\
+                   deltaOfpGraph5 < thresholdMax and i >= iterIgnore:
+                    ofpToGraphLatNodeIter[4][i] = deltaOfpGraph5
+                    main.log.info("ONOS5 iter"+str(i)+" ofp-to-graph: "+
+                            str(deltaOfpGraph5)+" ms")
+                
+            if clusterCount >= 7:
+                jsonStr6 = main.ONOS6cli.topologyEventsMetrics()
+                jsonStr7 = main.ONOS7cli.topologyEventsMetrics()
+                jsonObj6 = json.loads( jsonStr6 )
+                jsonObj7 = json.loads( jsonStr7 )
+                graphTimestamp6 = \
+                    jsonObj6[ graphTimestamp ][ 'value' ]
+                graphTimestamp7 = \
+                    jsonObj7[ graphTimestamp ][ 'value' ]
+                deviceTimestamp6 = \
+                    jsonObj6[ deviceTimestamp ][ 'value' ]
+                deviceTimestamp7 = \
+                    jsonObj7[ deviceTimestamp ][ 'value' ]
+                deltaDevice6 = int( deviceTimestamp6 ) - int( t0Tcp )
+                deltaDevice7 = int( deviceTimestamp7 ) - int( t0Tcp )
+                deltaGraph6 = int( graphTimestamp6 ) - int( t0Tcp )
+                deltaGraph7 = int( graphTimestamp7 ) - int( t0Tcp )
+                deltaOfpGraph6 = int( graphTimestamp6 ) - int( t0Ofp )
+                deltaOfpGraph7 = int( graphTimestamp7 ) - int( t0Ofp )
+                deltaOfpDevice6 = float( deviceTimestamp6 ) -\
+                    float( t0Ofp )
+                deltaOfpDevice7 = float( deviceTimestamp7 ) -\
+                    float( t0Ofp )
+                
+                if deltaGraph6 > thresholdMin and\
+                   deltaGraph6 < thresholdMax and i >= iterIgnore:
+                    endToEndLatNodeIter[5][i] = deltaGraph6
+                    main.log.info("ONOS6 iter"+str(i)+" end-to-end: "+
+                            str(deltaGraph6)+" ms")
+                
+                    #TODO:
+                if deltaOfpGraph6 > thresholdMin and\
+                   deltaOfpGraph6 < thresholdMax and i >= iterIgnore:
+                    ofpToGraphLatNodeIter[5][i] = deltaOfpGraph6
+                    main.log.info("ONOS6 iter"+str(i)+" ofp-to-graph: "+
+                            str(deltaOfpGraph6)+" ms")
+
+                if deltaGraph7 > thresholdMin and\
+                   deltaGraph7 < thresholdMax and i >= iterIgnore:
+                    endToEndLatNodeIter[6][i] = deltaGraph7
+                    main.log.info("ONOS7 iter"+str(i)+" end-to-end: "+
+                            str(deltaGraph7)+" ms")
+                
+                if deltaOfpGraph7 > thresholdMin and\
+                   deltaOfpGraph7 < thresholdMax and i >= iterIgnore:
+                    ofpToGraphLatNodeIter[6][i] = deltaOfpGraph7
+                    main.log.info("ONOS7 iter"+str(i)+" ofp-to-graph: "+
+                            str(deltaOfpGraph7)+" ms")
+                    
+            main.log.info("Switch up discovery latency")
+                
+            main.log.info("Starting tshark capture")
 
             main.step( "Remove switch from controller" )
-            main.Mininet1.delete_sw_controller( "s1" )
+            main.Mininet1.deleteSwController( "s1" )
+
+            #TODO: del controller does not have an OFP message.
+            #      However, we can capture TCP Fin,Ack as T0
 
             time.sleep( 5 )
 
         # END of for loop iteration
 
-        # If there is at least 1 element in each list,
-        # pass the test case
-        if len( latency_end_to_end_list ) > 0 and\
-           len( latency_ofp_to_graph_list ) > 0 and\
-           len( latency_ofp_to_device_list ) > 0 and\
-           len( latency_t0_to_device_list ) > 0 and\
-           len( latency_tcp_to_ofp_list ) > 0:
-            assertion = main.TRUE
-        elif len( latency_end_to_end_list ) == 0:
-            # The appending of 0 here is to prevent
-            # the min,max,sum functions from failing
-            # below
-            latency_end_to_end_list.append( 0 )
-            assertion = main.FALSE
-        elif len( latency_ofp_to_graph_list ) == 0:
-            latency_ofp_to_graph_list.append( 0 )
-            assertion = main.FALSE
-        elif len( latency_ofp_to_device_list ) == 0:
-            latency_ofp_to_device_list.append( 0 )
-            assertion = main.FALSE
-        elif len( latency_t0_to_device_list ) == 0:
-            latency_t0_to_device_list.append( 0 )
-            assertion = main.FALSE
-        elif len( latency_tcp_to_ofp_list ) == 0:
-            latency_tcp_to_ofp_list.append( 0 )
-            assertion = main.FALSE
+        #str( round( numpy.std( latencyT0ToDeviceList ), 1 ) )
 
-        # Calculate min, max, avg of latency lists
-        latency_end_to_end_max = \
-            int( max( latency_end_to_end_list ) )
-        latency_end_to_end_min = \
-            int( min( latency_end_to_end_list ) )
-        latency_end_to_end_avg = \
-            ( int( sum( latency_end_to_end_list ) ) /
-              len( latency_end_to_end_list ) )
-        latency_end_to_end_std_dev = \
-            str( round( numpy.std( latency_end_to_end_list ), 1 ) )
+        endToEndAvg = 0
+        ofpToGraphAvg = 0
+        endToEndList = []
+        ofpToGraphList = []
+        dbCmdList = []
 
-        latency_ofp_to_graph_max = \
-            int( max( latency_ofp_to_graph_list ) )
-        latency_ofp_to_graph_min = \
-            int( min( latency_ofp_to_graph_list ) )
-        latency_ofp_to_graph_avg = \
-            ( int( sum( latency_ofp_to_graph_list ) ) /
-              len( latency_ofp_to_graph_list ) )
-        latency_ofp_to_graph_std_dev = \
-            str( round( numpy.std( latency_ofp_to_graph_list ), 1 ) )
+        for node in range( 0, clusterCount ):
+            # The latency 2d array was initialized to 0. 
+            # If an iteration was ignored, then we have some 0's in
+            # our calculation. To avoid having this interfere with our 
+            # results, we must delete any index where 0 is found...
+            # WARN: Potentially, we could have latency that hovers at
+            # 0 ms once we have optimized code. FIXME for when this is
+            # the case. Being able to obtain sub-millisecond accuracy
+            # can prevent this from happening
+            for item in endToEndLatNodeIter[node]:
+                if item > 0.0:
+                    endToEndList.append(item)
+            for item in ofpToGraphLatNodeIter[node]:
+                if item > 0.0:
+                    ofpToGraphList.append(item)
 
-        latency_ofp_to_device_max = \
-            int( max( latency_ofp_to_device_list ) )
-        latency_ofp_to_device_min = \
-            int( min( latency_ofp_to_device_list ) )
-        latency_ofp_to_device_avg = \
-            ( int( sum( latency_ofp_to_device_list ) ) /
-              len( latency_ofp_to_device_list ) )
-        latency_ofp_to_device_std_dev = \
-            str( round( numpy.std( latency_ofp_to_device_list ), 1 ) )
+            endToEndAvg = round(numpy.mean(endToEndList), 2)
+            ofpToGraphAvg = numpy.mean(ofpToGraphList)
+            endToEndStd = round(numpy.std(endToEndList), 2)
 
-        latency_t0_to_device_max = \
-            int( max( latency_t0_to_device_list ) )
-        latency_t0_to_device_min = \
-            int( min( latency_t0_to_device_list ) )
-        latency_t0_to_device_avg = \
-            ( int( sum( latency_t0_to_device_list ) ) /
-              len( latency_t0_to_device_list ) )
-        latency_ofp_to_device_std_dev = \
-            str( round( numpy.std( latency_t0_to_device_list ), 1 ) )
+            main.log.report( " - Node "+str(node+1)+" Summary - " )
+            main.log.report( " End-to-end Avg: "+
+                             str(round(endToEndAvg,2))+" ms"+
+                             " End-to-end Std dev: "+
+                             str(round(endToEndStd,2))+" ms")
+            
+            dbCmdList.append(
+                "INSERT INTO switch_latency_tests VALUES("
+                   "'"+timeToPost+"','switch_latency_results',"
+                   ""+runNum+","+str(clusterCount)+",'baremetal"+str(node+1)+"',"
+                   ""+str(endToEndAvg)+","+str(endToEndStd)+",0,0);"
+            )
+            #main.log.report( " Ofp-to-graph Avg: "+
+            #                 str(round(ofpToGraphAvg,2))+" ms"+
+            #                 " Ofp-to-graph Std dev: "+
+            #                 str(round(numpy.std(ofpToGraphList),2))+
+            #                 " ms")
 
-        latency_tcp_to_ofp_max = \
-            int( max( latency_tcp_to_ofp_list ) )
-        latency_tcp_to_ofp_min = \
-            int( min( latency_tcp_to_ofp_list ) )
-        latency_tcp_to_ofp_avg = \
-            ( int( sum( latency_tcp_to_ofp_list ) ) /
-              len( latency_tcp_to_ofp_list ) )
-        latency_tcp_to_ofp_std_dev = \
-            str( round( numpy.std( latency_tcp_to_ofp_list ), 1 ) )
+        if debugMode == 'on':
+            main.ONOS1.cpLogsToDir( "/opt/onos/log/karaf.log",
+                                      "/tmp/", copyFileName="sw_lat_karaf" )
+        
+        #Write to file for posting to DB
+        fResult = open(resultPath, 'a')
+        for line in dbCmdList:
+            if line:
+                fResult.write(line+"\n")
+        fResult.close()
 
-        main.log.report(
-            "Switch add - End-to-end latency: " +
-            "Avg: " +
-            str( latency_end_to_end_avg ) +
-            " ms " +
-            "Std Deviation: " +
-            latency_end_to_end_std_dev +
-            " ms" )
-        main.log.report(
-            "Switch add - OFP-to-Graph latency: " +
-            "Note: results are not accurate to sub-millisecond. " +
-            "Any sub-millisecond results are rounded to 0 ms. " )
-        main.log.report(
-            "Avg: " +
-            str( latency_ofp_to_graph_avg ) +
-            " ms " +
-            "Std Deviation: " +
-            latency_ofp_to_graph_std_dev +
-            " ms" )
-        main.log.report(
-            "Switch add - TCP-to-OFP latency: " +
-            "Avg: " +
-            str( latency_tcp_to_ofp_avg ) +
-            " ms " +
-            "Std Deviation: " +
-            latency_tcp_to_ofp_std_dev +
-            " ms" )
-
-        if debug_mode == 'on':
-            main.ONOS1.cp_logs_to_dir( "/opt/onos/log/karaf.log",
-                                       "/tmp/", copy_file_name="sw_lat_karaf" )
+        #TODO: correct assert
+        assertion = main.TRUE
 
         utilities.assert_equals( expect=main.TRUE, actual=assertion,
-                                 onpass="Switch latency test successful",
-                                 onfail="Switch latency test failed" )
+                                onpass="Switch latency test successful",
+                                onfail="Switch latency test failed" )
 
     def CASE3( self, main ):
         """
@@ -586,383 +649,592 @@
         import requests
         import json
         import numpy
+        global clusterCount
+        global runNum
+        global timeToPost
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS_user = main.params[ 'CTRL' ][ 'user' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOSUser = main.params[ 'CTRL' ][ 'user' ]
 
-        default_sw_port = main.params[ 'CTRL' ][ 'port1' ]
+        defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
 
         assertion = main.TRUE
         # Number of iterations of case
-        num_iter = main.params[ 'TEST' ][ 'numIter' ]
+        numIter = main.params[ 'TEST' ][ 'numIter' ]
+        iterIgnore = int( main.params[ 'TEST' ][ 'iterIgnore' ] )
 
         # Timestamp 'keys' for json metrics output.
         # These are subject to change, hence moved into params
         deviceTimestamp = main.params[ 'JSON' ][ 'deviceTimestamp' ]
         graphTimestamp = main.params[ 'JSON' ][ 'graphTimestamp' ]
 
-        debug_mode = main.params[ 'TEST' ][ 'debugMode' ]
+        debugMode = main.params[ 'TEST' ][ 'debugMode' ]
+        postToDB = main.params[ 'DB' ][ 'postToDB' ]
+        resultPath = main.params[ 'DB' ][ 'portEventResultPath' ]
 
-        local_time = time.strftime( '%x %X' )
-        local_time = local_time.replace( "/", "" )
-        local_time = local_time.replace( " ", "_" )
-        local_time = local_time.replace( ":", "" )
-        if debug_mode == 'on':
-            main.ONOS1.tshark_pcap( "eth0",
-                                    "/tmp/port_lat_pcap_" + local_time )
+        localTime = time.strftime( '%x %X' )
+        localTime = localTime.replace( "/", "" )
+        localTime = localTime.replace( " ", "_" )
+        localTime = localTime.replace( ":", "" )
+        if debugMode == 'on':
+            main.ONOS1.tsharkPcap( "eth0",
+                                   "/tmp/port_lat_pcap_" + localTime )
 
         # Threshold for this test case
-        up_threshold_str = main.params[ 'TEST' ][ 'portUpThreshold' ]
-        down_threshold_str = main.params[ 'TEST' ][ 'portDownThreshold' ]
+        upThresholdStr = main.params[ 'TEST' ][ 'portUpThreshold' ]
+        downThresholdStr = main.params[ 'TEST' ][ 'portDownThreshold' ]
 
-        up_threshold_obj = up_threshold_str.split( "," )
-        down_threshold_obj = down_threshold_str.split( "," )
+        upThresholdObj = upThresholdStr.split( "," )
+        downThresholdObj = downThresholdStr.split( "," )
 
-        up_threshold_min = int( up_threshold_obj[ 0 ] )
-        up_threshold_max = int( up_threshold_obj[ 1 ] )
+        upThresholdMin = int( upThresholdObj[ 0 ] )
+        upThresholdMax = int( upThresholdObj[ 1 ] )
 
-        down_threshold_min = int( down_threshold_obj[ 0 ] )
-        down_threshold_max = int( down_threshold_obj[ 1 ] )
+        downThresholdMin = int( downThresholdObj[ 0 ] )
+        downThresholdMax = int( downThresholdObj[ 1 ] )
 
         # NOTE: Some hardcoded variables you may need to configure
         #      besides the params
 
-        tshark_port_status = "OFP 130 Port Status"
+        tsharkPortStatus = "OFP 130 Port Status"
 
-        tshark_port_up = "/tmp/tshark_port_up.txt"
-        tshark_port_down = "/tmp/tshark_port_down.txt"
-        interface_config = "s1-eth1"
+        tsharkPortUp = "/tmp/tshark_port_up.txt"
+        tsharkPortDown = "/tmp/tshark_port_down.txt"
+        interfaceConfig = "s1-eth1"
 
         main.log.report( "Port enable / disable latency" )
         main.log.report( "Simulated by ifconfig up / down" )
-        main.log.report( "Total iterations of test: " + str( num_iter ) )
+        main.log.report( "Total iterations of test: " + str( numIter ) )
 
         main.step( "Assign switches s1 and s2 to controller 1" )
-        main.Mininet1.assign_sw_controller( sw="1", ip1=ONOS1_ip,
-                                            port1=default_sw_port )
-        main.Mininet1.assign_sw_controller( sw="2", ip1=ONOS1_ip,
-                                            port1=default_sw_port )
+        main.Mininet1.assignSwController( sw="1", ip1=ONOS1Ip,
+                                           port1=defaultSwPort )
+        main.Mininet1.assignSwController( sw="2", ip1=ONOS1Ip,
+                                           port1=defaultSwPort )
 
         # Give enough time for metrics to propagate the
         # assign controller event. Otherwise, these events may
         # carry over to our measurements
         time.sleep( 15 )
 
-        port_up_device_to_ofp_list = []
-        port_up_graph_to_ofp_list = []
-        port_down_device_to_ofp_list = []
-        port_down_graph_to_ofp_list = []
+        portUpDeviceToOfpList = []
+        portUpGraphToOfpList = []
+        portDownDeviceToOfpList = []
+        portDownGraphToOfpList = []
+       
+        # Initialize 2d array filled with 0's
+        # arraySizeFormat[clusterCount][numIter]
+        portUpDevNodeIter = numpy.zeros(( clusterCount, int(numIter) ))
+        portUpGraphNodeIter = numpy.zeros(( clusterCount, int(numIter) ))
+        portDownDevNodeIter = numpy.zeros(( clusterCount, int(numIter) ))
+        portDownGraphNodeIter = numpy.zeros(( clusterCount, int(numIter) ))
 
-        for i in range( 0, int( num_iter ) ):
+        for i in range( 0, int( numIter ) ):
             main.step( "Starting wireshark capture for port status down" )
-            main.ONOS1.tshark_grep( tshark_port_status,
-                                    tshark_port_down )
+            main.ONOS1.tsharkGrep( tsharkPortStatus,
+                                   tsharkPortDown )
 
             time.sleep( 5 )
 
             # Disable interface that is connected to switch 2
-            main.step( "Disable port: " + interface_config )
+            main.step( "Disable port: " + interfaceConfig )
             main.Mininet1.handle.sendline( "sh ifconfig " +
-                                           interface_config + " down" )
+                                           interfaceConfig + " down" )
             main.Mininet1.handle.expect( "mininet>" )
 
             time.sleep( 3 )
-            main.ONOS1.tshark_stop()
-
-            main.step( "Obtain t1 by metrics call" )
-            json_str_up_1 = main.ONOS1cli.topology_events_metrics()
-            json_str_up_2 = main.ONOS2cli.topology_events_metrics()
-            json_str_up_3 = main.ONOS3cli.topology_events_metrics()
-
-            json_obj_1 = json.loads( json_str_up_1 )
-            json_obj_2 = json.loads( json_str_up_2 )
-            json_obj_3 = json.loads( json_str_up_3 )
+            main.ONOS1.tsharkStop()
 
             # Copy tshark output file from ONOS to TestON instance
             #/tmp directory
-            os.system( "scp " + ONOS_user + "@" + ONOS1_ip + ":" +
-                       tshark_port_down + " /tmp/" )
+            os.system( "scp " + ONOSUser + "@" + ONOS1Ip + ":" +
+                       tsharkPortDown + " /tmp/" )
 
-            f_port_down = open( tshark_port_down, 'r' )
+            fPortDown = open( tsharkPortDown, 'r' )
             # Get first line of port down event from tshark
-            f_line = f_port_down.readline()
-            obj_down = f_line.split( " " )
-            if len( f_line ) > 0:
-                timestamp_begin_pt_down = int( float( obj_down[ 1 ] ) * 1000 )
+            fLine = fPortDown.readline()
+            objDown = fLine.split( " " )
+            if len( fLine ) > 0:
+                # NOTE: objDown[ 1 ] is a very unreliable
+                #      way to determine the timestamp. If
+                #      results seem way off, check the object
+                #      itself by printing it out
+                timestampBeginPtDown = int( float( objDown[ 1 ] ) * 1000 )
+                # For some reason, wireshark decides to record the
+                # timestamp at the 3rd object position instead of
+                # 2nd at unpredictable times. This statement is
+                # used to capture that odd behavior and use the
+                # correct epoch time
+                if timestampBeginPtDown < 1400000000000:
+                    timestampBeginPtDown = \
+                        int( float( objDown[ 2 ] ) * 1000 )
+
                 main.log.info( "Port down begin timestamp: " +
-                               str( timestamp_begin_pt_down ) )
+                               str( timestampBeginPtDown ) )
             else:
                 main.log.info( "Tshark output file returned unexpected" +
-                               " results: " + str( obj_down ) )
-                timestamp_begin_pt_down = 0
+                               " results: " + str( objDown ) )
+                timestampBeginPtDown = 0
+            fPortDown.close()
 
-            f_port_down.close()
-
-            main.log.info( "TEST tshark obj: " + str( obj_down ) )
-
-            time.sleep( 3 )
-
+            main.step( "Obtain t1 by metrics call" )
+            jsonStrUp1 = main.ONOS1cli.topologyEventsMetrics()
+            jsonObj1 = json.loads( jsonStrUp1 )
             # Obtain graph timestamp. This timestsamp captures
             # the epoch time at which the topology graph was updated.
-            graph_timestamp_1 = \
-                json_obj_1[ graphTimestamp ][ 'value' ]
-            graph_timestamp_2 = \
-                json_obj_2[ graphTimestamp ][ 'value' ]
-            graph_timestamp_3 = \
-                json_obj_3[ graphTimestamp ][ 'value' ]
-
-            main.log.info( "TEST graph timestamp ONOS1: " +
-                           str( graph_timestamp_1 ) )
-
+            graphTimestamp1 = \
+                jsonObj1[ graphTimestamp ][ 'value' ]
             # Obtain device timestamp. This timestamp captures
             # the epoch time at which the device event happened
-            device_timestamp_1 = \
-                json_obj_1[ deviceTimestamp ][ 'value' ]
-            device_timestamp_2 = \
-                json_obj_2[ deviceTimestamp ][ 'value' ]
-            device_timestamp_3 = \
-                json_obj_3[ deviceTimestamp ][ 'value' ]
-
+            deviceTimestamp1 = \
+                jsonObj1[ deviceTimestamp ][ 'value' ]
             # Get delta between graph event and OFP
-            pt_down_graph_to_ofp_1 = int( graph_timestamp_1 ) -\
-                int( timestamp_begin_pt_down )
-            pt_down_graph_to_ofp_2 = int( graph_timestamp_2 ) -\
-                int( timestamp_begin_pt_down )
-            pt_down_graph_to_ofp_3 = int( graph_timestamp_3 ) -\
-                int( timestamp_begin_pt_down )
-
+            ptDownGraphToOfp1 = int( graphTimestamp1 ) -\
+                int( timestampBeginPtDown )
             # Get delta between device event and OFP
-            pt_down_device_to_ofp_1 = int( device_timestamp_1 ) -\
-                int( timestamp_begin_pt_down )
-            pt_down_device_to_ofp_2 = int( device_timestamp_2 ) -\
-                int( timestamp_begin_pt_down )
-            pt_down_device_to_ofp_3 = int( device_timestamp_3 ) -\
-                int( timestamp_begin_pt_down )
+            ptDownDeviceToOfp1 = int( deviceTimestamp1 ) -\
+                int( timestampBeginPtDown )
 
-            # Caluclate average across clusters
-            pt_down_graph_to_ofp_avg =\
-                ( int( pt_down_graph_to_ofp_1 ) +
-                  int( pt_down_graph_to_ofp_2 ) +
-                  int( pt_down_graph_to_ofp_3 ) ) / 3
-            pt_down_device_to_ofp_avg = \
-                ( int( pt_down_device_to_ofp_1 ) +
-                  int( pt_down_device_to_ofp_2 ) +
-                  int( pt_down_device_to_ofp_3 ) ) / 3
-
-            if pt_down_graph_to_ofp_avg > down_threshold_min and \
-                    pt_down_graph_to_ofp_avg < down_threshold_max:
-                port_down_graph_to_ofp_list.append(
-                    pt_down_graph_to_ofp_avg )
-                main.log.info( "Port down: graph to ofp avg: " +
-                               str( pt_down_graph_to_ofp_avg ) + " ms" )
+            if ptDownGraphToOfp1 > downThresholdMin and\
+               ptDownGraphToOfp1 < downThresholdMax and i > iterIgnore:
+                portDownGraphNodeIter[0][i] = ptDownGraphToOfp1
+                main.log.info("iter"+str(i)+" port down graph-to-ofp: "+
+                              str(ptDownGraphToOfp1)+" ms")
             else:
-                main.log.info( "Average port down graph-to-ofp result" +
-                               " exceeded the threshold: " +
-                               str( pt_down_graph_to_ofp_avg ) )
-
-            if pt_down_device_to_ofp_avg > 0 and \
-                    pt_down_device_to_ofp_avg < 1000:
-                port_down_device_to_ofp_list.append(
-                    pt_down_device_to_ofp_avg )
-                main.log.info( "Port down: device to ofp avg: " +
-                               str( pt_down_device_to_ofp_avg ) + " ms" )
+                main.log.info("iter"+str(i)+" skipped. Result: "+
+                              str(ptDownGraphToOfp1)+" ms")
+            if ptDownDeviceToOfp1 > downThresholdMin and\
+               ptDownDeviceToOfp1 < downThresholdMax and i > iterIgnore:
+                portDownDevNodeIter[0][i] = ptDownDeviceToOfp1
+                main.log.info("iter"+str(i)+" port down device-to-ofp: "+
+                              str(ptDownDeviceToOfp1)+" ms")
             else:
-                main.log.info( "Average port down device-to-ofp result" +
-                               " exceeded the threshold: " +
-                               str( pt_down_device_to_ofp_avg ) )
+                main.log.info("iter"+str(i)+" skipped. Result: "+
+                              str(ptDownDeviceToOfp1)+" ms")
+
+            if clusterCount >= 3:
+                jsonStrUp2 = main.ONOS2cli.topologyEventsMetrics()
+                jsonStrUp3 = main.ONOS3cli.topologyEventsMetrics()
+                jsonObj2 = json.loads( jsonStrUp2 )
+                jsonObj3 = json.loads( jsonStrUp3 )
+                graphTimestamp2 = \
+                    jsonObj2[ graphTimestamp ][ 'value' ]
+                graphTimestamp3 = \
+                    jsonObj3[ graphTimestamp ][ 'value' ]
+                deviceTimestamp2 = \
+                    jsonObj2[ deviceTimestamp ][ 'value' ]
+                deviceTimestamp3 = \
+                    jsonObj3[ deviceTimestamp ][ 'value' ]
+                ptDownGraphToOfp2 = int( graphTimestamp2 ) -\
+                    int( timestampBeginPtDown )
+                ptDownGraphToOfp3 = int( graphTimestamp3 ) -\
+                    int( timestampBeginPtDown )
+                ptDownDeviceToOfp2 = int( deviceTimestamp2 ) -\
+                    int( timestampBeginPtDown )
+                ptDownDeviceToOfp3 = int( deviceTimestamp3 ) -\
+                    int( timestampBeginPtDown )
+
+                if ptDownGraphToOfp2 > downThresholdMin and\
+                   ptDownGraphToOfp2 < downThresholdMax and i > iterIgnore:
+                    portDownGraphNodeIter[1][i] = ptDownGraphToOfp2
+                    main.log.info("ONOS2 iter"+str(i)+" graph-to-ofp: "+
+                                  str(ptDownGraphToOfp2)+" ms")
+
+                if ptDownDeviceToOfp2 > downThresholdMin and\
+                   ptDownDeviceToOfp2 < downThresholdMax and i > iterIgnore:
+                    portDownDevNodeIter[1][i] = ptDownDeviceToOfp2
+                    main.log.info("ONOS2 iter"+str(i)+" device-to-ofp: "+
+                                  str(ptDownDeviceToOfp2)+" ms")
+
+                if ptDownGraphToOfp3 > downThresholdMin and\
+                   ptDownGraphToOfp3 < downThresholdMax and i > iterIgnore:
+                    portDownGraphNodeIter[2][i] = ptDownGraphToOfp3
+                    main.log.info("ONOS3 iter"+str(i)+" graph-to-ofp: "+
+                                  str(ptDownGraphToOfp3)+" ms")
+
+                if ptDownDeviceToOfp3 > downThresholdMin and\
+                   ptDownDeviceToOfp3 < downThresholdMax and i > iterIgnore:
+                    portDownDevNodeIter[2][i] = ptDownDeviceToOfp3
+                    main.log.info("ONOS3 iter"+str(i)+" device-to-ofp: "+
+                                  str(ptDownDeviceToOfp3)+" ms")
+
+            if clusterCount >= 5:
+                jsonStrUp4 = main.ONOS4cli.topologyEventsMetrics()
+                jsonStrUp5 = main.ONOS5cli.topologyEventsMetrics()
+                jsonObj4 = json.loads( jsonStrUp4 )
+                jsonObj5 = json.loads( jsonStrUp5 )
+                graphTimestamp4 = \
+                    jsonObj4[ graphTimestamp ][ 'value' ]
+                graphTimestamp5 = \
+                    jsonObj5[ graphTimestamp ][ 'value' ]
+                deviceTimestamp4 = \
+                    jsonObj4[ deviceTimestamp ][ 'value' ]
+                deviceTimestamp5 = \
+                    jsonObj5[ deviceTimestamp ][ 'value' ]
+                ptDownGraphToOfp4 = int( graphTimestamp4 ) -\
+                    int( timestampBeginPtDown )
+                ptDownGraphToOfp5 = int( graphTimestamp5 ) -\
+                    int( timestampBeginPtDown )
+                ptDownDeviceToOfp4 = int( deviceTimestamp4 ) -\
+                    int( timestampBeginPtDown )
+                ptDownDeviceToOfp5 = int( deviceTimestamp5 ) -\
+                    int( timestampBeginPtDown )
+                
+                if ptDownGraphToOfp4 > downThresholdMin and\
+                   ptDownGraphToOfp4 < downThresholdMax and i > iterIgnore:
+                    portDownGraphNodeIter[3][i] = ptDownGraphToOfp4
+                    main.log.info("ONOS4 iter"+str(i)+" graph-to-ofp: "+
+                                  str(ptDownGraphToOfp4)+" ms")
+
+                if ptDownDeviceToOfp4 > downThresholdMin and\
+                   ptDownDeviceToOfp4 < downThresholdMax and i > iterIgnore:
+                    portDownDevNodeIter[3][i] = ptDownDeviceToOfp4
+                    main.log.info("ONOS4 iter"+str(i)+" device-to-ofp: "+
+                                  str(ptDownDeviceToOfp4)+" ms")
+
+                if ptDownGraphToOfp5 > downThresholdMin and\
+                   ptDownGraphToOfp5 < downThresholdMax and i > iterIgnore:
+                    portDownGraphNodeIter[4][i] = ptDownGraphToOfp5
+                    main.log.info("ONOS5 iter"+str(i)+" graph-to-ofp: "+
+                                  str(ptDownGraphToOfp5)+" ms")
+                
+                if ptDownDeviceToOfp5 > downThresholdMin and\
+                   ptDownDeviceToOfp5 < downThresholdMax and i > iterIgnore:
+                    portDownDevNodeIter[4][i] = ptDownDeviceToOfp5
+                    main.log.info("ONOS5 iter"+str(i)+" device-to-ofp: "+
+                                  str(ptDownDeviceToOfp5)+" ms")
+
+            if clusterCount >= 7:
+                jsonStrUp6 = main.ONOS6cli.topologyEventsMetrics()
+                jsonStrUp7 = main.ONOS7cli.topologyEventsMetrics()
+                jsonObj6 = json.loads( jsonStrUp6 )
+                jsonObj7 = json.loads( jsonStrUp7 )
+                graphTimestamp6 = \
+                    jsonObj6[ graphTimestamp ][ 'value' ]
+                graphTimestamp7 = \
+                    jsonObj7[ graphTimestamp ][ 'value' ]
+                deviceTimestamp6 = \
+                    jsonObj6[ deviceTimestamp ][ 'value' ]
+                deviceTimestamp7 = \
+                    jsonObj7[ deviceTimestamp ][ 'value' ]
+                ptDownGraphToOfp6 = int( graphTimestamp6 ) -\
+                    int( timestampBeginPtDown )
+                ptDownGraphToOfp7 = int( graphTimestamp7 ) -\
+                    int( timestampBeginPtDown )
+                ptDownDeviceToOfp6 = int( deviceTimestamp6 ) -\
+                    int( timestampBeginPtDown )
+                ptDownDeviceToOfp7 = int( deviceTimestamp7 ) -\
+                    int( timestampBeginPtDown )
+                
+                if ptDownGraphToOfp6 > downThresholdMin and\
+                   ptDownGraphToOfp6 < downThresholdMax and i > iterIgnore:
+                    portDownGraphNodeIter[5][i] = ptDownGraphToOfp6
+                    main.log.info("ONOS6 iter"+str(i)+" graph-to-ofp: "+
+                                  str(ptDownGraphToOfp6)+" ms")
+
+                if ptDownDeviceToOfp6 > downThresholdMin and\
+                   ptDownDeviceToOfp6 < downThresholdMax and i > iterIgnore:
+                    portDownDevNodeIter[5][i] = ptDownDeviceToOfp6
+                    main.log.info("ONOS6 iter"+str(i)+" device-to-ofp: "+
+                                  str(ptDownDeviceToOfp6)+" ms")
+
+                if ptDownGraphToOfp7 > downThresholdMin and\
+                   ptDownGraphToOfp7 < downThresholdMax and i > iterIgnore:
+                    portDownGraphNodeIter[6][i] = ptDownGraphToOfp7
+                    main.log.info("ONOS7 iter"+str(i)+" graph-to-ofp: "+
+                                  str(ptDownGraphToOfp7)+" ms")
+                
+                if ptDownDeviceToOfp7 > downThresholdMin and\
+                   ptDownDeviceToOfp7 < downThresholdMax and i > iterIgnore:
+                    portDownDevNodeIter[6][i] = ptDownDeviceToOfp7
+                    main.log.info("ONOS7 iter"+str(i)+" device-to-ofp: "+
+                                  str(ptDownDeviceToOfp7)+" ms")
+
+            time.sleep( 3 )
 
             # Port up events
             main.step( "Enable port and obtain timestamp" )
             main.step( "Starting wireshark capture for port status up" )
-            main.ONOS1.tshark_grep( tshark_port_status, tshark_port_up )
+            main.ONOS1.tsharkGrep( tsharkPortStatus, tsharkPortUp )
             time.sleep( 5 )
 
             main.Mininet1.handle.sendline( "sh ifconfig " +
-                                           interface_config + " up" )
+                                           interfaceConfig + " up" )
             main.Mininet1.handle.expect( "mininet>" )
 
             # Allow time for tshark to capture event
+            time.sleep( 5 )
+            main.ONOS1.tsharkStop()
+
             time.sleep( 3 )
-            main.ONOS1.tshark_stop()
+            os.system( "scp " + ONOSUser + "@" + ONOS1Ip + ":" +
+                       tsharkPortUp + " /tmp/" )
+            fPortUp = open( tsharkPortUp, 'r' )
+            fLine = fPortUp.readline()
+            objUp = fLine.split( " " )
+            if len( fLine ) > 0:
+                timestampBeginPtUp = int( float( objUp[ 1 ] ) * 1000 )
+                if timestampBeginPtUp < 1400000000000:
+                    timestampBeginPtUp = \
+                        int( float( objUp[ 2 ] ) * 1000 )
+                main.log.info( "Port up begin timestamp: " +
+                               str( timestampBeginPtUp ) )
+            else:
+                main.log.info( "Tshark output file returned unexpected" +
+                               " results." )
+                timestampBeginPtUp = 0
+            fPortUp.close()
 
             # Obtain metrics shortly afterwards
             # This timestsamp captures
             # the epoch time at which the topology graph was updated.
             main.step( "Obtain t1 by REST call" )
-            json_str_up_1 = main.ONOS1cli.topology_events_metrics()
-            json_str_up_2 = main.ONOS2cli.topology_events_metrics()
-            json_str_up_3 = main.ONOS3cli.topology_events_metrics()
-
-            json_obj_1 = json.loads( json_str_up_1 )
-            json_obj_2 = json.loads( json_str_up_2 )
-            json_obj_3 = json.loads( json_str_up_3 )
-
-            os.system( "scp " + ONOS_user + "@" + ONOS1_ip + ":" +
-                       tshark_port_up + " /tmp/" )
-
-            f_port_up = open( tshark_port_up, 'r' )
-            f_line = f_port_up.readline()
-            obj_up = f_line.split( " " )
-            if len( f_line ) > 0:
-                timestamp_begin_pt_up = int( float( obj_up[ 1 ] ) * 1000 )
-                main.log.info( "Port up begin timestamp: " +
-                               str( timestamp_begin_pt_up ) )
-            else:
-                main.log.info( "Tshark output file returned unexpected" +
-                               " results." )
-                timestamp_begin_pt_up = 0
-
-            f_port_up.close()
-
-            graph_timestamp_1 = \
-                json_obj_1[ graphTimestamp ][ 'value' ]
-            graph_timestamp_2 = \
-                json_obj_2[ graphTimestamp ][ 'value' ]
-            graph_timestamp_3 = \
-                json_obj_3[ graphTimestamp ][ 'value' ]
-
+            jsonStrUp1 = main.ONOS1cli.topologyEventsMetrics()
+            jsonObj1 = json.loads( jsonStrUp1 )
+            graphTimestamp1 = \
+                jsonObj1[ graphTimestamp ][ 'value' ]
             # Obtain device timestamp. This timestamp captures
             # the epoch time at which the device event happened
-            device_timestamp_1 = \
-                json_obj_1[ deviceTimestamp ][ 'value' ]
-            device_timestamp_2 = \
-                json_obj_2[ deviceTimestamp ][ 'value' ]
-            device_timestamp_3 = \
-                json_obj_3[ deviceTimestamp ][ 'value' ]
-
+            deviceTimestamp1 = \
+                jsonObj1[ deviceTimestamp ][ 'value' ]
             # Get delta between graph event and OFP
-            pt_up_graph_to_ofp_1 = int( graph_timestamp_1 ) -\
-                int( timestamp_begin_pt_up )
-            pt_up_graph_to_ofp_2 = int( graph_timestamp_2 ) -\
-                int( timestamp_begin_pt_up )
-            pt_up_graph_to_ofp_3 = int( graph_timestamp_3 ) -\
-                int( timestamp_begin_pt_up )
-
+            ptUpGraphToOfp1 = int( graphTimestamp1 ) -\
+                int( timestampBeginPtUp )
             # Get delta between device event and OFP
-            pt_up_device_to_ofp_1 = int( device_timestamp_1 ) -\
-                int( timestamp_begin_pt_up )
-            pt_up_device_to_ofp_2 = int( device_timestamp_2 ) -\
-                int( timestamp_begin_pt_up )
-            pt_up_device_to_ofp_3 = int( device_timestamp_3 ) -\
-                int( timestamp_begin_pt_up )
-
-            main.log.info( "ONOS1 delta G2O: " + str( pt_up_graph_to_ofp_1 ) )
-            main.log.info( "ONOS2 delta G2O: " + str( pt_up_graph_to_ofp_2 ) )
-            main.log.info( "ONOS3 delta G2O: " + str( pt_up_graph_to_ofp_3 ) )
-
-            main.log.info( "ONOS1 delta D2O: " + str( pt_up_device_to_ofp_1 ) )
-            main.log.info( "ONOS2 delta D2O: " + str( pt_up_device_to_ofp_2 ) )
-            main.log.info( "ONOS3 delta D2O: " + str( pt_up_device_to_ofp_3 ) )
-
-            pt_up_graph_to_ofp_avg = \
-                ( int( pt_up_graph_to_ofp_1 ) +
-                  int( pt_up_graph_to_ofp_2 ) +
-                  int( pt_up_graph_to_ofp_3 ) ) / 3
-
-            pt_up_device_to_ofp_avg = \
-                ( int( pt_up_device_to_ofp_1 ) +
-                  int( pt_up_device_to_ofp_2 ) +
-                  int( pt_up_device_to_ofp_3 ) ) / 3
-
-            if pt_up_graph_to_ofp_avg > up_threshold_min and \
-                    pt_up_graph_to_ofp_avg < up_threshold_max:
-                port_up_graph_to_ofp_list.append(
-                    pt_up_graph_to_ofp_avg )
-                main.log.info( "Port down: graph to ofp avg: " +
-                               str( pt_up_graph_to_ofp_avg ) + " ms" )
+            ptUpDeviceToOfp1 = int( deviceTimestamp1 ) -\
+                int( timestampBeginPtUp )
+            
+            if ptUpGraphToOfp1 > upThresholdMin and\
+               ptUpGraphToOfp1 < upThresholdMax and i > iterIgnore:
+                portUpGraphNodeIter[0][i] = ptUpGraphToOfp1
+                main.log.info("iter"+str(i)+" port up graph-to-ofp: "+
+                              str(ptUpGraphToOfp1)+" ms")
             else:
-                main.log.info( "Average port up graph-to-ofp result" +
-                               " exceeded the threshold: " +
-                               str( pt_up_graph_to_ofp_avg ) )
-
-            if pt_up_device_to_ofp_avg > up_threshold_min and \
-                    pt_up_device_to_ofp_avg < up_threshold_max:
-                port_up_device_to_ofp_list.append(
-                    pt_up_device_to_ofp_avg )
-                main.log.info( "Port up: device to ofp avg: " +
-                               str( pt_up_device_to_ofp_avg ) + " ms" )
+                main.log.info("iter"+str(i)+" skipped. Result: "+
+                              str(ptUpGraphToOfp1)+" ms")
+            
+            if ptUpDeviceToOfp1 > upThresholdMin and\
+               ptUpDeviceToOfp1 < upThresholdMax and i > iterIgnore:
+                portUpDevNodeIter[0][i] = ptUpDeviceToOfp1
+                main.log.info("iter"+str(i)+" port up device-to-ofp: "+
+                              str(ptUpDeviceToOfp1)+" ms")
             else:
-                main.log.info( "Average port up device-to-ofp result" +
-                               " exceeded the threshold: " +
-                               str( pt_up_device_to_ofp_avg ) )
+                main.log.info("iter"+str(i)+" skipped. Result: "+
+                              str(ptUpDeviceToOfp1)+" ms")
+
+            if clusterCount >= 3:
+                jsonStrUp2 = main.ONOS2cli.topologyEventsMetrics()
+                jsonStrUp3 = main.ONOS3cli.topologyEventsMetrics()
+                jsonObj2 = json.loads( jsonStrUp2 )
+                jsonObj3 = json.loads( jsonStrUp3 )
+                graphTimestamp2 = \
+                    jsonObj2[ graphTimestamp ][ 'value' ]
+                graphTimestamp3 = \
+                    jsonObj3[ graphTimestamp ][ 'value' ]
+                deviceTimestamp2 = \
+                    jsonObj2[ deviceTimestamp ][ 'value' ]
+                deviceTimestamp3 = \
+                    jsonObj3[ deviceTimestamp ][ 'value' ]
+                ptUpGraphToOfp2 = int( graphTimestamp2 ) -\
+                    int( timestampBeginPtUp )
+                ptUpGraphToOfp3 = int( graphTimestamp3 ) -\
+                    int( timestampBeginPtUp )
+                ptUpDeviceToOfp2 = int( deviceTimestamp2 ) -\
+                    int( timestampBeginPtUp )
+                ptUpDeviceToOfp3 = int( deviceTimestamp3 ) -\
+                    int( timestampBeginPtUp )
+            
+                if ptUpGraphToOfp2 > upThresholdMin and\
+                   ptUpGraphToOfp2 < upThresholdMax and i > iterIgnore:
+                    portUpGraphNodeIter[1][i] = ptUpGraphToOfp2
+                    main.log.info("iter"+str(i)+" port up graph-to-ofp: "+
+                              str(ptUpGraphToOfp2)+" ms")
+            
+                if ptUpDeviceToOfp2 > upThresholdMin and\
+                   ptUpDeviceToOfp2 < upThresholdMax and i > iterIgnore:
+                    portUpDevNodeIter[1][i] = ptUpDeviceToOfp2
+                    main.log.info("iter"+str(i)+" port up device-to-ofp: "+
+                              str(ptUpDeviceToOfp2)+" ms")
+                
+                if ptUpGraphToOfp3 > upThresholdMin and\
+                   ptUpGraphToOfp3 < upThresholdMax and i > iterIgnore:
+                    portUpGraphNodeIter[2][i] = ptUpGraphToOfp3
+                    main.log.info("iter"+str(i)+" port up graph-to-ofp: "+
+                              str(ptUpGraphToOfp3)+" ms")
+            
+                if ptUpDeviceToOfp3 > upThresholdMin and\
+                   ptUpDeviceToOfp3 < upThresholdMax and i > iterIgnore:
+                    portUpDevNodeIter[2][i] = ptUpDeviceToOfp3
+                    main.log.info("iter"+str(i)+" port up device-to-ofp: "+
+                              str(ptUpDeviceToOfp3)+" ms")
+
+            if clusterCount >= 5:
+                jsonStrUp4 = main.ONOS4cli.topologyEventsMetrics()
+                jsonStrUp5 = main.ONOS5cli.topologyEventsMetrics()
+                jsonObj4 = json.loads( jsonStrUp4 )
+                jsonObj5 = json.loads( jsonStrUp5 )
+                graphTimestamp4 = \
+                    jsonObj4[ graphTimestamp ][ 'value' ]
+                graphTimestamp5 = \
+                    jsonObj5[ graphTimestamp ][ 'value' ]
+                deviceTimestamp4 = \
+                    jsonObj4[ deviceTimestamp ][ 'value' ]
+                deviceTimestamp5 = \
+                    jsonObj5[ deviceTimestamp ][ 'value' ]
+                ptUpGraphToOfp4 = int( graphTimestamp4 ) -\
+                    int( timestampBeginPtUp )
+                ptUpGraphToOfp5 = int( graphTimestamp5 ) -\
+                    int( timestampBeginPtUp )
+                ptUpDeviceToOfp4 = int( deviceTimestamp4 ) -\
+                    int( timestampBeginPtUp )
+                ptUpDeviceToOfp5 = int( deviceTimestamp5 ) -\
+                    int( timestampBeginPtUp )
+                
+                if ptUpGraphToOfp4 > upThresholdMin and\
+                   ptUpGraphToOfp4 < upThresholdMax and i > iterIgnore:
+                    portUpGraphNodeIter[3][i] = ptUpGraphToOfp4
+                    main.log.info("iter"+str(i)+" port up graph-to-ofp: "+
+                              str(ptUpGraphToOfp4)+" ms")
+            
+                if ptUpDeviceToOfp4 > upThresholdMin and\
+                   ptUpDeviceToOfp4 < upThresholdMax and i > iterIgnore:
+                    portUpDevNodeIter[3][i] = ptUpDeviceToOfp4
+                    main.log.info("iter"+str(i)+" port up device-to-ofp: "+
+                              str(ptUpDeviceToOfp4)+" ms")
+                
+                if ptUpGraphToOfp5 > upThresholdMin and\
+                   ptUpGraphToOfp5 < upThresholdMax and i > iterIgnore:
+                    portUpGraphNodeIter[4][i] = ptUpGraphToOfp5
+                    main.log.info("iter"+str(i)+" port up graph-to-ofp: "+
+                              str(ptUpGraphToOfp5)+" ms")
+            
+                if ptUpDeviceToOfp5 > upThresholdMin and\
+                   ptUpDeviceToOfp5 < upThresholdMax and i > iterIgnore:
+                    portUpDevNodeIter[4][i] = ptUpDeviceToOfp5
+                    main.log.info("iter"+str(i)+" port up device-to-ofp: "+
+                              str(ptUpDeviceToOfp5)+" ms")
+
+            if clusterCount >= 7:
+                jsonStrUp6 = main.ONOS6cli.topologyEventsMetrics()
+                jsonStrUp7 = main.ONOS7cli.topologyEventsMetrics()
+                jsonObj6 = json.loads( jsonStrUp6 )
+                jsonObj7 = json.loads( jsonStrUp7 )
+                graphTimestamp6 = \
+                    jsonObj6[ graphTimestamp ][ 'value' ]
+                graphTimestamp7 = \
+                    jsonObj7[ graphTimestamp ][ 'value' ]
+                deviceTimestamp6 = \
+                    jsonObj6[ deviceTimestamp ][ 'value' ]
+                deviceTimestamp7 = \
+                    jsonObj7[ deviceTimestamp ][ 'value' ]
+                ptUpGraphToOfp6 = int( graphTimestamp6 ) -\
+                    int( timestampBeginPtUp )
+                ptUpGraphToOfp7 = int( graphTimestamp7 ) -\
+                    int( timestampBeginPtUp )
+                ptUpDeviceToOfp6 = int( deviceTimestamp6 ) -\
+                    int( timestampBeginPtUp )
+                ptUpDeviceToOfp7 = int( deviceTimestamp7 ) -\
+                    int( timestampBeginPtUp )
+                
+                if ptUpGraphToOfp6 > upThresholdMin and\
+                   ptUpGraphToOfp6 < upThresholdMax and i > iterIgnore:
+                    portUpGraphNodeIter[5][i] = ptUpGraphToOfp6
+                    main.log.info("iter"+str(i)+" port up graph-to-ofp: "+
+                              str(ptUpGraphToOfp6)+" ms")
+            
+                if ptUpDeviceToOfp6 > upThresholdMin and\
+                   ptUpDeviceToOfp6 < upThresholdMax and i > iterIgnore:
+                    portUpDevNodeIter[5][i] = ptUpDeviceToOfp6
+                    main.log.info("iter"+str(i)+" port up device-to-ofp: "+
+                              str(ptUpDeviceToOfp6)+" ms")
+                
+                if ptUpGraphToOfp7 > upThresholdMin and\
+                   ptUpGraphToOfp7 < upThresholdMax and i > iterIgnore:
+                    portUpGraphNodeIter[6][i] = ptUpGraphToOfp7
+                    main.log.info("iter"+str(i)+" port up graph-to-ofp: "+
+                              str(ptUpGraphToOfp7)+" ms")
+            
+                if ptUpDeviceToOfp7 > upThresholdMin and\
+                   ptUpDeviceToOfp7 < upThresholdMax and i > iterIgnore:
+                    portUpDevNodeIter[6][i] = ptUpDeviceToOfp7
+                    main.log.info("iter"+str(i)+" port up device-to-ofp: "+
+                              str(ptUpDeviceToOfp7)+" ms")
 
             # END ITERATION FOR LOOP
+        
+        portUpDevList = []
+        portUpGraphList = []
+        portDownDevList = []
+        portDownGraphList = []
 
-        # Check all list for latency existence and set assertion
-        if ( port_down_graph_to_ofp_list and port_down_device_to_ofp_list
-                and port_up_graph_to_ofp_list and port_up_device_to_ofp_list ):
-            assertion = main.TRUE
+        portUpDevAvg = 0
+        portUpGraphAvg = 0
+        portDownDevAvg = 0
+        portDownGraphAvg = 0
 
-        # Calculate and report latency measurements
-        port_down_graph_to_ofp_min = min( port_down_graph_to_ofp_list )
-        port_down_graph_to_ofp_max = max( port_down_graph_to_ofp_list )
-        port_down_graph_to_ofp_avg = \
-            ( sum( port_down_graph_to_ofp_list ) /
-              len( port_down_graph_to_ofp_list ) )
-        port_down_graph_to_ofp_std_dev = \
-            str( round( numpy.std( port_down_graph_to_ofp_list ), 1 ) )
+        dbCmdList = []
 
-        main.log.report(
-            "Port down graph-to-ofp " +
-            "Avg: " +
-            str( port_down_graph_to_ofp_avg ) +
-            " ms " +
-            "Std Deviation: " +
-            port_down_graph_to_ofp_std_dev +
-            " ms" )
+        for node in range( 0, clusterCount ):
 
-        port_down_device_to_ofp_min = min( port_down_device_to_ofp_list )
-        port_down_device_to_ofp_max = max( port_down_device_to_ofp_list )
-        port_down_device_to_ofp_avg = \
-            ( sum( port_down_device_to_ofp_list ) /
-              len( port_down_device_to_ofp_list ) )
-        port_down_device_to_ofp_std_dev = \
-            str( round( numpy.std( port_down_device_to_ofp_list ), 1 ) )
+            # NOTE: 
+            # Currently the 2d array is initialized with 0's. 
+            # We want to avoid skewing our results if the array
+            # was not modified with the correct latency.
+            for item in portUpDevNodeIter[node]:
+                if item > 0.0:
+                    portUpDevList.append(item)
+            for item in portUpGraphNodeIter[node]:
+                if item > 0.0:
+                    portUpGraphList.append(item)
+            for item in portDownDevNodeIter[node]:
+                if item > 0.0:
+                    portDownDevList.append(item)
+            for item in portDownGraphNodeIter[node]:
+                if item > 0.0:
+                    portDownGraphList.append(item)
+       
+            portUpDevAvg = round(numpy.mean(portUpDevList), 2)
+            portUpGraphAvg = round(numpy.mean(portUpGraphList), 2)
+            portDownDevAvg = round(numpy.mean(portDownDevList), 2)
+            portDownGraphAvg = round(numpy.mean(portDownGraphList), 2)
 
-        main.log.report(
-            "Port down device-to-ofp " +
-            "Avg: " +
-            str( port_down_device_to_ofp_avg ) +
-            " ms " +
-            "Std Deviation: " +
-            port_down_device_to_ofp_std_dev +
-            " ms" )
+            portUpStdDev = round(numpy.std(portUpGraphList),2)
+            portDownStdDev = round(numpy.std(portDownGraphList),2)
 
-        port_up_graph_to_ofp_min = min( port_up_graph_to_ofp_list )
-        port_up_graph_to_ofp_max = max( port_up_graph_to_ofp_list )
-        port_up_graph_to_ofp_avg = \
-            ( sum( port_up_graph_to_ofp_list ) /
-              len( port_up_graph_to_ofp_list ) )
-        port_up_graph_to_ofp_std_dev = \
-            str( round( numpy.std( port_up_graph_to_ofp_list ), 1 ) )
+            main.log.report( " - Node "+str(node+1)+" Summary - " )
+            #main.log.report( " Port up ofp-to-device "+
+            #                 str(round(portUpDevAvg, 2))+" ms")
+            main.log.report( " Port up ofp-to-graph "+
+                             str(portUpGraphAvg)+" ms")
+            #main.log.report( " Port down ofp-to-device "+
+            #                 str(round(portDownDevAvg, 2))+" ms")
+            main.log.report( " Port down ofp-to-graph "+
+                             str(portDownGraphAvg)+" ms")
+       
+            dbCmdList.append(
+                "INSERT INTO port_latency_tests VALUES("
+                   "'"+timeToPost+"','port_latency_results',"
+                   ""+runNum+","+str(clusterCount)+",'baremetal"+str(node+1)+"',"
+                   ""+str(portUpGraphAvg)+","+str(portUpStdDev)+
+                   ","+str(portDownGraphAvg)+","+str(portDownStdDev)+");"
+            )
+        
+        #Write to file for posting to DB
+        fResult = open(resultPath, 'a')
+        for line in dbCmdList:
+            if line:
+                fResult.write(line+"\n")
+        fResult.close()
 
-        main.log.report(
-            "Port up graph-to-ofp " +
-            "Avg: " +
-            str( port_up_graph_to_ofp_avg ) +
-            " ms " +
-            "Std Deviation: " +
-            port_up_graph_to_ofp_std_dev +
-            " ms" )
+        print dbCmdList
 
-        port_up_device_to_ofp_min = min( port_up_device_to_ofp_list )
-        port_up_device_to_ofp_max = max( port_up_device_to_ofp_list )
-        port_up_device_to_ofp_avg = \
-            ( sum( port_up_device_to_ofp_list ) /
-              len( port_up_device_to_ofp_list ) )
-        port_up_device_to_ofp_std_dev = \
-            str( round( numpy.std( port_up_device_to_ofp_list ), 1 ) )
+        # Remove switches from controller for next test
+        main.Mininet1.deleteSwController( "s1" )
+        main.Mininet1.deleteSwController( "s2" )
 
-        main.log.report(
-            "Port up device-to-ofp " +
-            "Avg: " +
-            str( port_up_device_to_ofp_avg ) +
-            " ms " +
-            "Std Deviation: " +
-            port_up_device_to_ofp_std_dev +
-            " ms" )
+        #TODO: correct assertion
 
         utilities.assert_equals(
             expect=main.TRUE,
@@ -986,15 +1258,15 @@
         import json
         import numpy
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        ONOS_user = main.params[ 'CTRL' ][ 'user' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOSUser = main.params[ 'CTRL' ][ 'user' ]
 
-        default_sw_port = main.params[ 'CTRL' ][ 'port1' ]
+        defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
 
         # Number of iterations of case
-        num_iter = main.params[ 'TEST' ][ 'numIter' ]
+        numIter = main.params[ 'TEST' ][ 'numIter' ]
 
         # Timestamp 'keys' for json metrics output.
         # These are subject to change, hence moved into params
@@ -1002,68 +1274,65 @@
         linkTimestamp = main.params[ 'JSON' ][ 'linkTimestamp' ]
         graphTimestamp = main.params[ 'JSON' ][ 'graphTimestamp' ]
 
-        debug_mode = main.params[ 'TEST' ][ 'debugMode' ]
+        debugMode = main.params[ 'TEST' ][ 'debugMode' ]
 
-        local_time = time.strftime( '%x %X' )
-        local_time = local_time.replace( "/", "" )
-        local_time = local_time.replace( " ", "_" )
-        local_time = local_time.replace( ":", "" )
-        if debug_mode == 'on':
-            main.ONOS1.tshark_pcap( "eth0",
-                                    "/tmp/link_lat_pcap_" + local_time )
+        localTime = time.strftime( '%x %X' )
+        localTime = localTime.replace( "/", "" )
+        localTime = localTime.replace( " ", "_" )
+        localTime = localTime.replace( ":", "" )
+        if debugMode == 'on':
+            main.ONOS1.tsharkPcap( "eth0",
+                                   "/tmp/link_lat_pcap_" + localTime )
 
         # Threshold for this test case
-        up_threshold_str = main.params[ 'TEST' ][ 'linkUpThreshold' ]
-        down_threshold_str = main.params[ 'TEST' ][ 'linkDownThreshold' ]
+        upThresholdStr = main.params[ 'TEST' ][ 'linkUpThreshold' ]
+        downThresholdStr = main.params[ 'TEST' ][ 'linkDownThreshold' ]
 
-        up_threshold_obj = up_threshold_str.split( "," )
-        down_threshold_obj = down_threshold_str.split( "," )
+        upThresholdObj = upThresholdStr.split( "," )
+        downThresholdObj = downThresholdStr.split( "," )
 
-        up_threshold_min = int( up_threshold_obj[ 0 ] )
-        up_threshold_max = int( up_threshold_obj[ 1 ] )
+        upThresholdMin = int( upThresholdObj[ 0 ] )
+        upThresholdMax = int( upThresholdObj[ 1 ] )
 
-        down_threshold_min = int( down_threshold_obj[ 0 ] )
-        down_threshold_max = int( down_threshold_obj[ 1 ] )
+        downThresholdMin = int( downThresholdObj[ 0 ] )
+        downThresholdMax = int( downThresholdObj[ 1 ] )
 
         assertion = main.TRUE
         # Link event timestamp to system time list
-        link_down_link_to_system_list = []
-        link_up_link_to_system_list = []
+        linkDownLinkToSystemList = []
+        linkUpLinkToSystemList = []
         # Graph event timestamp to system time list
-        link_down_graph_to_system_list = []
-        link_up_graph_to_system_list = []
+        linkDownGraphToSystemList = []
+        linkUpGraphToSystemList = []
 
         main.log.report( "Link up / down discovery latency between " +
                          "two switches" )
         main.log.report( "Simulated by setting loss-rate 100%" )
         main.log.report( "'tc qdisc add dev <intfs> root netem loss 100%'" )
-        main.log.report( "Total iterations of test: " + str( num_iter ) )
+        main.log.report( "Total iterations of test: " + str( numIter ) )
 
         main.step( "Assign all switches" )
-        main.Mininet1.assign_sw_controller(
-            sw="1",
-            ip1=ONOS1_ip,
-            port1=default_sw_port )
-        main.Mininet1.assign_sw_controller(
-            sw="2",
-            ip1=ONOS1_ip,
-            port1=default_sw_port )
+        main.Mininet1.assignSwController( sw="1",
+                                           ip1=ONOS1Ip, port1=defaultSwPort )
+        main.Mininet1.assignSwController( sw="2",
+                                           ip1=ONOS1Ip, port1=defaultSwPort )
 
         main.step( "Verifying switch assignment" )
-        result_s1 = main.Mininet1.get_sw_controller( sw="s1" )
-        result_s2 = main.Mininet1.get_sw_controller( sw="s2" )
+        resultS1 = main.Mininet1.getSwController( sw="s1" )
+        resultS2 = main.Mininet1.getSwController( sw="s2" )
 
         # Allow time for events to finish before taking measurements
         time.sleep( 10 )
 
-        link_down1 = False
-        link_down2 = False
-        link_down3 = False
+        linkDown1 = False
+        linkDown2 = False
+        linkDown3 = False
         # Start iteration of link event test
-        for i in range( 0, int( num_iter ) ):
+        for i in range( 0, int( numIter ) ):
             main.step( "Getting initial system time as t0" )
 
-            timestamp_link_down_t0 = time.time() * 1000
+            # System time in epoch ms
+            timestampLinkDownT0 = time.time() * 1000
             # Link down is simulated by 100% loss rate using traffic
             # control command
             main.Mininet1.handle.sendline(
@@ -1073,37 +1342,37 @@
             #      link s1 -> s2 went down ( loop timeout 30 seconds )
             #      on all 3 ONOS instances
             main.log.info( "Checking ONOS for link update" )
-            loop_count = 0
-            while( not ( link_down1 and link_down2 and link_down3 )
-                    and loop_count < 30 ):
-                json_str1 = main.ONOS1cli.links()
-                json_str2 = main.ONOS2cli.links()
-                json_str3 = main.ONOS3cli.links()
+            loopCount = 0
+            while( not ( linkDown1 and linkDown2 and linkDown3 )
+                    and loopCount < 30 ):
+                jsonStr1 = main.ONOS1cli.links()
+                jsonStr2 = main.ONOS2cli.links()
+                jsonStr3 = main.ONOS3cli.links()
 
-                if not ( json_str1 and json_str2 and json_str3 ):
+                if not ( jsonStr1 and jsonStr2 and jsonStr3 ):
                     main.log.error( "CLI command returned error " )
                     break
                 else:
-                    json_obj1 = json.loads( json_str1 )
-                    json_obj2 = json.loads( json_str2 )
-                    json_obj3 = json.loads( json_str3 )
-                for obj1 in json_obj1:
+                    jsonObj1 = json.loads( jsonStr1 )
+                    jsonObj2 = json.loads( jsonStr2 )
+                    jsonObj3 = json.loads( jsonStr3 )
+                for obj1 in jsonObj1:
                     if '01' not in obj1[ 'src' ][ 'device' ]:
-                        link_down1 = True
+                        linkDown1 = True
                         main.log.info( "Link down from " +
                                        "s1 -> s2 on ONOS1 detected" )
-                for obj2 in json_obj2:
+                for obj2 in jsonObj2:
                     if '01' not in obj2[ 'src' ][ 'device' ]:
-                        link_down2 = True
+                        linkDown2 = True
                         main.log.info( "Link down from " +
                                        "s1 -> s2 on ONOS2 detected" )
-                for obj3 in json_obj3:
+                for obj3 in jsonObj3:
                     if '01' not in obj3[ 'src' ][ 'device' ]:
-                        link_down3 = True
+                        linkDown3 = True
                         main.log.info( "Link down from " +
                                        "s1 -> s2 on ONOS3 detected" )
 
-                loop_count += 1
+                loopCount += 1
                 # If CLI doesn't like the continuous requests
                 # and exits in this loop, increase the sleep here.
                 # Consequently, while loop timeout will increase
@@ -1114,113 +1383,113 @@
             time.sleep( 10 )
             # If we exited the while loop and link down 1,2,3 are still
             # false, then ONOS has failed to discover link down event
-            if not ( link_down1 and link_down2 and link_down3 ):
+            if not ( linkDown1 and linkDown2 and linkDown3 ):
                 main.log.info( "Link down discovery failed" )
 
-                link_down_lat_graph1 = 0
-                link_down_lat_graph2 = 0
-                link_down_lat_graph3 = 0
-                link_down_lat_device1 = 0
-                link_down_lat_device2 = 0
-                link_down_lat_device3 = 0
+                linkDownLatGraph1 = 0
+                linkDownLatGraph2 = 0
+                linkDownLatGraph3 = 0
+                linkDownLatDevice1 = 0
+                linkDownLatDevice2 = 0
+                linkDownLatDevice3 = 0
 
                 assertion = main.FALSE
             else:
-                json_topo_metrics_1 =\
-                    main.ONOS1cli.topology_events_metrics()
-                json_topo_metrics_2 =\
-                    main.ONOS2cli.topology_events_metrics()
-                json_topo_metrics_3 =\
-                    main.ONOS3cli.topology_events_metrics()
-                json_topo_metrics_1 = json.loads( json_topo_metrics_1 )
-                json_topo_metrics_2 = json.loads( json_topo_metrics_2 )
-                json_topo_metrics_3 = json.loads( json_topo_metrics_3 )
+                jsonTopoMetrics1 =\
+                    main.ONOS1cli.topologyEventsMetrics()
+                jsonTopoMetrics2 =\
+                    main.ONOS2cli.topologyEventsMetrics()
+                jsonTopoMetrics3 =\
+                    main.ONOS3cli.topologyEventsMetrics()
+                jsonTopoMetrics1 = json.loads( jsonTopoMetrics1 )
+                jsonTopoMetrics2 = json.loads( jsonTopoMetrics2 )
+                jsonTopoMetrics3 = json.loads( jsonTopoMetrics3 )
 
                 main.log.info( "Obtaining graph and device timestamp" )
-                graph_timestamp_1 = \
-                    json_topo_metrics_1[ graphTimestamp ][ 'value' ]
-                graph_timestamp_2 = \
-                    json_topo_metrics_2[ graphTimestamp ][ 'value' ]
-                graph_timestamp_3 = \
-                    json_topo_metrics_3[ graphTimestamp ][ 'value' ]
+                graphTimestamp1 = \
+                    jsonTopoMetrics1[ graphTimestamp ][ 'value' ]
+                graphTimestamp2 = \
+                    jsonTopoMetrics2[ graphTimestamp ][ 'value' ]
+                graphTimestamp3 = \
+                    jsonTopoMetrics3[ graphTimestamp ][ 'value' ]
 
-                link_timestamp_1 = \
-                    json_topo_metrics_1[ linkTimestamp ][ 'value' ]
-                link_timestamp_2 = \
-                    json_topo_metrics_2[ linkTimestamp ][ 'value' ]
-                link_timestamp_3 = \
-                    json_topo_metrics_3[ linkTimestamp ][ 'value' ]
+                linkTimestamp1 = \
+                    jsonTopoMetrics1[ linkTimestamp ][ 'value' ]
+                linkTimestamp2 = \
+                    jsonTopoMetrics2[ linkTimestamp ][ 'value' ]
+                linkTimestamp3 = \
+                    jsonTopoMetrics3[ linkTimestamp ][ 'value' ]
 
-                if graph_timestamp_1 and graph_timestamp_2 and\
-                        graph_timestamp_3 and link_timestamp_1 and\
-                        link_timestamp_2 and link_timestamp_3:
-                    link_down_lat_graph1 = int( graph_timestamp_1 ) -\
-                        int( timestamp_link_down_t0 )
-                    link_down_lat_graph2 = int( graph_timestamp_2 ) -\
-                        int( timestamp_link_down_t0 )
-                    link_down_lat_graph3 = int( graph_timestamp_3 ) -\
-                        int( timestamp_link_down_t0 )
+                if graphTimestamp1 and graphTimestamp2 and\
+                        graphTimestamp3 and linkTimestamp1 and\
+                        linkTimestamp2 and linkTimestamp3:
+                    linkDownLatGraph1 = int( graphTimestamp1 ) -\
+                        int( timestampLinkDownT0 )
+                    linkDownLatGraph2 = int( graphTimestamp2 ) -\
+                        int( timestampLinkDownT0 )
+                    linkDownLatGraph3 = int( graphTimestamp3 ) -\
+                        int( timestampLinkDownT0 )
 
-                    link_down_lat_link1 = int( link_timestamp_1 ) -\
-                        int( timestamp_link_down_t0 )
-                    link_down_lat_link2 = int( link_timestamp_2 ) -\
-                        int( timestamp_link_down_t0 )
-                    link_down_lat_link3 = int( link_timestamp_3 ) -\
-                        int( timestamp_link_down_t0 )
+                    linkDownLatLink1 = int( linkTimestamp1 ) -\
+                        int( timestampLinkDownT0 )
+                    linkDownLatLink2 = int( linkTimestamp2 ) -\
+                        int( timestampLinkDownT0 )
+                    linkDownLatLink3 = int( linkTimestamp3 ) -\
+                        int( timestampLinkDownT0 )
                 else:
                     main.log.error( "There was an error calculating" +
                                     " the delta for link down event" )
-                    link_down_lat_graph1 = 0
-                    link_down_lat_graph2 = 0
-                    link_down_lat_graph3 = 0
+                    linkDownLatGraph1 = 0
+                    linkDownLatGraph2 = 0
+                    linkDownLatGraph3 = 0
 
-                    link_down_lat_device1 = 0
-                    link_down_lat_device2 = 0
-                    link_down_lat_device3 = 0
+                    linkDownLatDevice1 = 0
+                    linkDownLatDevice2 = 0
+                    linkDownLatDevice3 = 0
 
             main.log.info( "Link down latency ONOS1 iteration " +
                            str( i ) + " (end-to-end): " +
-                           str( link_down_lat_graph1 ) + " ms" )
+                           str( linkDownLatGraph1 ) + " ms" )
             main.log.info( "Link down latency ONOS2 iteration " +
                            str( i ) + " (end-to-end): " +
-                           str( link_down_lat_graph2 ) + " ms" )
+                           str( linkDownLatGraph2 ) + " ms" )
             main.log.info( "Link down latency ONOS3 iteration " +
                            str( i ) + " (end-to-end): " +
-                           str( link_down_lat_graph3 ) + " ms" )
+                           str( linkDownLatGraph3 ) + " ms" )
 
             main.log.info( "Link down latency ONOS1 iteration " +
                            str( i ) + " (link-event-to-system-timestamp): " +
-                           str( link_down_lat_link1 ) + " ms" )
+                           str( linkDownLatLink1 ) + " ms" )
             main.log.info( "Link down latency ONOS2 iteration " +
                            str( i ) + " (link-event-to-system-timestamp): " +
-                           str( link_down_lat_link2 ) + " ms" )
+                           str( linkDownLatLink2 ) + " ms" )
             main.log.info( "Link down latency ONOS3 iteration " +
                            str( i ) + " (link-event-to-system-timestamp): " +
-                           str( link_down_lat_link3 ) )
+                           str( linkDownLatLink3 ) )
 
             # Calculate avg of node calculations
-            link_down_lat_graph_avg =\
-                ( link_down_lat_graph1 +
-                  link_down_lat_graph2 +
-                  link_down_lat_graph3 ) / 3
-            link_down_lat_link_avg =\
-                ( link_down_lat_link1 +
-                  link_down_lat_link2 +
-                  link_down_lat_link3 ) / 3
+            linkDownLatGraphAvg =\
+                ( linkDownLatGraph1 +
+                  linkDownLatGraph2 +
+                  linkDownLatGraph3 ) / 3
+            linkDownLatLinkAvg =\
+                ( linkDownLatLink1 +
+                  linkDownLatLink2 +
+                  linkDownLatLink3 ) / 3
 
             # Set threshold and append latency to list
-            if link_down_lat_graph_avg > down_threshold_min and\
-               link_down_lat_graph_avg < down_threshold_max:
-                link_down_graph_to_system_list.append(
-                    link_down_lat_graph_avg )
+            if linkDownLatGraphAvg > downThresholdMin and\
+               linkDownLatGraphAvg < downThresholdMax:
+                linkDownGraphToSystemList.append(
+                    linkDownLatGraphAvg )
             else:
                 main.log.info( "Link down latency exceeded threshold" )
                 main.log.info( "Results for iteration " + str( i ) +
                                "have been omitted" )
-            if link_down_lat_link_avg > down_threshold_min and\
-               link_down_lat_link_avg < down_threshold_max:
-                link_down_link_to_system_list.append(
-                    link_down_lat_link_avg )
+            if linkDownLatLinkAvg > downThresholdMin and\
+               linkDownLatLinkAvg < downThresholdMax:
+                linkDownLinkToSystemList.append(
+                    linkDownLatLinkAvg )
             else:
                 main.log.info( "Link down latency exceeded threshold" )
                 main.log.info( "Results for iteration " + str( i ) +
@@ -1228,190 +1497,190 @@
 
             # NOTE: To remove loss rate and measure latency:
             #       'sh tc qdisc del dev s1-eth1 root'
-            timestamp_link_up_t0 = time.time() * 1000
+            timestampLinkUpT0 = time.time() * 1000
             main.Mininet1.handle.sendline( "sh tc qdisc del dev " +
                                            "s1-eth1 root" )
             main.Mininet1.handle.expect( "mininet>" )
 
             main.log.info( "Checking ONOS for link update" )
 
-            link_down1 = True
-            link_down2 = True
-            link_down3 = True
-            loop_count = 0
-            while( ( link_down1 and link_down2 and link_down3 )
-                    and loop_count < 30 ):
-                json_str1 = main.ONOS1cli.links()
-                json_str2 = main.ONOS2cli.links()
-                json_str3 = main.ONOS3cli.links()
-                if not ( json_str1 and json_str2 and json_str3 ):
+            linkDown1 = True
+            linkDown2 = True
+            linkDown3 = True
+            loopCount = 0
+            while( ( linkDown1 and linkDown2 and linkDown3 )
+                    and loopCount < 30 ):
+                jsonStr1 = main.ONOS1cli.links()
+                jsonStr2 = main.ONOS2cli.links()
+                jsonStr3 = main.ONOS3cli.links()
+                if not ( jsonStr1 and jsonStr2 and jsonStr3 ):
                     main.log.error( "CLI command returned error " )
                     break
                 else:
-                    json_obj1 = json.loads( json_str1 )
-                    json_obj2 = json.loads( json_str2 )
-                    json_obj3 = json.loads( json_str3 )
+                    jsonObj1 = json.loads( jsonStr1 )
+                    jsonObj2 = json.loads( jsonStr2 )
+                    jsonObj3 = json.loads( jsonStr3 )
 
-                for obj1 in json_obj1:
+                for obj1 in jsonObj1:
                     if '01' in obj1[ 'src' ][ 'device' ]:
-                        link_down1 = False
+                        linkDown1 = False
                         main.log.info( "Link up from " +
                                        "s1 -> s2 on ONOS1 detected" )
-                for obj2 in json_obj2:
+                for obj2 in jsonObj2:
                     if '01' in obj2[ 'src' ][ 'device' ]:
-                        link_down2 = False
+                        linkDown2 = False
                         main.log.info( "Link up from " +
                                        "s1 -> s2 on ONOS2 detected" )
-                for obj3 in json_obj3:
+                for obj3 in jsonObj3:
                     if '01' in obj3[ 'src' ][ 'device' ]:
-                        link_down3 = False
+                        linkDown3 = False
                         main.log.info( "Link up from " +
                                        "s1 -> s2 on ONOS3 detected" )
 
-                loop_count += 1
+                loopCount += 1
                 time.sleep( 1 )
 
-            if ( link_down1 and link_down2 and link_down3 ):
+            if ( linkDown1 and linkDown2 and linkDown3 ):
                 main.log.info( "Link up discovery failed" )
 
-                link_up_lat_graph1 = 0
-                link_up_lat_graph2 = 0
-                link_up_lat_graph3 = 0
-                link_up_lat_device1 = 0
-                link_up_lat_device2 = 0
-                link_up_lat_device3 = 0
+                linkUpLatGraph1 = 0
+                linkUpLatGraph2 = 0
+                linkUpLatGraph3 = 0
+                linkUpLatDevice1 = 0
+                linkUpLatDevice2 = 0
+                linkUpLatDevice3 = 0
 
                 assertion = main.FALSE
             else:
-                json_topo_metrics_1 =\
-                    main.ONOS1cli.topology_events_metrics()
-                json_topo_metrics_2 =\
-                    main.ONOS2cli.topology_events_metrics()
-                json_topo_metrics_3 =\
-                    main.ONOS3cli.topology_events_metrics()
-                json_topo_metrics_1 = json.loads( json_topo_metrics_1 )
-                json_topo_metrics_2 = json.loads( json_topo_metrics_2 )
-                json_topo_metrics_3 = json.loads( json_topo_metrics_3 )
+                jsonTopoMetrics1 =\
+                    main.ONOS1cli.topologyEventsMetrics()
+                jsonTopoMetrics2 =\
+                    main.ONOS2cli.topologyEventsMetrics()
+                jsonTopoMetrics3 =\
+                    main.ONOS3cli.topologyEventsMetrics()
+                jsonTopoMetrics1 = json.loads( jsonTopoMetrics1 )
+                jsonTopoMetrics2 = json.loads( jsonTopoMetrics2 )
+                jsonTopoMetrics3 = json.loads( jsonTopoMetrics3 )
 
                 main.log.info( "Obtaining graph and device timestamp" )
-                graph_timestamp_1 = \
-                    json_topo_metrics_1[ graphTimestamp ][ 'value' ]
-                graph_timestamp_2 = \
-                    json_topo_metrics_2[ graphTimestamp ][ 'value' ]
-                graph_timestamp_3 = \
-                    json_topo_metrics_3[ graphTimestamp ][ 'value' ]
+                graphTimestamp1 = \
+                    jsonTopoMetrics1[ graphTimestamp ][ 'value' ]
+                graphTimestamp2 = \
+                    jsonTopoMetrics2[ graphTimestamp ][ 'value' ]
+                graphTimestamp3 = \
+                    jsonTopoMetrics3[ graphTimestamp ][ 'value' ]
 
-                link_timestamp_1 = \
-                    json_topo_metrics_1[ linkTimestamp ][ 'value' ]
-                link_timestamp_2 = \
-                    json_topo_metrics_2[ linkTimestamp ][ 'value' ]
-                link_timestamp_3 = \
-                    json_topo_metrics_3[ linkTimestamp ][ 'value' ]
+                linkTimestamp1 = \
+                    jsonTopoMetrics1[ linkTimestamp ][ 'value' ]
+                linkTimestamp2 = \
+                    jsonTopoMetrics2[ linkTimestamp ][ 'value' ]
+                linkTimestamp3 = \
+                    jsonTopoMetrics3[ linkTimestamp ][ 'value' ]
 
-                if graph_timestamp_1 and graph_timestamp_2 and\
-                        graph_timestamp_3 and link_timestamp_1 and\
-                        link_timestamp_2 and link_timestamp_3:
-                    link_up_lat_graph1 = int( graph_timestamp_1 ) -\
-                        int( timestamp_link_up_t0 )
-                    link_up_lat_graph2 = int( graph_timestamp_2 ) -\
-                        int( timestamp_link_up_t0 )
-                    link_up_lat_graph3 = int( graph_timestamp_3 ) -\
-                        int( timestamp_link_up_t0 )
+                if graphTimestamp1 and graphTimestamp2 and\
+                        graphTimestamp3 and linkTimestamp1 and\
+                        linkTimestamp2 and linkTimestamp3:
+                    linkUpLatGraph1 = int( graphTimestamp1 ) -\
+                        int( timestampLinkUpT0 )
+                    linkUpLatGraph2 = int( graphTimestamp2 ) -\
+                        int( timestampLinkUpT0 )
+                    linkUpLatGraph3 = int( graphTimestamp3 ) -\
+                        int( timestampLinkUpT0 )
 
-                    link_up_lat_link1 = int( link_timestamp_1 ) -\
-                        int( timestamp_link_up_t0 )
-                    link_up_lat_link2 = int( link_timestamp_2 ) -\
-                        int( timestamp_link_up_t0 )
-                    link_up_lat_link3 = int( link_timestamp_3 ) -\
-                        int( timestamp_link_up_t0 )
+                    linkUpLatLink1 = int( linkTimestamp1 ) -\
+                        int( timestampLinkUpT0 )
+                    linkUpLatLink2 = int( linkTimestamp2 ) -\
+                        int( timestampLinkUpT0 )
+                    linkUpLatLink3 = int( linkTimestamp3 ) -\
+                        int( timestampLinkUpT0 )
                 else:
                     main.log.error( "There was an error calculating" +
                                     " the delta for link down event" )
-                    link_up_lat_graph1 = 0
-                    link_up_lat_graph2 = 0
-                    link_up_lat_graph3 = 0
+                    linkUpLatGraph1 = 0
+                    linkUpLatGraph2 = 0
+                    linkUpLatGraph3 = 0
 
-                    link_up_lat_device1 = 0
-                    link_up_lat_device2 = 0
-                    link_up_lat_device3 = 0
+                    linkUpLatDevice1 = 0
+                    linkUpLatDevice2 = 0
+                    linkUpLatDevice3 = 0
 
-            if debug_mode == 'on':
+            if debugMode == 'on':
                 main.log.info( "Link up latency ONOS1 iteration " +
                                str( i ) + " (end-to-end): " +
-                               str( link_up_lat_graph1 ) + " ms" )
+                               str( linkUpLatGraph1 ) + " ms" )
                 main.log.info( "Link up latency ONOS2 iteration " +
                                str( i ) + " (end-to-end): " +
-                               str( link_up_lat_graph2 ) + " ms" )
+                               str( linkUpLatGraph2 ) + " ms" )
                 main.log.info( "Link up latency ONOS3 iteration " +
                                str( i ) + " (end-to-end): " +
-                               str( link_up_lat_graph3 ) + " ms" )
+                               str( linkUpLatGraph3 ) + " ms" )
 
                 main.log.info(
                     "Link up latency ONOS1 iteration " +
                     str( i ) +
                     " (link-event-to-system-timestamp): " +
-                    str( link_up_lat_link1 ) +
+                    str( linkUpLatLink1 ) +
                     " ms" )
                 main.log.info(
                     "Link up latency ONOS2 iteration " +
                     str( i ) +
                     " (link-event-to-system-timestamp): " +
-                    str( link_up_lat_link2 ) +
+                    str( linkUpLatLink2 ) +
                     " ms" )
                 main.log.info(
                     "Link up latency ONOS3 iteration " +
                     str( i ) +
                     " (link-event-to-system-timestamp): " +
-                    str( link_up_lat_link3 ) )
+                    str( linkUpLatLink3 ) )
 
             # Calculate avg of node calculations
-            link_up_lat_graph_avg =\
-                ( link_up_lat_graph1 +
-                  link_up_lat_graph2 +
-                  link_up_lat_graph3 ) / 3
-            link_up_lat_link_avg =\
-                ( link_up_lat_link1 +
-                  link_up_lat_link2 +
-                  link_up_lat_link3 ) / 3
+            linkUpLatGraphAvg =\
+                ( linkUpLatGraph1 +
+                  linkUpLatGraph2 +
+                  linkUpLatGraph3 ) / 3
+            linkUpLatLinkAvg =\
+                ( linkUpLatLink1 +
+                  linkUpLatLink2 +
+                  linkUpLatLink3 ) / 3
 
             # Set threshold and append latency to list
-            if link_up_lat_graph_avg > up_threshold_min and\
-               link_up_lat_graph_avg < up_threshold_max:
-                link_up_graph_to_system_list.append(
-                    link_up_lat_graph_avg )
+            if linkUpLatGraphAvg > upThresholdMin and\
+               linkUpLatGraphAvg < upThresholdMax:
+                linkUpGraphToSystemList.append(
+                    linkUpLatGraphAvg )
             else:
                 main.log.info( "Link up latency exceeded threshold" )
                 main.log.info( "Results for iteration " + str( i ) +
                                "have been omitted" )
-            if link_up_lat_link_avg > up_threshold_min and\
-               link_up_lat_link_avg < up_threshold_max:
-                link_up_link_to_system_list.append(
-                    link_up_lat_link_avg )
+            if linkUpLatLinkAvg > upThresholdMin and\
+               linkUpLatLinkAvg < upThresholdMax:
+                linkUpLinkToSystemList.append(
+                    linkUpLatLinkAvg )
             else:
                 main.log.info( "Link up latency exceeded threshold" )
                 main.log.info( "Results for iteration " + str( i ) +
                                "have been omitted" )
 
         # Calculate min, max, avg of list and report
-        link_down_min = min( link_down_graph_to_system_list )
-        link_down_max = max( link_down_graph_to_system_list )
-        link_down_avg = sum( link_down_graph_to_system_list ) / \
-            len( link_down_graph_to_system_list )
-        link_up_min = min( link_up_graph_to_system_list )
-        link_up_max = max( link_up_graph_to_system_list )
-        link_up_avg = sum( link_up_graph_to_system_list ) / \
-            len( link_up_graph_to_system_list )
-        link_down_std_dev = \
-            str( round( numpy.std( link_down_graph_to_system_list ), 1 ) )
-        link_up_std_dev = \
-            str( round( numpy.std( link_up_graph_to_system_list ), 1 ) )
+        linkDownMin = min( linkDownGraphToSystemList )
+        linkDownMax = max( linkDownGraphToSystemList )
+        linkDownAvg = sum( linkDownGraphToSystemList ) / \
+            len( linkDownGraphToSystemList )
+        linkUpMin = min( linkUpGraphToSystemList )
+        linkUpMax = max( linkUpGraphToSystemList )
+        linkUpAvg = sum( linkUpGraphToSystemList ) / \
+            len( linkUpGraphToSystemList )
+        linkDownStdDev = \
+            str( round( numpy.std( linkDownGraphToSystemList ), 1 ) )
+        linkUpStdDev = \
+            str( round( numpy.std( linkUpGraphToSystemList ), 1 ) )
 
         main.log.report( "Link down latency " +
-                         "Avg: " + str( link_down_avg ) + " ms " +
-                         "Std Deviation: " + link_down_std_dev + " ms" )
+                         "Avg: " + str( linkDownAvg ) + " ms " +
+                         "Std Deviation: " + linkDownStdDev + " ms" )
         main.log.report( "Link up latency " +
-                         "Avg: " + str( link_up_avg ) + " ms " +
-                         "Std Deviation: " + link_up_std_dev + " ms" )
+                         "Avg: " + str( linkUpAvg ) + " ms " +
+                         "Std Deviation: " + linkUpStdDev + " ms" )
 
         utilities.assert_equals(
             expect=main.TRUE,
@@ -1440,54 +1709,54 @@
         import requests
         import json
 
-        ONOS1_ip = main.params[ 'CTRL' ][ 'ip1' ]
-        ONOS2_ip = main.params[ 'CTRL' ][ 'ip2' ]
-        ONOS3_ip = main.params[ 'CTRL' ][ 'ip3' ]
-        MN1_ip = main.params[ 'MN' ][ 'ip1' ]
-        ONOS_user = main.params[ 'CTRL' ][ 'user' ]
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        MN1Ip = main.params[ 'MN' ][ 'ip1' ]
+        ONOSUser = main.params[ 'CTRL' ][ 'user' ]
 
-        default_sw_port = main.params[ 'CTRL' ][ 'port1' ]
+        defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
 
         # Number of iterations of case
-        num_iter = main.params[ 'TEST' ][ 'numIter' ]
-        num_sw = main.params[ 'TEST' ][ 'numSwitch' ]
+        numIter = main.params[ 'TEST' ][ 'numIter' ]
+        numSw = main.params[ 'TEST' ][ 'numSwitch' ]
 
         # Timestamp 'keys' for json metrics output.
         # These are subject to change, hence moved into params
         deviceTimestamp = main.params[ 'JSON' ][ 'deviceTimestamp' ]
         graphTimestamp = main.params[ 'JSON' ][ 'graphTimestamp' ]
 
-        debug_mode = main.params[ 'TEST' ][ 'debugMode' ]
+        debugMode = main.params[ 'TEST' ][ 'debugMode' ]
 
-        local_time = time.strftime( '%X' )
-        local_time = local_time.replace( "/", "" )
-        local_time = local_time.replace( " ", "_" )
-        local_time = local_time.replace( ":", "" )
-        if debug_mode == 'on':
-            main.ONOS1.tshark_pcap( "eth0",
-                                    "/tmp/100_sw_lat_pcap_" + local_time )
+        localTime = time.strftime( '%X' )
+        localTime = localTime.replace( "/", "" )
+        localTime = localTime.replace( " ", "_" )
+        localTime = localTime.replace( ":", "" )
+        if debugMode == 'on':
+            main.ONOS1.tsharkPcap( "eth0",
+                                   "/tmp/100_sw_lat_pcap_" + localTime )
 
         # Threshold for this test case
-        sw_disc_threshold_str = main.params[ 'TEST' ][ 'swDisc100Threshold' ]
-        sw_disc_threshold_obj = sw_disc_threshold_str.split( "," )
-        sw_disc_threshold_min = int( sw_disc_threshold_obj[ 0 ] )
-        sw_disc_threshold_max = int( sw_disc_threshold_obj[ 1 ] )
+        swDiscThresholdStr = main.params[ 'TEST' ][ 'swDisc100Threshold' ]
+        swDiscThresholdObj = swDiscThresholdStr.split( "," )
+        swDiscThresholdMin = int( swDiscThresholdObj[ 0 ] )
+        swDiscThresholdMax = int( swDiscThresholdObj[ 1 ] )
 
-        tshark_ofp_output = "/tmp/tshark_ofp_" + num_sw + "sw.txt"
-        tshark_tcp_output = "/tmp/tshark_tcp_" + num_sw + "sw.txt"
+        tsharkOfpOutput = "/tmp/tshark_ofp_" + numSw + "sw.txt"
+        tsharkTcpOutput = "/tmp/tshark_tcp_" + numSw + "sw.txt"
 
-        tshark_ofp_result_list = []
-        tshark_tcp_result_list = []
+        tsharkOfpResultList = []
+        tsharkTcpResultList = []
 
-        sw_discovery_lat_list = []
+        swDiscoveryLatList = []
 
-        main.case( num_sw + " Switch discovery latency" )
+        main.case( numSw + " Switch discovery latency" )
         main.step( "Assigning all switches to ONOS1" )
-        for i in range( 1, int( num_sw ) + 1 ):
-            main.Mininet1.assign_sw_controller(
+        for i in range( 1, int( numSw ) + 1 ):
+            main.Mininet1.assignSwController(
                 sw=str( i ),
-                ip1=ONOS1_ip,
-                port1=default_sw_port )
+                ip1=ONOS1Ip,
+                port1=defaultSwPort )
 
         # Ensure that nodes are configured with ptpd
         # Just a warning message
@@ -1495,7 +1764,7 @@
                        " All nodes' system times are in sync" )
         time.sleep( 5 )
 
-        for i in range( 0, int( num_iter ) ):
+        for i in range( 0, int( numIter ) ):
 
             main.step( "Set iptables rule to block incoming sw connections" )
             # Set iptables rule to block incoming switch connections
@@ -1503,20 +1772,20 @@
             #   Append to INPUT rule,
             #   behavior DROP that matches following:
             #       * packet type: tcp
-            #       * source IP: MN1_ip
+            #       * source IP: MN1Ip
             #       * destination PORT: 6633
             main.ONOS1.handle.sendline(
-                "sudo iptables -A INPUT -p tcp -s " + MN1_ip +
-                " --dport " + default_sw_port + " -j DROP" )
+                "sudo iptables -A INPUT -p tcp -s " + MN1Ip +
+                " --dport " + defaultSwPort + " -j DROP" )
             main.ONOS1.handle.expect( "\$" )
             #   Append to OUTPUT rule,
             #   behavior DROP that matches following:
             #       * packet type: tcp
-            #       * source IP: MN1_ip
+            #       * source IP: MN1Ip
             #       * destination PORT: 6633
             main.ONOS1.handle.sendline(
-                "sudo iptables -A OUTPUT -p tcp -s " + MN1_ip +
-                " --dport " + default_sw_port + " -j DROP" )
+                "sudo iptables -A OUTPUT -p tcp -s " + MN1Ip +
+                " --dport " + defaultSwPort + " -j DROP" )
             main.ONOS1.handle.expect( "\$" )
             # Give time to allow rule to take effect
             # NOTE: Sleep period may need to be configured
@@ -1526,10 +1795,10 @@
             time.sleep( 60 )
 
             # Gather vendor OFP with tshark
-            main.ONOS1.tshark_grep( "OFP 86 Vendor",
-                                    tshark_ofp_output )
-            main.ONOS1.tshark_grep( "TCP 74 ",
-                                    tshark_tcp_output )
+            main.ONOS1.tsharkGrep( "OFP 86 Vendor",
+                                   tsharkOfpOutput )
+            main.ONOS1.tsharkGrep( "TCP 74 ",
+                                   tsharkTcpOutput )
 
             # NOTE: Remove all iptables rule quickly ( flush )
             #      Before removal, obtain TestON timestamp at which
@@ -1537,137 +1806,201 @@
             #      ( ensuring nodes are configured via ptp )
             #      sudo iptables -F
 
-            t0_system = time.time() * 1000
+            t0System = time.time() * 1000
             main.ONOS1.handle.sendline(
                 "sudo iptables -F" )
 
             # Counter to track loop count
-            counter_loop = 0
-            counter_avail1 = 0
-            counter_avail2 = 0
-            counter_avail3 = 0
-            onos1_dev = False
-            onos2_dev = False
-            onos3_dev = False
-            while counter_loop < 60:
+            counterLoop = 0
+            counterAvail1 = 0
+            counterAvail2 = 0
+            counterAvail3 = 0
+            onos1Dev = False
+            onos2Dev = False
+            onos3Dev = False
+            while counterLoop < 60:
                 # Continue to check devices for all device
                 # availability. When all devices in all 3
                 # ONOS instances indicate that devices are available
                 # obtain graph event timestamp for t1.
-                device_str_obj1 = main.ONOS1cli.devices()
-                device_str_obj2 = main.ONOS2cli.devices()
-                device_str_obj3 = main.ONOS3cli.devices()
+                deviceStrObj1 = main.ONOS1cli.devices()
+                deviceStrObj2 = main.ONOS2cli.devices()
+                deviceStrObj3 = main.ONOS3cli.devices()
 
-                device_json1 = json.loads( device_str_obj1 )
-                device_json2 = json.loads( device_str_obj2 )
-                device_json3 = json.loads( device_str_obj3 )
+                deviceJson1 = json.loads( deviceStrObj1 )
+                deviceJson2 = json.loads( deviceStrObj2 )
+                deviceJson3 = json.loads( deviceStrObj3 )
 
-                for device1 in device_json1:
+                for device1 in deviceJson1:
                     if device1[ 'available' ]:
-                        counter_avail1 += 1
-                        if counter_avail1 == int( num_sw ):
-                            onos1_dev = True
+                        counterAvail1 += 1
+                        if counterAvail1 == int( numSw ):
+                            onos1Dev = True
                             main.log.info( "All devices have been " +
                                            "discovered on ONOS1" )
                     else:
-                        counter_avail1 = 0
-                for device2 in device_json2:
+                        counterAvail1 = 0
+                for device2 in deviceJson2:
                     if device2[ 'available' ]:
-                        counter_avail2 += 1
-                        if counter_avail2 == int( num_sw ):
-                            onos2_dev = True
+                        counterAvail2 += 1
+                        if counterAvail2 == int( numSw ):
+                            onos2Dev = True
                             main.log.info( "All devices have been " +
                                            "discovered on ONOS2" )
                     else:
-                        counter_avail2 = 0
-                for device3 in device_json3:
+                        counterAvail2 = 0
+                for device3 in deviceJson3:
                     if device3[ 'available' ]:
-                        counter_avail3 += 1
-                        if counter_avail3 == int( num_sw ):
-                            onos3_dev = True
+                        counterAvail3 += 1
+                        if counterAvail3 == int( numSw ):
+                            onos3Dev = True
                             main.log.info( "All devices have been " +
                                            "discovered on ONOS3" )
                     else:
-                        counter_avail3 = 0
+                        counterAvail3 = 0
 
-                if onos1_dev and onos2_dev and onos3_dev:
+                if onos1Dev and onos2Dev and onos3Dev:
                     main.log.info( "All devices have been discovered " +
                                    "on all ONOS instances" )
-                    json_str_topology_metrics_1 =\
-                        main.ONOS1cli.topology_events_metrics()
-                    json_str_topology_metrics_2 =\
-                        main.ONOS2cli.topology_events_metrics()
-                    json_str_topology_metrics_3 =\
-                        main.ONOS3cli.topology_events_metrics()
+                    jsonStrTopologyMetrics1 =\
+                        main.ONOS1cli.topologyEventsMetrics()
+                    jsonStrTopologyMetrics2 =\
+                        main.ONOS2cli.topologyEventsMetrics()
+                    jsonStrTopologyMetrics3 =\
+                        main.ONOS3cli.topologyEventsMetrics()
 
                     # Exit while loop if all devices discovered
                     break
 
-                counter_loop += 1
+                counterLoop += 1
                 # Give some time in between CLI calls
                 #( will not affect measurement )
                 time.sleep( 3 )
 
-            main.ONOS1.tshark_stop()
+            main.ONOS1.tsharkStop()
 
-            os.system( "scp " + ONOS_user + "@" + ONOS1_ip + ":" +
-                       tshark_ofp_output + " /tmp/" )
-            os.system( "scp " + ONOS_user + "@" + ONOS1_ip + ":" +
-                       tshark_tcp_output + " /tmp/" )
+            os.system( "scp " + ONOSUser + "@" + ONOS1Ip + ":" +
+                       tsharkOfpOutput + " /tmp/" )
+            os.system( "scp " + ONOSUser + "@" + ONOS1Ip + ":" +
+                       tsharkTcpOutput + " /tmp/" )
 
             # TODO: Automate OFP output analysis
             # Debug mode - print out packets captured at runtime
-            if debug_mode == 'on':
-                ofp_file = open( tshark_ofp_output, 'r' )
+            if debugMode == 'on':
+                ofpFile = open( tsharkOfpOutput, 'r' )
                 main.log.info( "Tshark OFP Vendor output: " )
-                for line in ofp_file:
-                    tshark_ofp_result_list.append( line )
+                for line in ofpFile:
+                    tsharkOfpResultList.append( line )
                     main.log.info( line )
-                ofp_file.close()
+                ofpFile.close()
 
-                tcp_file = open( tshark_tcp_output, 'r' )
+                tcpFile = open( tsharkTcpOutput, 'r' )
                 main.log.info( "Tshark TCP 74 output: " )
-                for line in tcp_file:
-                    tshark_tcp_result_list.append( line )
+                for line in tcpFile:
+                    tsharkTcpResultList.append( line )
                     main.log.info( line )
-                tcp_file.close()
+                tcpFile.close()
 
-            json_obj_1 = json.loads( json_str_topology_metrics_1 )
-            json_obj_2 = json.loads( json_str_topology_metrics_2 )
-            json_obj_3 = json.loads( json_str_topology_metrics_3 )
+            jsonObj1 = json.loads( jsonStrTopologyMetrics1 )
+            jsonObj2 = json.loads( jsonStrTopologyMetrics2 )
+            jsonObj3 = json.loads( jsonStrTopologyMetrics3 )
 
-            graph_timestamp_1 = \
-                json_obj_1[ graphTimestamp ][ 'value' ]
-            graph_timestamp_2 = \
-                json_obj_2[ graphTimestamp ][ 'value' ]
-            graph_timestamp_3 = \
-                json_obj_3[ graphTimestamp ][ 'value' ]
+            graphTimestamp1 = \
+                jsonObj1[ graphTimestamp ][ 'value' ]
+            graphTimestamp2 = \
+                jsonObj2[ graphTimestamp ][ 'value' ]
+            graphTimestamp3 = \
+                jsonObj3[ graphTimestamp ][ 'value' ]
 
-            graph_lat_1 = int( graph_timestamp_1 ) - int( t0_system )
-            graph_lat_2 = int( graph_timestamp_2 ) - int( t0_system )
-            graph_lat_3 = int( graph_timestamp_3 ) - int( t0_system )
+            graphLat1 = int( graphTimestamp1 ) - int( t0System )
+            graphLat2 = int( graphTimestamp2 ) - int( t0System )
+            graphLat3 = int( graphTimestamp3 ) - int( t0System )
 
-            avg_graph_lat = \
-                ( int( graph_lat_1 ) +
-                  int( graph_lat_2 ) +
-                  int( graph_lat_3 ) ) / 3
+            avgGraphLat = \
+                ( int( graphLat1 ) +
+                  int( graphLat2 ) +
+                  int( graphLat3 ) ) / 3
 
-            if avg_graph_lat > sw_disc_threshold_min \
-                    and avg_graph_lat < sw_disc_threshold_max:
-                sw_discovery_lat_list.append(
-                    avg_graph_lat )
+            if avgGraphLat > swDiscThresholdMin \
+                    and avgGraphLat < swDiscThresholdMax:
+                swDiscoveryLatList.append(
+                    avgGraphLat )
             else:
                 main.log.info( "100 Switch discovery latency " +
                                "exceeded the threshold." )
 
             # END ITERATION FOR LOOP
 
-        sw_lat_min = min( sw_discovery_lat_list )
-        sw_lat_max = max( sw_discovery_lat_list )
-        sw_lat_avg = sum( sw_discovery_lat_list ) /\
-            len( sw_discovery_lat_list )
+        swLatMin = min( swDiscoveryLatList )
+        swLatMax = max( swDiscoveryLatList )
+        swLatAvg = sum( swDiscoveryLatList ) /\
+            len( swDiscoveryLatList )
 
         main.log.report( "100 Switch discovery lat " +
-                         "Min: " + str( sw_lat_min ) + " ms" +
-                         "Max: " + str( sw_lat_max ) + " ms" +
-                         "Avg: " + str( sw_lat_avg ) + " ms" )
+                         "Min: " + str( swLatMin ) + " ms" +
+                         "Max: " + str( swLatMax ) + " ms" +
+                         "Avg: " + str( swLatAvg ) + " ms" )
+
+    def CASE6( self, main ):
+        """
+        Increase number of nodes and initiate CLI
+        """
+        import time
+
+        ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+        ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
+        ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
+        ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
+        ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
+        ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
+        ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
+
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+
+        global clusterCount
+
+        # Cluster size increased everytime the case is defined
+        clusterCount += 2
+
+        main.log.report( "Increasing cluster size to " +
+                         str( clusterCount ) )
+
+        installResult = main.FALSE
+        if clusterCount == 3:
+            main.log.info( "Installing nodes 2 and 3" )
+            node2Result = \
+                main.ONOSbench.onosInstall( node=ONOS2Ip )
+            node3Result = \
+                main.ONOSbench.onosInstall( node=ONOS3Ip )
+            installResult = node2Result and node3Result
+
+            time.sleep( 5 )
+
+            main.ONOS2cli.startOnosCli( ONOS2Ip )
+            main.ONOS3cli.startOnosCli( ONOS3Ip )
+
+        elif clusterCount == 5:
+            main.log.info( "Installing nodes 4 and 5" )
+            node4Result = \
+                main.ONOSbench.onosInstall( node=ONOS4Ip )
+            node5Result = \
+                main.ONOSbench.onosInstall( node=ONOS5Ip )
+            installResult = node4Result and node5Result
+
+            time.sleep( 5 )
+
+            main.ONOS4cli.startOnosCli( ONOS4Ip )
+            main.ONOS5cli.startOnosCli( ONOS5Ip )
+
+        elif clusterCount == 7:
+            main.log.info( "Installing nodes 6 and 7" )
+            node6Result = \
+                main.ONOSbench.onosInstall( node=ONOS6Ip )
+            node7Result = \
+                main.ONOSbench.onosInstall( node=ONOS7Ip )
+            installResult = node6Result and node7Result
+
+            time.sleep( 5 )
+
+            main.ONOS6cli.startOnosCli( ONOS6Ip )
+            main.ONOS7cli.startOnosCli( ONOS7Ip )
diff --git a/TestON/tests/TopoPerfNext/TopoPerfNext.topo b/TestON/tests/TopoPerfNext/TopoPerfNext.topo
index 4ee44e2..f12d192 100644
--- a/TestON/tests/TopoPerfNext/TopoPerfNext.topo
+++ b/TestON/tests/TopoPerfNext/TopoPerfNext.topo
@@ -24,7 +24,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
-            <connect_order>2</connect_order>
+            <connect_order>3</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS2cli>
         
@@ -33,16 +33,52 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
-            <connect_order>2</connect_order>
+            <connect_order>4</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS3cli>
+        
+        <ONOS4cli>
+            <host>10.128.174.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS4cli>
+        
+        <ONOS5cli>
+            <host>10.128.174.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS5cli>
+        
+        <ONOS6cli>
+            <host>10.128.174.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>7</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS6cli>
+        
+        <ONOS7cli>
+            <host>10.128.174.10</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>8</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS7cli>
 
         <ONOS1>
             <host>10.128.174.1</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosDriver</type>
-            <connect_order>3</connect_order>
+            <connect_order>9</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS1>
 
@@ -51,7 +87,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosDriver</type>
-            <connect_order>3</connect_order>
+            <connect_order>10</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS2>
 
@@ -60,16 +96,52 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosDriver</type>
-            <connect_order>3</connect_order>
+            <connect_order>11</connect_order>
             <COMPONENTS> </COMPONENTS>
         </ONOS3>
+        
+        <ONOS4>
+            <host>10.128.174.4</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>12</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS4>
+        
+        <ONOS5>
+            <host>10.128.174.5</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>13</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS5>
+        
+        <ONOS6>
+            <host>10.128.174.6</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>14</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS6>
+        
+        <ONOS7>
+            <host>10.128.174.7</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>15</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS7>
 
         <Mininet1>
             <host>10.128.10.90</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>MininetCliDriver</type>
-            <connect_order>4</connect_order>
+            <connect_order>16</connect_order>
             <COMPONENTS>
                 <arg1> --custom topo-perf-2sw.py </arg1>
                 <arg2> --arp --mac --topo mytopo</arg2>
@@ -83,7 +155,7 @@
             <user>admin</user>
             <password>onos_test</password>
             <type>RemoteMininetDriver</type>
-            <connect_order>5</connect_order>
+            <connect_order>17</connect_order>
             <COMPONENTS> </COMPONENTS>
         </Mininet2>
 
diff --git a/TestON/tests/TopoPerfNext/__init__.py b/TestON/tests/TopoPerfNext/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/TopoPerfNext/__init__.py
diff --git a/TestON/tests/TopoPerfNextSingleNode/__init__.py b/TestON/tests/TopoPerfNextSingleNode/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/TopoPerfNextSingleNode/__init__.py
diff --git a/TestON/tests/prevFuncNext/FuncNext.params b/TestON/tests/prevFuncNext/FuncNext.params
new file mode 100755
index 0000000..13a4691
--- /dev/null
+++ b/TestON/tests/prevFuncNext/FuncNext.params
@@ -0,0 +1,37 @@
+<PARAMS>
+    
+    <testcases>1,4,5,3</testcases>
+
+    #Environment variables
+    <ENV>
+        <cellName>driver_test</cellName>
+    </ENV>
+
+    <CTRL>
+        <ip1>10.128.20.11</ip1>
+        <port1>6633</port1>
+    </CTRL>
+
+    <PING>
+        <source1>h8</source1>
+        <source2>h9</source2>
+        <source3>h10</source3>
+        <source4>h11</source4>
+        <source5>h12</source5>
+        <source6>h13</source6>
+        <source7>h14</source7>
+        <source8>h15</source8>
+        <source9>h16</source9>
+        <source10>h17</source10>
+        <target1>10.0.0.18</target1>
+        <target2>10.0.0.19</target2>
+        <target3>10.0.0.20</target3>
+        <target4>10.0.0.21</target4>
+        <target5>10.0.0.22</target5>
+        <target6>10.0.0.23</target6>
+        <target7>10.0.0.24</target7>
+        <target8>10.0.0.25</target8>
+        <target9>10.0.0.26</target9>
+        <target10>10.0.0.27</target10>
+    </PING>
+</PARAMS>
diff --git a/TestON/tests/prevFuncNext/FuncNext.py b/TestON/tests/prevFuncNext/FuncNext.py
new file mode 100755
index 0000000..e556fa4
--- /dev/null
+++ b/TestON/tests/prevFuncNext/FuncNext.py
@@ -0,0 +1,311 @@
+
+#Testing the basic functionality of ONOS Next
+#For sanity and driver functionality excercises only.
+
+import time
+import sys
+import os
+import re
+import time
+
+time.sleep(1)
+class FuncNext:
+    def __init__(self):
+        self.default = ''
+
+    def CASE1(self, main):
+        '''
+        Startup sequence:
+        git pull
+        mvn clean install
+        onos-package
+        cell <name>
+        onos-verify-cell
+        onos-install -f
+        onos-wait-for-start
+        '''
+        
+        cell_name = main.params['ENV']['cellName']
+        ONOS1_ip = main.params['CTRL']['ip1']
+        ONOS1_port = main.params['CTRL']['port1']
+        
+        main.case("Setting up test environment")
+        
+        main.step("Git checkout and pull master and get version")
+        main.ONOSbench.git_checkout("master")
+        git_pull_result = main.ONOSbench.git_pull()
+        version_result = main.ONOSbench.get_version()
+
+        main.step("Using mvn clean & install")
+        #clean_install_result = main.ONOSbench.clean_install()
+        #clean_install_result = main.TRUE
+
+        main.step("Applying cell variable to environment")
+        cell_result = main.ONOSbench.set_cell(cell_name)
+        verify_result = main.ONOSbench.verify_cell()
+        cell_result = main.ONOS2.set_cell(cell_name)
+        #verify_result = main.ONOS2.verify_cell()
+        main.ONOS2.start_onos_cli(ONOS_ip=main.params['CTRL']['ip1'])
+        
+        main.step("Creating ONOS package")
+        package_result = main.ONOSbench.onos_package()
+
+        #main.step("Creating a cell")
+        #cell_create_result = main.ONOSbench.create_cell_file(**************)
+
+        main.step("Installing ONOS package")
+        onos_install_result = main.ONOSbench.onos_install()
+        onos1_isup = main.ONOSbench.isup()
+   
+        main.step("Starting ONOS service")
+        start_result = main.ONOSbench.onos_start(ONOS1_ip)
+
+        case1_result = (package_result and\
+                cell_result and verify_result and onos_install_result and\
+                onos1_isup and start_result )
+        utilities.assert_equals(expect=main.TRUE, actual=case1_result,
+                onpass="Test startup successful",
+                onfail="Test startup NOT successful")
+
+    def CASE11(self, main):
+        '''
+        Cleanup sequence:
+        onos-service <node_ip> stop
+        onos-uninstall
+
+        TODO: Define rest of cleanup
+        
+        '''
+
+        ONOS1_ip = main.params['CTRL']['ip1']
+
+        main.case("Cleaning up test environment")
+
+        main.step("Testing ONOS kill function")
+        kill_result = main.ONOSbench.onos_kill(ONOS1_ip)
+
+        main.step("Stopping ONOS service")
+        stop_result = main.ONOSbench.onos_stop(ONOS1_ip)
+
+        main.step("Uninstalling ONOS service") 
+        uninstall_result = main.ONOSbench.onos_uninstall()
+
+    def CASE3(self, main):
+        '''
+        Test 'onos' command and its functionality in driver
+        '''
+        
+        ONOS1_ip = main.params['CTRL']['ip1']
+
+        main.case("Testing 'onos' command")
+
+        main.step("Sending command 'onos -w <onos-ip> system:name'")
+        cmdstr1 = "system:name"
+        cmd_result1 = main.ONOSbench.onos_cli(ONOS1_ip, cmdstr1) 
+        main.log.info("onos command returned: "+cmd_result1)
+
+        main.step("Sending command 'onos -w <onos-ip> onos:topology'")
+        cmdstr2 = "onos:topology"
+        cmd_result2 = main.ONOSbench.onos_cli(ONOS1_ip, cmdstr2)
+        main.log.info("onos command returned: "+cmd_result2)
+
+
+
+    def CASE4(self, main):
+        import re
+        import time
+        main.case("Pingall Test")
+        main.step("Assigning switches to controllers")
+        for i in range(1,29):
+            if i ==1:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+            elif i>=2 and i<5:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+            elif i>=5 and i<8:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+            elif i>=8 and i<18:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+            elif i>=18 and i<28:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+            else:
+                main.Mininet1.assign_sw_controller(sw=str(i),ip1=ONOS1_ip,port1=ONOS1_port)
+        Switch_Mastership = main.TRUE
+        for i in range (1,29):
+            if i==1:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is " + str(response))
+                if re.search("tcp:"+ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+            elif i>=2 and i<5:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is " + str(response))
+                if re.search("tcp:"+ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+            elif i>=5 and i<8:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is " + str(response))
+                if re.search("tcp:"+ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+            elif i>=8 and i<18:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is " + str(response))
+                if re.search("tcp:"+ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+            elif i>=18 and i<28:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is " + str(response))
+                if re.search("tcp:"+ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+            else:
+                response = main.Mininet1.get_sw_controller("s"+str(i))
+                print("Response is" + str(response))
+                if re.search("tcp:" +ONOS1_ip,response):
+                    Switch_Mastership = Switch_Mastership and main.TRUE
+                else:
+                    Switch_Mastership = main.FALSE
+
+        if Switch_Mastership == main.TRUE:
+            main.log.report("MasterControllers assigned correctly")
+        utilities.assert_equals(expect = main.TRUE,actual=Switch_Mastership,
+                onpass="MasterControllers assigned correctly")
+        '''
+        for i in range (1,29):
+            main.Mininet1.assign_sw_controller(sw=str(i),count=5,
+                    ip1=ONOS1_ip,port1=ONOS1_port,
+                    ip2=ONOS2_ip,port2=ONOS2_port,
+                    ip3=ONOS3_ip,port3=ONOS3_port,
+                    ip4=ONOS4_ip,port4=ONOS4_port,
+                    ip5=ONOS5_ip,port5=ONOS5_port)
+        '''
+        #REACTIVE FWD test
+
+        main.step("Get list of hosts from Mininet")
+        host_list = main.Mininet1.get_hosts()
+        main.log.info(host_list)
+
+        main.step("Get host list in ONOS format")
+        host_onos_list = main.ONOS2.get_hosts_id(host_list)
+        main.log.info(host_onos_list)
+        #time.sleep(5)
+
+        #We must use ping from hosts we want to add intents from 
+        #to make the hosts talk
+        #main.Mininet2.handle.sendline("\r")
+        #main.Mininet2.handle.sendline("h4 ping 10.1.1.1 -c 1 -W 1")
+        #time.sleep(3)
+        #main.Mininet2.handle.sendline("h5 ping 10.1.1.1 -c 1 -W 1")
+        #time.sleep(5)
+        
+        main.step("Pingall")
+        ping_result = main.FALSE
+        while ping_result == main.FALSE:
+            time1 = time.time()
+            ping_result = main.Mininet1.pingall()
+            time2 = time.time()
+            print "Time for pingall: %2f seconds" % (time2 - time1)
+      
+        #Start onos cli again because u might have dropped out of onos prompt to the shell prompt
+        #if there was no activity
+        main.ONOS2.start_onos_cli(ONOS_ip=main.params['CTRL']['ip1'])
+
+        main.step("Get hosts")
+        main.ONOS2.handle.sendline("hosts")
+        main.ONOS2.handle.expect("onos>")
+        hosts = main.ONOS2.handle.before
+        main.log.info(hosts)
+
+        main.step("Get all devices id")
+        devices_id_list = main.ONOS2.get_all_devices_id()
+        main.log.info(devices_id_list)
+        '''
+        main.step("Add point-to-point intents")
+        ptp_intent_result = main.ONOS2.add_point_intent(
+            devices_id_list[0], 1, devices_id_list[1], 2)
+        if ptp_intent_result == main.TRUE:
+            get_intent_result = main.ONOS2.intents()
+            main.log.info("Point to point intent install successful")
+            main.log.info(get_intent_result)
+        '''
+
+        case4_result = Switch_Mastership and ping_result
+        utilities.assert_equals(expect=main.TRUE, actual=case4_result,
+                onpass="Pingall Test successful",
+                onfail="Pingall Test NOT successful")
+
+    def CASE5(self,main) :
+        import time
+        from subprocess import Popen, PIPE
+        from sts.topology.teston_topology import TestONTopology # assumes that sts is already in you PYTHONPATH
+        #main.ONOS2.start_onos_cli(ONOS_ip=main.params['CTRL']['ip1'])
+        deviceResult = main.ONOS2.devices()
+        linksResult = main.ONOS2.links()
+        portsResult = main.ONOS2.ports()
+        print "**************"
+        main.step("Start continuous pings")
+        main.Mininet2.pingLong(src=main.params['PING']['source1'],
+                            target=main.params['PING']['target1'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source2'],
+                            target=main.params['PING']['target2'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source3'],
+                            target=main.params['PING']['target3'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source4'],
+                            target=main.params['PING']['target4'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source5'],
+                            target=main.params['PING']['target5'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source6'],
+                            target=main.params['PING']['target6'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source7'],
+                            target=main.params['PING']['target7'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source8'],
+                            target=main.params['PING']['target8'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source9'],
+                            target=main.params['PING']['target9'],pingTime=500)
+        main.Mininet2.pingLong(src=main.params['PING']['source10'],
+                            target=main.params['PING']['target10'],pingTime=500)
+
+        main.step("Create TestONTopology object")
+        global ctrls
+        ctrls = []
+        count = 1
+        while True:
+            temp = ()
+            if ('ip' + str(count)) in main.params['CTRL']:
+                temp = temp + (getattr(main,('ONOS' + str(count))),)
+                temp = temp + ("ONOS"+str(count),)
+                temp = temp + (main.params['CTRL']['ip'+str(count)],)
+                temp = temp + (eval(main.params['CTRL']['port'+str(count)]),)
+                ctrls.append(temp)
+                count = count + 1
+            else:
+                break
+        global MNTopo
+        Topo = TestONTopology(main.Mininet1, ctrls) # can also add Intent API info for intent operations
+        MNTopo = Topo
+
+        Topology_Check = main.TRUE
+        main.step("Compare ONOS Topology to MN Topology")
+        '''for n in range(1,6):
+            result = main.Mininet1.compare_topo(MNTopo,
+                    main.ONOS1.get_json(main.params['CTRL']['ip'+str(n)]+":"+ \
+                        main.params['CTRL']['restPort'+str(n)]+main.params['TopoRest']))
+            if result == main.TRUE:
+                main.log.report("ONOS"+str(n) + " Topology matches MN Topology")
+            utilities.assert_equals(expect=main.TRUE,actual=result,
+                    onpass="ONOS" + str(n) + " Topology matches MN Topology",
+                    onfail="ONOS" + str(n) + " Topology does not match MN Topology")
+            Topology_Check = Topology_Check and result
+        utilities.assert_equals(expect=main.TRUE,actual=Topology_Check,
+                onpass="Topology checks passed", onfail="Topology checks failed")
+        '''
+
+
diff --git a/TestON/tests/prevFuncNext/FuncNext.topo b/TestON/tests/prevFuncNext/FuncNext.topo
new file mode 100755
index 0000000..5d453a6
--- /dev/null
+++ b/TestON/tests/prevFuncNext/FuncNext.topo
@@ -0,0 +1,61 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOSbench>
+
+        <ONOS1>
+            <host>10.128.10.11</host>
+            <user>sdn</user>
+            <password>sdn</password>
+            <type>OnosDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOS2>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS2>
+
+        <Mininet1>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>MininetCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS>
+                #Specify the Option for mininet
+                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
+                <arg2> --topo mytopo </arg2>
+                <arg3> --switch ovs,protocols=OpenFlow10 </arg3>
+                <controller> remote </controller>
+            </COMPONENTS>
+        </Mininet1>
+
+        <Mininet2>
+            <host>10.128.10.11</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>RemoteMininetDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                #Specify the Option for mininet
+                <arg1> --custom ~/mininet/custom/topo-HA.py </arg1>
+                <arg2> --topo mytopo </arg2>
+                <arg3> --switch ovs,protocols=OpenFlow10 </arg3>
+                <controller> remote </controller>
+            </COMPONENTS>
+        </Mininet2>
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/prevFuncNext/__init__.py b/TestON/tests/prevFuncNext/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/prevFuncNext/__init__.py