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/tests/HATestClusterRestart/HATestClusterRestart.py b/TestON/tests/HATestClusterRestart/HATestClusterRestart.py
index 7479135..2b28907 100644
--- a/TestON/tests/HATestClusterRestart/HATestClusterRestart.py
+++ b/TestON/tests/HATestClusterRestart/HATestClusterRestart.py
@@ -19,6 +19,8 @@
 CASE14: start election app on all onos nodes
 CASE15: Check that Leadership Election is still functional
 """
+
+
 class HATestClusterRestart:
 
     def __init__( self ):
@@ -44,159 +46,159 @@
         # TODO: save all the timers and output them for plotting
 
         # load some vairables from the params file
-        PULL_CODE = False
+        PULLCODE = False
         if main.params[ 'Git' ] == 'True':
-            PULL_CODE = True
+            PULLCODE = True
 
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
+        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
+        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" )
-        cell_result = main.ONOSbench.set_cell( cell_name )
-        verify_result = main.ONOSbench.verify_cell()
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
         # FIXME:this is short term fix
         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.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 )
+        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 )
 
-        clean_install_result = main.TRUE
-        git_pull_result = main.TRUE
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
 
         main.step( "Compiling the latest version of ONOS" )
-        if PULL_CODE:
+        if PULLCODE:
             # TODO Configure branch in params
             main.step( "Git checkout and pull master" )
-            main.ONOSbench.git_checkout( "master" )
-            git_pull_result = main.ONOSbench.git_pull()
+            main.ONOSbench.gitCheckout( "master" )
+            gitPullResult = main.ONOSbench.gitPull()
 
             main.step( "Using mvn clean & install" )
-            clean_install_result = main.TRUE
+            cleanInstallResult = main.TRUE
         # In Sanity test, always re-compile ONOS
-        if git_pull_result == main.TRUE:
-            clean_install_result = main.ONOSbench.clean_install()
+        if gitPullResult == main.TRUE:
+            cleanInstallResult = main.ONOSbench.cleanInstall()
         else:
             main.log.warn( "Did not pull new code so skipping mvn " +
                            "clean install" )
-        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" )
-        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
+        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:
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            if not onos1Isup:
                 main.log.report( "ONOS1 didn't start!" )
-            onos2_isup = main.ONOSbench.isup( ONOS2_ip )
-            if not onos2_isup:
+            onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+            if not onos2Isup:
                 main.log.report( "ONOS2 didn't start!" )
-            onos3_isup = main.ONOSbench.isup( ONOS3_ip )
-            if not onos3_isup:
+            onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+            if not onos3Isup:
                 main.log.report( "ONOS3 didn't start!" )
-            onos4_isup = main.ONOSbench.isup( ONOS4_ip )
-            if not onos4_isup:
+            onos4Isup = main.ONOSbench.isup( ONOS4Ip )
+            if not onos4Isup:
                 main.log.report( "ONOS4 didn't start!" )
-            onos5_isup = main.ONOSbench.isup( ONOS5_ip )
-            if not onos5_isup:
+            onos5Isup = main.ONOSbench.isup( ONOS5Ip )
+            if not onos5Isup:
                 main.log.report( "ONOS5 didn't start!" )
-            onos6_isup = main.ONOSbench.isup( ONOS6_ip )
-            if not onos6_isup:
+            onos6Isup = main.ONOSbench.isup( ONOS6Ip )
+            if not onos6Isup:
                 main.log.report( "ONOS6 didn't start!" )
-            onos7_isup = main.ONOSbench.isup( ONOS7_ip )
-            if not onos7_isup:
+            onos7Isup = main.ONOSbench.isup( ONOS7Ip )
+            if not onos7Isup:
                 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:
+            onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
+                and onos4Isup and onos5Isup and onos6Isup and onos7Isup
+            if onosIsupResult == main.TRUE:
                 break
 
-        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
+        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.start_tcpdump(
+        main.Mininet2.startTcpdump(
             str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
             + "-MN.pcap",
             intf=main.params[ 'MNtcpdump' ][ 'intf' ],
             port=main.params[ 'MNtcpdump' ][ 'port' ] )
 
-        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 )
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and onosInstallResult
+                        and onosIsupResult and cliResults )
 
-        utilities.assert_equals( expect=main.TRUE, actual=case1_result,
-                                 onpass="Test startup successful",
-                                 onfail="Test startup NOT successful" )
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+                                onpass="Test startup successful",
+                                onfail="Test startup NOT successful" )
 
-        if case1_result == main.FALSE:
+        if case1Result == main.FALSE:
             main.cleanup()
             main.exit()
 
@@ -211,174 +213,174 @@
         main.step( "Assign switches to controllers" )
 
         for i in range( 1, 29 ):
-            main.Mininet1.assign_sw_controller(
+            main.Mininet1.assignSwController(
                 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 )
+                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
+        mastershipCheck = main.TRUE
         for i in range( 1, 29 ):
-            response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+            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
+            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:
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
             main.log.report( "Switch mastership assigned correctly" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=mastership_check,
+            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
+        roleCall = main.TRUE
+        roleCheck = main.TRUE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "1000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS1_ip )
+        deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS1Ip )
         # Check assignment
-        if ONOS1_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "2800" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS1_ip )
+        deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS1Ip )
         # Check assignment
-        if ONOS1_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "2000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS2_ip )
+        deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS2Ip )
         # Check assignment
-        if ONOS2_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "3000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS2_ip )
+        deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS2Ip )
         # Check assignment
-        if ONOS2_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "5000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS3_ip )
+        deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS3Ip )
         # Check assignment
-        if ONOS3_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "6000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS3_ip )
+        deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS3Ip )
         # Check assignment
-        if ONOS3_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "3004" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS4_ip )
+        deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS4Ip )
         # Check assignment
-        if ONOS4_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         for i in range( 8, 18 ):
             dpid = '3' + str( i ).zfill( 3 )
-            device_id = main.ONOScli1.get_device( dpid ).get( 'id' )
-            role_call = role_call and main.ONOScli1.device_role(
-                device_id,
-                ONOS5_ip )
+            deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS5Ip )
             # Check assignment
-            if ONOS5_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-                role_check = role_check and main.TRUE
+            if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
             else:
-                role_check = role_check and main.FALSE
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device( "6007" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS6_ip )
+        deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS6Ip )
         # Check assignment
-        if ONOS6_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         for i in range( 18, 28 ):
             dpid = '6' + str( i ).zfill( 3 )
-            device_id = main.ONOScli1.get_device( dpid ).get( 'id' )
-            role_call = role_call and main.ONOScli1.device_role(
-                device_id,
-                ONOS7_ip )
+            deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS7Ip )
             # Check assignment
-            if ONOS7_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-                role_check = role_check and main.TRUE
+            if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
             else:
-                role_check = role_check and main.FALSE
+                roleCheck = roleCheck and main.FALSE
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=role_call,
+            actual=roleCall,
             onpass="Re-assigned switch mastership to designated controller",
-            onfail="Something wrong with device_role calls" )
+            onfail="Something wrong with deviceRole calls" )
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=role_check,
+            actual=roleCheck,
             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" )
+        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 ):
         """
@@ -391,41 +393,41 @@
         main.log.report( "Adding host intents" )
         main.case( "Adding host Intents" )
 
-        main.step( "Discovering  Hosts( Via pingall for now)" )
+        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" )
+        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
+        pingResult = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall()
         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.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" )
+        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
-        intent_add_result = True
+        intentAddResult = True
         for i in range( 8, 18 ):
             main.log.info( "Adding host intent between h" + str( i ) +
                            " and h" + str( i + 10 ) )
@@ -433,23 +435,23 @@
                 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' ]
+            host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
+            host2Id = main.ONOScli1.getHost( 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 )
+            if host1Id and host2Id:
+                tmpResult = main.ONOScli1.addHostIntent(
+                    host1Id,
+                    host2Id )
             else:
-                main.log.error( "Error, get_host() failed" )
-                tmp_result = main.FALSE
-            intent_add_result = bool( ping_result and intent_add_result
-                                      and tmp_result )
+                main.log.error( "Error, getHost() failed" )
+                tmpResult = main.FALSE
+            intentAddResult = bool( pingResult and intentAddResult
+                                     and tmpResult )
         utilities.assert_equals(
             expect=True,
-            actual=intent_add_result,
+            actual=intentAddResult,
             onpass="Switch mastership correctly assigned",
-            onfail="Error in (re)assigning switch mastership" )
+            onfail="Error in ( re )assigning switch mastership" )
         # TODO Check if intents all exist in datastore
 
     def CASE4( self, main ):
@@ -459,26 +461,26 @@
         description = " Ping across added host intents"
         main.log.report( description )
         main.case( description )
-        Ping_Result = main.TRUE
+        PingResult = 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
+            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!" )
-                Ping_Result = main.TRUE
-        if Ping_Result == main.FALSE:
+                PingResult = main.TRUE
+        if PingResult == main.FALSE:
             main.log.report(
                 "Intents have not been installed correctly, pings failed." )
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report(
                 "Intents have been installed correctly and verified by pings" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Ping_Result,
+            actual=PingResult,
             onpass="Intents have been installed correctly and pings work",
             onfail="Intents have not been installed correctly, pings failed." )
 
@@ -497,79 +499,79 @@
         # We can then compare them with eachother and also with past states
 
         main.step( "Get the Mastership of each switch from each controller" )
-        global mastership_state
-        mastership_state = []
+        global mastershipState
+        mastershipState = []
 
         # 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
+        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=roles_not_null,
+            actual=rolesNotNull,
             onpass="Each device has a master",
             onfail="Some devices don't have a master assigned" )
 
-        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()
-        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:
+        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( ONOS1_mastership ) )
+                repr( ONOS1Mastership ) )
             main.log.warn(
                 "ONOS2 mastership response: " +
-                repr( ONOS2_mastership ) )
+                repr( ONOS2Mastership ) )
             main.log.warn(
                 "ONOS3 mastership response: " +
-                repr( ONOS3_mastership ) )
+                repr( ONOS3Mastership ) )
             main.log.warn(
                 "ONOS4 mastership response: " +
-                repr( ONOS4_mastership ) )
+                repr( ONOS4Mastership ) )
             main.log.warn(
                 "ONOS5 mastership response: " +
-                repr( ONOS5_mastership ) )
+                repr( ONOS5Mastership ) )
             main.log.warn(
                 "ONOS6 mastership response: " +
-                repr( ONOS6_mastership ) )
+                repr( ONOS6Mastership ) )
             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
+                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 ),
+                    json.loads( ONOS1Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -578,7 +580,7 @@
             main.log.warn(
                 "ONOS2 roles: ",
                 json.dumps(
-                    json.loads( ONOS2_mastership ),
+                    json.loads( ONOS2Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -587,7 +589,7 @@
             main.log.warn(
                 "ONOS3 roles: ",
                 json.dumps(
-                    json.loads( ONOS3_mastership ),
+                    json.loads( ONOS3Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -596,7 +598,7 @@
             main.log.warn(
                 "ONOS4 roles: ",
                 json.dumps(
-                    json.loads( ONOS4_mastership ),
+                    json.loads( ONOS4Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -605,7 +607,7 @@
             main.log.warn(
                 "ONOS5 roles: ",
                 json.dumps(
-                    json.loads( ONOS5_mastership ),
+                    json.loads( ONOS5Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -614,7 +616,7 @@
             main.log.warn(
                 "ONOS6 roles: ",
                 json.dumps(
-                    json.loads( ONOS6_mastership ),
+                    json.loads( ONOS6Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -623,59 +625,59 @@
             main.log.warn(
                 "ONOS7 roles: ",
                 json.dumps(
-                    json.loads( ONOS7_mastership ),
+                    json.loads( ONOS7Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
                         ',',
                         ': ' ) ) )
-            consistent_mastership = main.FALSE
+            consistentMastership = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_mastership,
+            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:
+        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( 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.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 ),
+                    json.loads( ONOS1Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -684,7 +686,7 @@
             main.log.warn(
                 "ONOS2 intents: ",
                 json.dumps(
-                    json.loads( ONOS2_intents ),
+                    json.loads( ONOS2Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -693,7 +695,7 @@
             main.log.warn(
                 "ONOS3 intents: ",
                 json.dumps(
-                    json.loads( ONOS3_intents ),
+                    json.loads( ONOS3Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -702,7 +704,7 @@
             main.log.warn(
                 "ONOS4 intents: ",
                 json.dumps(
-                    json.loads( ONOS4_intents ),
+                    json.loads( ONOS4Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -711,7 +713,7 @@
             main.log.warn(
                 "ONOS5 intents: ",
                 json.dumps(
-                    json.loads( ONOS5_intents ),
+                    json.loads( ONOS5Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -720,7 +722,7 @@
             main.log.warn(
                 "ONOS6 intents: ",
                 json.dumps(
-                    json.loads( ONOS6_intents ),
+                    json.loads( ONOS6Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -729,7 +731,7 @@
             main.log.warn(
                 "ONOS7 intents: ",
                 json.dumps(
-                    json.loads( ONOS7_intents ),
+                    json.loads( ONOS7Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -737,78 +739,78 @@
                         ': ' ) ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=intent_check,
+            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 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 )
-        ONOS1_flows_json = json.loads( ONOS1_flows )
-        ONOS2_flows_json = json.loads( ONOS2_flows )
-        ONOS3_flows_json = json.loads( ONOS3_flows )
-        ONOS4_flows_json = json.loads( ONOS4_flows )
-        ONOS5_flows_json = json.loads( ONOS5_flows )
-        ONOS6_flows_json = json.loads( ONOS6_flows )
-        ONOS7_flows_json = json.loads( ONOS7_flows )
-        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:
+        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" )
-            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( ONOS1_flows_json ) == len( ONOS2_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS3_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS4_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS5_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS6_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS7_flows_json ):
+            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 )
+        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?
-            flow_state = ONOS1_flows
-            flow_check = main.TRUE
+            flowState = ONOS1Flows
+            flowCheck = main.TRUE
             main.log.report( "Flow count is consistent across all ONOS nodes" )
         else:
             main.log.warn( "ONOS1 flows: " +
-                           json.dumps( ONOS1_flows_json, sort_keys=True,
+                           json.dumps( ONOS1FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS2 flows: " +
-                           json.dumps( ONOS2_flows_json, sort_keys=True,
+                           json.dumps( ONOS2FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS3 flows: " +
-                           json.dumps( ONOS3_flows_json, sort_keys=True,
+                           json.dumps( ONOS3FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS4 flows: " +
-                           json.dumps( ONOS4_flows_json, sort_keys=True,
+                           json.dumps( ONOS4FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS5 flows: " +
-                           json.dumps( ONOS5_flows_json, sort_keys=True,
+                           json.dumps( ONOS5FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS6 flows: " +
-                           json.dumps( ONOS6_flows_json, sort_keys=True,
+                           json.dumps( ONOS6FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS7 flows: " +
-                           json.dumps( ONOS7_flows_json, sort_keys=True,
+                           json.dumps( ONOS7FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=flow_check,
+            actual=flowCheck,
             onpass="The flow count is consistent across all ONOS nodes",
             onfail="ONOS nodes have different flow counts" )
 
@@ -816,7 +818,7 @@
         global flows
         flows = []
         for i in range( 1, 29 ):
-            flows.append( main.Mininet2.get_flowTable( 1.3, "s" + str( i ) ) )
+            flows.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
 
         # TODO: Compare switch flow tables with ONOS flow tables
 
@@ -923,173 +925,173 @@
         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 ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli1.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli2.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli3.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli4.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli5.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli6.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli7.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
 
         # Compare json objects for hosts, dataplane clusters and paths
 
         # hosts
-        consistent_hosts_result = main.TRUE
+        consistentHostsResult = main.TRUE
         for controller in range( len( hosts ) ):
-            controller_str = str( controller + 1 )
+            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" +
-                                     controller_str +
+                                     controllerStr +
                                      " is inconsistent with ONOS1" )
                     main.log.warn( repr( hosts[ controller ] ) )
-                    consistent_hosts_result = main.FALSE
+                    consistentHostsResult = main.FALSE
 
             else:
                 main.log.report( "Error in getting ONOS hosts from ONOS" +
-                                 controller_str )
-                consistent_hosts_result = main.FALSE
-                main.log.warn( "ONOS" + controller_str +
+                                 controllerStr )
+                consistentHostsResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
                                " hosts response: " +
                                repr( hosts[ controller ] ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_hosts_result,
+            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
+        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" +
-                                     controller_str +
+                                     controllerStr +
                                      " is inconsistent with ONOS1" )
-                    consistent_clusters_result = main.FALSE
+                    consistentClustersResult = main.FALSE
 
             else:
                 main.log.report( "Error in getting dataplane clusters " +
-                                 "from ONOS" + controller_str )
-                consistent_clusters_result = main.FALSE
-                main.log.warn( "ONOS" + controller_str +
+                                 "from ONOS" + controllerStr )
+                consistentClustersResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
                                " clusters response: " +
                                repr( clusters[ controller ] ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_clusters_result,
+            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
-        num_clusters = len( json.loads( clusters[ 0 ] ) )
+        numClusters = len( json.loads( clusters[ 0 ] ) )
         utilities.assert_equals(
             expect=1,
-            actual=num_clusters,
+            actual=numClusters,
             onpass="ONOS shows 1 SCC",
             onfail="ONOS shows " +
-            str( num_clusters ) +
+            str( numClusters ) +
             " SCCs" )
 
         # paths
-        consistent_paths_result = main.TRUE
+        consistentPathsResult = main.TRUE
         for controller in range( len( paths ) ):
-            controller_str = str( controller + 1 )
+            controllerStr = str( controller + 1 )
             if "Error" not in paths[ controller ]:
                 if paths[ controller ] == paths[ 0 ]:
                     continue
                 else:  # paths not consistent
-                    main.log.report( "paths from ONOS" + controller_str +
+                    main.log.report( "paths from ONOS" + controllerStr +
                                      " is inconsistent with ONOS1" )
-                    consistent_paths_result = main.FALSE
+                    consistentPathsResult = main.FALSE
 
             else:
                 main.log.report( "Error in getting paths from ONOS" +
-                                 controller_str )
-                consistent_paths_result = main.FALSE
-                main.log.warn( "ONOS" + controller_str + " paths response: " +
+                                 controllerStr )
+                consistentPathsResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr + " paths response: " +
                                repr( paths[ controller ] ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_paths_result,
+            actual=consistentPathsResult,
             onpass="Paths count is consistent across all ONOS nodes",
             onfail="ONOS nodes have different counts of paths" )
 
         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 ):
-            controller_str = str( controller + 1 )
+        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 ]:
-                current_devices_result = main.Mininet1.compare_switches(
+                currentDevicesResult = main.Mininet1.compareSwitches(
                     MNTopo,
                     json.loads(
                         devices[ controller ] ) )
             else:
-                current_devices_result = main.FALSE
+                currentDevicesResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_devices_result,
-                                     onpass="ONOS" + controller_str +
-                                     " Switches view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " Switches view is incorrect" )
+                                    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 ]:
-                current_ports_result = main.Mininet1.compare_ports(
+                currentPortsResult = main.Mininet1.comparePorts(
                     MNTopo,
                     json.loads(
                         ports[ controller ] ) )
             else:
-                current_ports_result = main.FALSE
+                currentPortsResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_ports_result,
-                                     onpass="ONOS" + controller_str +
-                                     " ports view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " ports view is incorrect" )
+                                    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 ]:
-                current_links_result = main.Mininet1.compare_links(
+                currentLinksResult = main.Mininet1.compareLinks(
                     MNTopo,
                     json.loads(
                         links[ controller ] ) )
             else:
-                current_links_result = main.FALSE
+                currentLinksResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_links_result,
-                                     onpass="ONOS" + controller_str +
-                                     " links view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " links view is incorrect" )
+                                    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
+            devicesResults = devicesResults and currentDevicesResult
+            portsResults = portsResults and currentPortsResult
+            linksResults = linksResults and currentLinksResult
 
-        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" )
+        topoResult = devicesResults and portsResults and linksResults\
+            and consistentHostsResult and consistentClustersResult\
+            and consistentPathsResult
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                onpass="Topology Check Test successful",
+                                onfail="Topology Check Test 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" )
+        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 ):
         """
@@ -1097,45 +1099,45 @@
         """
         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.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" )
         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
 
-        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
+        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
 
-        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" )
+        caseResults = main.TRUE and onosIsupResult and cliResults
+        utilities.assert_equals( expect=main.TRUE, actual=caseResults,
+                                onpass="ONOS restart successful",
+                                onfail="ONOS restart NOT successful" )
 
     def CASE7( self, main ):
         """
@@ -1145,180 +1147,180 @@
         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
+        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=roles_not_null,
+            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()
-        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:
+        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( ONOS1_mastership ) )
+                           repr( ONOS1Mastership ) )
             main.log.warn( "ONOS2 mastership response: " +
-                           repr( ONOS2_mastership ) )
+                           repr( ONOS2Mastership ) )
             main.log.warn( "ONOS3 mastership response: " +
-                           repr( ONOS3_mastership ) )
+                           repr( ONOS3Mastership ) )
             main.log.warn( "ONOS4 mastership response: " +
-                           repr( ONOS4_mastership ) )
+                           repr( ONOS4Mastership ) )
             main.log.warn( "ONOS5 mastership response: " +
-                           repr( ONOS5_mastership ) )
+                           repr( ONOS5Mastership ) )
             main.log.warn( "ONOS6 mastership response: " +
-                           repr( ONOS6_mastership ) )
+                           repr( ONOS6Mastership ) )
             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
+                           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,
+                json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS2 roles: ", json.dumps(
-                json.loads( ONOS2_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS3 roles: ", json.dumps(
-                json.loads( ONOS3_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS4 roles: ", json.dumps(
-                json.loads( ONOS4_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS5 roles: ", json.dumps(
-                json.loads( ONOS5_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS6 roles: ", json.dumps(
-                json.loads( ONOS6_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS7 roles: ", json.dumps(
-                json.loads( ONOS7_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
-            consistent_mastership = main.FALSE
+            consistentMastership = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_mastership,
+            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 )
 
-        current_json = json.loads( ONOS1_mastership )
-        old_json = json.loads( mastership_state )
-        mastership_check = main.TRUE
+        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
+            current = [ switch[ 'master' ] for switch in currentJson
                         if switchDPID in switch[ 'id' ] ]
-            old = [ switch[ 'master' ] for switch in old_json
+            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:
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
             main.log.report( "Mastership of Switches was not changed" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=mastership_check,
+            actual=mastershipCheck,
             onpass="Mastership of Switches was not changed",
             onfail="Mastership of some switches changed" )
         # NOTE: we expect mastership to change on controller failure
-        mastership_check = mastership_check and consistent_mastership
+        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:
+        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( 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.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,
+            print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS2 intents: " )
-            print json.dumps( json.loads( ONOS2_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS3 intents: " )
-            print json.dumps( json.loads( ONOS3_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS4 intents: " )
-            print json.dumps( json.loads( ONOS4_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS5 intents: " )
-            print json.dumps( json.loads( ONOS5_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS6 intents: " )
-            print json.dumps( json.loads( ONOS6_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS7 intents: " )
-            print json.dumps( json.loads( ONOS7_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=intent_check,
+            actual=intentCheck,
             onpass="Intents are consistent across all ONOS nodes",
             onfail="ONOS nodes have different views of intents" )
 
@@ -1326,49 +1328,49 @@
         # 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: 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
+        if 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 ),
+                print json.dumps( json.loads( ONOS1Intents ),
                                   sort_keys=True, indent=4,
                                   separators=( ',', ': ' ) )
             except:
                 pass
-            same_intents = main.FALSE
+            sameIntents = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=same_intents,
+            actual=sameIntents,
             onpass="Intents are consistent with before failure",
             onfail="The Intents changed during failure" )
-        intent_check = intent_check and same_intents
+        intentCheck = intentCheck and sameIntents
         """
         main.step( "Get the OF Table entries and compare to before " +
                    "component failure" )
-        Flow_Tables = main.TRUE
+        FlowTables = 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(
+            tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
+            flows2.append( tmpFlows )
+            tempResult = main.Mininet2.flowComp(
                 flow1=flows[ i ],
-                flow2=tmp_flows )
-            Flow_Tables = Flow_Tables and temp_result
-            if Flow_Tables == main.FALSE:
+                flow2=tmpFlows )
+            FlowTables = FlowTables and tempResult
+            if FlowTables == main.FALSE:
                 main.log.info( "Differences in flow table for switch: s" +
                                str( i + 1 ) )
-        if Flow_Tables == main.TRUE:
+        if FlowTables == main.TRUE:
             main.log.report( "No changes were found in the flow tables" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Flow_Tables,
+            actual=FlowTables,
             onpass="No changes were found in the flow tables",
             onfail="Changes were found in the flow tables" )
 
@@ -1380,72 +1382,72 @@
         main.Mininet2.pingKill(
             main.params[ 'TESTONUSER' ],
             main.params[ 'TESTONIP' ] )
-        Loss_In_Pings = main.FALSE
+        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 ) )
-            Loss_In_Pings = main.Mininet2.checkForLoss(
+            LossInPings = main.Mininet2.checkForLoss(
                 "/tmp/ping.h" +
-                str( i ) ) or Loss_In_Pings
-        if Loss_In_Pings == main.TRUE:
+                str( i ) ) or LossInPings
+        if LossInPings == main.TRUE:
             main.log.info( "Loss in ping detected" )
-        elif Loss_In_Pings == main.ERROR:
+        elif LossInPings == main.ERROR:
             main.log.info( "There are multiple mininet process running" )
-        elif Loss_In_Pings == main.FALSE:
+        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=Loss_In_Pings,
+            actual=LossInPings,
             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
+        LossInPings = main.FALSE
 
         # Test of LeadershipElection
-        leader_list = []
-        leader_result = main.TRUE
-        for controller in range( 1, num_controllers + 1 ):
+        leaderList = []
+        leaderResult = main.TRUE
+        for controller in range( 1, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            leaderN = node.election_test_leader()
-            leader_list.append( leaderN )
+            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" +
+                                 "electionTestLeader function, check the" +
                                  " error logs" )
-                leader_result = main.FALSE
+                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" )
-                leader_result = main.FALSE
-        if len( set( leader_list ) ) != 1:
-            leader_result = main.FALSE
+                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 leader_result:
-            main.log.report( "Leadership election tests passed(consistent " +
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
                              "view of leader across listeners and a new " +
-                             "leader was re-elected if applicable)" )
+                             "leader was re-elected if applicable )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            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 = ( 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" )
+                                onpass="Constant State Tests Passed",
+                                onfail="Constant state tests failed" )
 
     def CASE8( self, main ):
         """
@@ -1482,22 +1484,22 @@
             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
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = 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:
+        startTime = time.time()
+        while topoResult == main.FALSE and elapsed < 60:
             count = count + 1
             if count > 1:
                 # TODO: Depricate STS usage
                 MNTopo = TestONTopology(
                     main.Mininet1,
                     ctrls )
-            cli_start = time.time()
+            cliStart = time.time()
             devices = []
             devices.append( main.ONOScli1.devices() )
             devices.append( main.ONOScli2.devices() )
@@ -1539,178 +1541,178 @@
             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 ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli1.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli2.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli3.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli4.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli5.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli6.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli7.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
 
-            elapsed = time.time() - start_time
-            cli_time = time.time() - cli_start
-            print "CLI time: " + str( cli_time )
+            elapsed = time.time() - startTime
+            cliTime = time.time() - cliStart
+            print "CLI time: " + str( cliTime )
 
-            for controller in range( num_controllers ):
-                controller_str = str( controller + 1 )
+            for controller in range( numControllers ):
+                controllerStr = str( controller + 1 )
                 if devices[ controller ] or "Error" not in devices[
                         controller ]:
-                    current_devices_result = main.Mininet1.compare_switches(
+                    currentDevicesResult = main.Mininet1.compareSwitches(
                         MNTopo,
                         json.loads(
                             devices[ controller ] ) )
                 else:
-                    current_devices_result = main.FALSE
+                    currentDevicesResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_devices_result,
-                                         onpass="ONOS" + controller_str +
-                                                " Switches view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " Switches view is incorrect" )
+                                        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 ]:
-                    current_ports_result = main.Mininet1.compare_ports(
+                    currentPortsResult = main.Mininet1.comparePorts(
                         MNTopo,
                         json.loads(
                             ports[ controller ] ) )
                 else:
-                    current_ports_result = main.FALSE
+                    currentPortsResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_ports_result,
-                                         onpass="ONOS" + controller_str +
-                                                " ports view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " ports view is incorrect" )
+                                        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 ]:
-                    current_links_result = main.Mininet1.compare_links(
+                    currentLinksResult = main.Mininet1.compareLinks(
                         MNTopo,
                         json.loads(
                             links[ controller ] ) )
                 else:
-                    current_links_result = main.FALSE
+                    currentLinksResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_links_result,
-                                         onpass="ONOS" + controller_str +
-                                                " links view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " 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
+                                        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, dataplane clusters and paths
 
             # hosts
-            consistent_hosts_result = main.TRUE
+            consistentHostsResult = main.TRUE
             for controller in range( len( hosts ) ):
-                controller_str = str( controller + 1 )
+                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" + controller_str +
+                        main.log.report( "hosts from ONOS" + controllerStr +
                                          " is inconsistent with ONOS1" )
                         main.log.warn( repr( hosts[ controller ] ) )
-                        consistent_hosts_result = main.FALSE
+                        consistentHostsResult = main.FALSE
 
                 else:
                     main.log.report( "Error in getting ONOS hosts from ONOS" +
-                                     controller_str )
-                    consistent_hosts_result = main.FALSE
-                    main.log.warn( "ONOS" + controller_str +
+                                     controllerStr )
+                    consistentHostsResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
                                    " hosts response: " +
                                    repr( hosts[ controller ] ) )
             utilities.assert_equals(
                 expect=main.TRUE,
-                actual=consistent_hosts_result,
+                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
+            consistentClustersResult = main.TRUE
             for controller in range( len( clusters ) ):
-                controller_str = str( controller + 1 )
+                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" +
-                                         controller_str +
+                                         controllerStr +
                                          " is inconsistent with ONOS1" )
-                        consistent_clusters_result = main.FALSE
+                        consistentClustersResult = main.FALSE
 
                 else:
                     main.log.report( "Error in getting dataplane clusters " +
-                                     "from ONOS" + controller_str )
-                    consistent_clusters_result = main.FALSE
-                    main.log.warn( "ONOS" + controller_str +
+                                     "from ONOS" + controllerStr )
+                    consistentClustersResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
                                    " clusters response: " +
                                    repr( clusters[ controller ] ) )
             utilities.assert_equals(
                 expect=main.TRUE,
-                actual=consistent_clusters_result,
+                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
-            num_clusters = len( json.loads( clusters[ 0 ] ) )
+            numClusters = len( json.loads( clusters[ 0 ] ) )
             utilities.assert_equals(
                 expect=1,
-                actual=num_clusters,
+                actual=numClusters,
                 onpass="ONOS shows 1 SCC",
                 onfail="ONOS shows " +
-                str( num_clusters ) +
+                str( numClusters ) +
                 " SCCs" )
 
             # paths
-            consistent_paths_result = main.TRUE
+            consistentPathsResult = main.TRUE
             for controller in range( len( paths ) ):
-                controller_str = str( controller + 1 )
+                controllerStr = str( controller + 1 )
                 if "Error" not in paths[ controller ]:
                     if paths[ controller ] == paths[ 0 ]:
                         continue
                     else:  # paths not consistent
-                        main.log.report( "paths from ONOS" + controller_str +
+                        main.log.report( "paths from ONOS" + controllerStr +
                                          " is inconsistent with ONOS1" )
-                        consistent_paths_result = main.FALSE
+                        consistentPathsResult = main.FALSE
 
                 else:
                     main.log.report( "Error in getting paths from ONOS" +
-                                     controller_str )
-                    consistent_paths_result = main.FALSE
-                    main.log.warn( "ONOS" + controller_str +
+                                     controllerStr )
+                    consistentPathsResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
                                    " paths response: " +
                                    repr( paths[ controller ] ) )
             utilities.assert_equals(
                 expect=main.TRUE,
-                actual=consistent_paths_result,
+                actual=consistentPathsResult,
                 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 )
+            topoResult = ( devicesResults and portsResults and linksResults
+                           and consistentHostsResult
+                           and consistentClustersResult
+                           and consistentPathsResult )
 
-        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"
+        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.report(
-            "Very crass estimate for topology discovery/convergence(" +
-            str( note ) + "): " + str( elapsed ) + " seconds, " +
+            "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:
+        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 ):
@@ -1720,23 +1722,23 @@
         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"
+            "is working properly"
         main.log.report( description )
         main.case( description )
 
         main.step( "Kill Link between s3 and s28" )
-        Link_Down = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
+        LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
         main.log.info(
             "Waiting " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " 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" )
+        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 ):
@@ -1746,23 +1748,23 @@
         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"
+            "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" )
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
         main.log.info(
             "Waiting " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " 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" )
+        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 ):
@@ -1772,7 +1774,7 @@
         # 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 )
@@ -1783,19 +1785,19 @@
         # TODO: Make this switch parameterizable
         main.step( "Kill " + switch )
         main.log.report( "Deleting " + switch )
-        main.Mininet1.del_switch( switch )
-        main.log.info( "Waiting " + str( switch_sleep ) +
+        main.Mininet1.delSwitch( switch )
+        main.log.info( "Waiting " + str( switchSleep ) +
                        " seconds for switch down to be discovered" )
-        time.sleep( switch_sleep )
-        device = main.ONOScli1.get_device( dpid=switchDPID )
+        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?" )
+                                onpass="Kill switch succesful",
+                                onfail="Failed to kill switch?" )
 
     def CASE12( self, main ):
         """
@@ -1804,7 +1806,7 @@
         # 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()
@@ -1814,41 +1816,41 @@
 
         main.step( "Add back " + switch )
         main.log.report( "Adding back " + switch )
-        main.Mininet1.add_switch( switch, dpid=switchDPID )
+        main.Mininet1.addSwitch( switch, dpid=switchDPID )
         # TODO: New dpid or same? Ask Thomas?
         for peer in links:
-            main.Mininet1.add_link( switch, peer )
-        main.Mininet1.assign_sw_controller(
+            main.Mininet1.addLink( switch, peer )
+        main.Mininet1.assignSwController(
             sw=switch.split( 's' )[ 1 ],
-            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 )
+            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( switch_sleep ) +
+            str( switchSleep ) +
             " seconds for switch up to be discovered" )
-        time.sleep( switch_sleep )
-        device = main.ONOScli1.get_device( dpid=switchDPID )
+        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?" )
+                                onpass="add switch succesful",
+                                onfail="Failed to add switch?" )
 
     def CASE13( self, main ):
         """
@@ -1858,13 +1860,13 @@
         import time
         # TODO: make use of this elsewhere
         ips = []
-        ips.append(ONOS1_ip)
-        ips.append(ONOS2_ip)
-        ips.append(ONOS3_ip)
-        ips.append(ONOS4_ip)
-        ips.append(ONOS5_ip)
-        ips.append(ONOS6_ip)
-        ips.append(ONOS7_ip)
+        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 = {}
@@ -1879,50 +1881,50 @@
         main.log.report( description )
         main.case( description )
         main.step( "Killing tcpdumps" )
-        main.Mininet2.stop_tcpdump()
+        main.Mininet2.stopTcpdump()
 
         main.step( "Checking ONOS Logs for errors" )
-        for i in range(7):
+        for i in range( 7 ):
             print colors[ 'purple' ] + "Checking logs for errors on " + \
-                    "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
-            print main.ONOSbench.check_logs( ips[i] )
+                "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
-        teststation_user = main.params[ 'TESTONUSER' ]
-        teststation_IP = main.params[ 'TESTONIP' ]
+        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" ]
+        logFolder = "/opt/onos/log/"
+        logFiles = [ "karaf.log", "karaf.log.1" ]
         # NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            for i in range(7):
-                main.ONOSbench.handle.sendline( "scp sdn@" + ips[i] + ":" +
-                                                log_folder + f + " " +
-                                                teststation_user + "@" +
-                                                teststation_IP + ":" +
-                                                dst_dir + str( testname ) +
+        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 /
-        log_folder = "/opt/onos/var/"
-        log_files = [ "stderr.log", "stdout.log" ]
+        logFolder = "/opt/onos/var/"
+        logFiles = [ "stderr.log", "stdout.log" ]
         # NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            for i in range(7):
-                main.ONOSbench.handle.sendline( "scp sdn@" + ips[i] + ":" +
-                                                log_folder + f + " " +
-                                                teststation_user + "@" +
-                                                teststation_IP + ":" +
-                                                dst_dir + str( testname ) +
+        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
@@ -1932,52 +1934,52 @@
 
         # TODO: actually check something here
         utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
-                                 onpass="Test cleanup successful",
-                                 onfail="Test cleanup NOT successful" )
+                                onpass="Test cleanup successful",
+                                onfail="Test cleanup NOT successful" )
 
     def CASE14( self, main ):
         """
         start election app on all onos nodes
         """
-        leader_result = main.TRUE
+        leaderResult = main.TRUE
         # install app on onos 1
         main.log.info( "Install leadership election app" )
-        main.ONOScli1.feature_install( "onos-app-election" )
+        main.ONOScli1.featureInstall( "onos-app-election" )
         # wait for election
         # check for leader
-        leader = main.ONOScli1.election_test_leader()
+        leader = main.ONOScli1.electionTestLeader()
         # verify leader is ONOS1
-        if leader == ONOS1_ip:
+        if leader == ONOS1Ip:
             # all is well
             pass
         elif leader is None:
             # No leader elected
             main.log.report( "No leader was elected" )
-            leader_result = main.FALSE
+            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" +
+            main.log.report( "Something is wrong with electionTestLeader" +
                              " function, check the error logs" )
-            leader_result = main.FALSE
+            leaderResult = main.FALSE
         else:
             # error in  response
             main.log.report(
-                "Unexpected response from election_test_leader function:'" +
-                str(leader) +
+                "Unexpected response from electionTestLeader function:'" +
+                str( leader ) +
                 "'" )
-            leader_result = main.FALSE
+            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 ):
+        for controller in range( 2, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            node.feature_install( "onos-app-election" )
-            leaderN = node.election_test_leader()
+            node.featureInstall( "onos-app-election" )
+            leaderN = node.electionTestLeader()
             # verify leader is ONOS1
-            if leaderN == ONOS1_ip:
+            if leaderN == ONOS1Ip:
                 # all is well
                 pass
             elif leaderN == main.FALSE:
@@ -1985,23 +1987,23 @@
                 # 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" +
+                                 "electionTestLeader function, check the" +
                                  " error logs" )
-                leader_result = main.FALSE
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
+                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 leader_result:
+        if leaderResult:
             main.log.report( "Leadership election tests passed( consistent " +
                              "view of leader across listeners and a leader " +
-                             "was elected)" )
+                             "was elected )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            actual=leaderResult,
             onpass="Leadership election passed",
             onfail="Something went wrong with Leadership election" )
 
@@ -2009,49 +2011,49 @@
         """
         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()
+        leader = main.ONOScli1.electionTestLeader()
         # 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" )
+        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) +
+                str( leader ) +
                 "'" )
-            leader_result = main.FALSE
-        withdraw_result = old_leader.election_test_withdraw()
+            leaderResult = main.FALSE
+        withdrawResult = oldLeader.electionTestWithdraw()
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=withdraw_result,
+            actual=withdrawResult,
             onpass="App was withdrawn from election",
             onfail="App was not withdrawn from election" )
 
         main.step( "Make sure new leader is elected" )
-        leader_list = []
-        for controller in range( 1, num_controllers + 1 ):
+        leaderList = []
+        for controller in range( 1, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            leader_list.append( node.election_test_leader() )
-        for leaderN in leader_list:
+            leaderList.append( node.electionTestLeader() )
+        for leaderN in leaderList:
             if leaderN == leader:
                 main.log.report(
                     "ONOS" +
@@ -2059,58 +2061,58 @@
                     " still sees " +
                     str( leader ) +
                     " as leader after they withdrew" )
-                leader_result = main.FALSE
+                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 " +
-                                 "election_test_leader function, " +
+                                 "electionTestLeader function, " +
                                  "check the error logs" )
-                leader_result = main.FALSE
-        consistent_leader = main.FALSE
-        if len( set( leader_list ) ) == 1:
+                leaderResult = main.FALSE
+        consistentLeader = main.FALSE
+        if len( set( leaderList ) ) == 1:
             main.log.info( "Each Election-app sees '" +
-                           str(leader_list[0]) +
+                           str( leaderList[ 0 ] ) +
                            "' as the leader" )
-            consistent_leader = main.TRUE
+            consistentLeader = main.TRUE
         else:
             main.log.report(
                 "Inconsistent responses for leader of Election-app:" )
-            for n in range( len( leader_list ) ):
+            for n in range( len( leaderList ) ):
                 main.log.report( "ONOS" + str( n + 1 ) + " response: " +
-                                 str( leader_list[ n ] ) )
-        if leader_result:
-            main.log.report( "Leadership election tests passed(consistent " +
+                                 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)" )
+                             "resigned )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            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()
+            "Run for election on old leader( just so everyone is in the hat )" )
+        runResult = oldLeader.electionTestRun()
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=run_result,
+            actual=runResult,
             onpass="App re-ran for election",
             onfail="App failed to run for election" )
-        if consistent_leader == main.TRUE:
-            after_run = main.ONOScli1.election_test_leader()
+        if consistentLeader == main.TRUE:
+            afterRun = main.ONOScli1.electionTestLeader()
             # verify leader didn't just change
-            if after_run == leader_list[ 0 ]:
-                leader_result = main.TRUE
+            if afterRun == leaderList[ 0 ]:
+                leaderResult = main.TRUE
             else:
-                leader_result = main.FALSE
+                leaderResult = main.FALSE
         # TODO: assert on  run and withdraw results?
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            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.py b/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py
index 0625ad0..7517827 100644
--- a/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py
+++ b/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py
@@ -19,6 +19,8 @@
 CASE14: start election app on all onos nodes
 CASE15: Check that Leadership Election is still functional
 """
+
+
 class HATestMinorityRestart:
 
     def __init__( self ):
@@ -44,158 +46,159 @@
         # TODO: save all the timers and output them for plotting
 
         # load some vairables from the params file
-        PULL_CODE = False
+        PULLCODE = False
         if main.params[ 'Git' ] == 'True':
-            PULL_CODE = True
+            PULLCODE = True
 
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
+        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
+        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" )
-        cell_result = main.ONOSbench.set_cell( cell_name )
-        verify_result = main.ONOSbench.verify_cell()
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
         # FIXME:this is short term fix
         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.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 )
+        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 )
 
-        clean_install_result = main.TRUE
-        git_pull_result = main.TRUE
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
 
         main.step( "Compiling the latest version of ONOS" )
-        if PULL_CODE:
+        if PULLCODE:
             # TODO Configure branch in params
             main.step( "Git checkout and pull master" )
-            main.ONOSbench.git_checkout( "master" )
-            git_pull_result = main.ONOSbench.git_pull()
+            main.ONOSbench.gitCheckout( "master" )
+            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()
+            cleanInstallResult = main.TRUE
+
+            if gitPullResult == main.TRUE:
+                cleanInstallResult = main.ONOSbench.cleanInstall()
             else:
                 main.log.warn( "Did not pull new code so skipping mvn " +
                                "clean install" )
-        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" )
-        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
+        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:
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            if not onos1Isup:
                 main.log.report( "ONOS1 didn't start!" )
-            onos2_isup = main.ONOSbench.isup( ONOS2_ip )
-            if not onos2_isup:
+            onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+            if not onos2Isup:
                 main.log.report( "ONOS2 didn't start!" )
-            onos3_isup = main.ONOSbench.isup( ONOS3_ip )
-            if not onos3_isup:
+            onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+            if not onos3Isup:
                 main.log.report( "ONOS3 didn't start!" )
-            onos4_isup = main.ONOSbench.isup( ONOS4_ip )
-            if not onos4_isup:
+            onos4Isup = main.ONOSbench.isup( ONOS4Ip )
+            if not onos4Isup:
                 main.log.report( "ONOS4 didn't start!" )
-            onos5_isup = main.ONOSbench.isup( ONOS5_ip )
-            if not onos5_isup:
+            onos5Isup = main.ONOSbench.isup( ONOS5Ip )
+            if not onos5Isup:
                 main.log.report( "ONOS5 didn't start!" )
-            onos6_isup = main.ONOSbench.isup( ONOS6_ip )
-            if not onos6_isup:
+            onos6Isup = main.ONOSbench.isup( ONOS6Ip )
+            if not onos6Isup:
                 main.log.report( "ONOS6 didn't start!" )
-            onos7_isup = main.ONOSbench.isup( ONOS7_ip )
-            if not onos7_isup:
+            onos7Isup = main.ONOSbench.isup( ONOS7Ip )
+            if not onos7Isup:
                 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:
+            onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
+                and onos4Isup and onos5Isup and onos6Isup and onos7Isup
+            if onosIsupResult == main.TRUE:
                 break
 
-        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
+        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.start_tcpdump(
+        main.Mininet2.startTcpdump(
             str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
             + "-MN.pcap",
             intf=main.params[ 'MNtcpdump' ][ 'intf' ],
             port=main.params[ 'MNtcpdump' ][ 'port' ] )
 
-        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 )
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and onosInstallResult
+                        and onosIsupResult and cliResults )
 
-        utilities.assert_equals( expect=main.TRUE, actual=case1_result,
-                                 onpass="Test startup successful",
-                                 onfail="Test startup NOT successful" )
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+                                onpass="Test startup successful",
+                                onfail="Test startup NOT successful" )
 
-        if case1_result == main.FALSE:
+        if case1Result == main.FALSE:
             main.cleanup()
             main.exit()
 
@@ -210,174 +213,174 @@
         main.step( "Assign switches to controllers" )
 
         for i in range( 1, 29 ):
-            main.Mininet1.assign_sw_controller(
+            main.Mininet1.assignSwController(
                 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 )
+                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
+        mastershipCheck = main.TRUE
         for i in range( 1, 29 ):
-            response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+            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
+            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:
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
             main.log.report( "Switch mastership assigned correctly" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=mastership_check,
+            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
+        roleCall = main.TRUE
+        roleCheck = main.TRUE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "1000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS1_ip )
+        deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS1Ip )
         # Check assignment
-        if ONOS1_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "2800" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS1_ip )
+        deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS1Ip )
         # Check assignment
-        if ONOS1_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "2000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS2_ip )
+        deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS2Ip )
         # Check assignment
-        if ONOS2_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "3000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS2_ip )
+        deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS2Ip )
         # Check assignment
-        if ONOS2_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "5000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS3_ip )
+        deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS3Ip )
         # Check assignment
-        if ONOS3_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "6000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS3_ip )
+        deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS3Ip )
         # Check assignment
-        if ONOS3_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "3004" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS4_ip )
+        deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS4Ip )
         # Check assignment
-        if ONOS4_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         for i in range( 8, 18 ):
             dpid = '3' + str( i ).zfill( 3 )
-            device_id = main.ONOScli1.get_device( dpid ).get( 'id' )
-            role_call = role_call and main.ONOScli1.device_role(
-                device_id,
-                ONOS5_ip )
+            deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS5Ip )
             # Check assignment
-            if ONOS5_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-                role_check = role_check and main.TRUE
+            if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
             else:
-                role_check = role_check and main.FALSE
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device( "6007" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS6_ip )
+        deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS6Ip )
         # Check assignment
-        if ONOS6_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         for i in range( 18, 28 ):
             dpid = '6' + str( i ).zfill( 3 )
-            device_id = main.ONOScli1.get_device( dpid ).get( 'id' )
-            role_call = role_call and main.ONOScli1.device_role(
-                device_id,
-                ONOS7_ip )
+            deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS7Ip )
             # Check assignment
-            if ONOS7_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-                role_check = role_check and main.TRUE
+            if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
             else:
-                role_check = role_check and main.FALSE
+                roleCheck = roleCheck and main.FALSE
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=role_call,
+            actual=roleCall,
             onpass="Re-assigned switch mastership to designated controller",
-            onfail="Something wrong with device_role calls" )
+            onfail="Something wrong with deviceRole calls" )
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=role_check,
+            actual=roleCheck,
             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" )
+        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 ):
         """
@@ -388,41 +391,41 @@
         main.log.report( "Adding host intents" )
         main.case( "Adding host Intents" )
 
-        main.step( "Discovering  Hosts( Via pingall for now)" )
+        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" )
+        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
+        pingResult = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall()
         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.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" )
+        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
-        intent_add_result = True
+        intentAddResult = True
         for i in range( 8, 18 ):
             main.log.info( "Adding host intent between h" + str( i ) +
                            " and h" + str( i + 10 ) )
@@ -430,23 +433,23 @@
                 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' ]
+            host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
+            host2Id = main.ONOScli1.getHost( 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 )
+            if host1Id and host2Id:
+                tmpResult = main.ONOScli1.addHostIntent(
+                    host1Id,
+                    host2Id )
             else:
-                main.log.error( "Error, get_host() failed" )
-                tmp_result = main.FALSE
-            intent_add_result = bool( ping_result and intent_add_result
-                                      and tmp_result )
+                main.log.error( "Error, getHost() failed" )
+                tmpResult = main.FALSE
+            intentAddResult = bool( pingResult and intentAddResult
+                                     and tmpResult )
         utilities.assert_equals(
             expect=True,
-            actual=intent_add_result,
+            actual=intentAddResult,
             onpass="Switch mastership correctly assigned",
-            onfail="Error in (re)assigning switch mastership" )
+            onfail="Error in ( re )assigning switch mastership" )
         # TODO Check if intents all exist in datastore
 
     def CASE4( self, main ):
@@ -456,26 +459,26 @@
         description = " Ping across added host intents"
         main.log.report( description )
         main.case( description )
-        Ping_Result = main.TRUE
+        PingResult = 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
+            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!" )
-                Ping_Result = main.TRUE
-        if Ping_Result == main.FALSE:
+                PingResult = main.TRUE
+        if PingResult == main.FALSE:
             main.log.report(
                 "Intents have not been installed correctly, pings failed." )
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report(
                 "Intents have been installed correctly and verified by pings" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Ping_Result,
+            actual=PingResult,
             onpass="Intents have been installed correctly and pings work",
             onfail="Intents have not been installed correctly, pings failed." )
 
@@ -494,79 +497,79 @@
         # We can then compare them with eachother and also with past states
 
         main.step( "Get the Mastership of each switch from each controller" )
-        global mastership_state
-        mastership_state = []
+        global mastershipState
+        mastershipState = []
 
         # 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
+        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=roles_not_null,
+            actual=rolesNotNull,
             onpass="Each device has a master",
             onfail="Some devices don't have a master assigned" )
 
-        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()
-        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:
+        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( ONOS1_mastership ) )
+                repr( ONOS1Mastership ) )
             main.log.warn(
                 "ONOS2 mastership response: " +
-                repr( ONOS2_mastership ) )
+                repr( ONOS2Mastership ) )
             main.log.warn(
                 "ONOS3 mastership response: " +
-                repr( ONOS3_mastership ) )
+                repr( ONOS3Mastership ) )
             main.log.warn(
                 "ONOS4 mastership response: " +
-                repr( ONOS4_mastership ) )
+                repr( ONOS4Mastership ) )
             main.log.warn(
                 "ONOS5 mastership response: " +
-                repr( ONOS5_mastership ) )
+                repr( ONOS5Mastership ) )
             main.log.warn(
                 "ONOS6 mastership response: " +
-                repr( ONOS6_mastership ) )
+                repr( ONOS6Mastership ) )
             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
+                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 ),
+                    json.loads( ONOS1Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -575,7 +578,7 @@
             main.log.warn(
                 "ONOS2 roles: ",
                 json.dumps(
-                    json.loads( ONOS2_mastership ),
+                    json.loads( ONOS2Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -584,7 +587,7 @@
             main.log.warn(
                 "ONOS3 roles: ",
                 json.dumps(
-                    json.loads( ONOS3_mastership ),
+                    json.loads( ONOS3Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -593,7 +596,7 @@
             main.log.warn(
                 "ONOS4 roles: ",
                 json.dumps(
-                    json.loads( ONOS4_mastership ),
+                    json.loads( ONOS4Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -602,7 +605,7 @@
             main.log.warn(
                 "ONOS5 roles: ",
                 json.dumps(
-                    json.loads( ONOS5_mastership ),
+                    json.loads( ONOS5Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -611,7 +614,7 @@
             main.log.warn(
                 "ONOS6 roles: ",
                 json.dumps(
-                    json.loads( ONOS6_mastership ),
+                    json.loads( ONOS6Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -620,59 +623,59 @@
             main.log.warn(
                 "ONOS7 roles: ",
                 json.dumps(
-                    json.loads( ONOS7_mastership ),
+                    json.loads( ONOS7Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
                         ',',
                         ': ' ) ) )
-            consistent_mastership = main.FALSE
+            consistentMastership = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_mastership,
+            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:
+        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( 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.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 ),
+                    json.loads( ONOS1Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -681,7 +684,7 @@
             main.log.warn(
                 "ONOS2 intents: ",
                 json.dumps(
-                    json.loads( ONOS2_intents ),
+                    json.loads( ONOS2Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -690,7 +693,7 @@
             main.log.warn(
                 "ONOS3 intents: ",
                 json.dumps(
-                    json.loads( ONOS3_intents ),
+                    json.loads( ONOS3Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -699,7 +702,7 @@
             main.log.warn(
                 "ONOS4 intents: ",
                 json.dumps(
-                    json.loads( ONOS4_intents ),
+                    json.loads( ONOS4Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -708,7 +711,7 @@
             main.log.warn(
                 "ONOS5 intents: ",
                 json.dumps(
-                    json.loads( ONOS5_intents ),
+                    json.loads( ONOS5Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -717,7 +720,7 @@
             main.log.warn(
                 "ONOS6 intents: ",
                 json.dumps(
-                    json.loads( ONOS6_intents ),
+                    json.loads( ONOS6Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -726,7 +729,7 @@
             main.log.warn(
                 "ONOS7 intents: ",
                 json.dumps(
-                    json.loads( ONOS7_intents ),
+                    json.loads( ONOS7Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -734,78 +737,78 @@
                         ': ' ) ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=intent_check,
+            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 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 )
-        ONOS1_flows_json = json.loads( ONOS1_flows )
-        ONOS2_flows_json = json.loads( ONOS2_flows )
-        ONOS3_flows_json = json.loads( ONOS3_flows )
-        ONOS4_flows_json = json.loads( ONOS4_flows )
-        ONOS5_flows_json = json.loads( ONOS5_flows )
-        ONOS6_flows_json = json.loads( ONOS6_flows )
-        ONOS7_flows_json = json.loads( ONOS7_flows )
-        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:
+        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" )
-            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( ONOS1_flows_json ) == len( ONOS2_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS3_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS4_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS5_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS6_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS7_flows_json ):
+            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 )
+        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?
-            flow_state = ONOS1_flows
-            flow_check = main.TRUE
+            flowState = ONOS1Flows
+            flowCheck = main.TRUE
             main.log.report( "Flow count is consistent across all ONOS nodes" )
         else:
             main.log.warn( "ONOS1 flows: " +
-                           json.dumps( ONOS1_flows_json, sort_keys=True,
+                           json.dumps( ONOS1FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS2 flows: " +
-                           json.dumps( ONOS2_flows_json, sort_keys=True,
+                           json.dumps( ONOS2FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS3 flows: " +
-                           json.dumps( ONOS3_flows_json, sort_keys=True,
+                           json.dumps( ONOS3FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS4 flows: " +
-                           json.dumps( ONOS4_flows_json, sort_keys=True,
+                           json.dumps( ONOS4FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS5 flows: " +
-                           json.dumps( ONOS5_flows_json, sort_keys=True,
+                           json.dumps( ONOS5FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS6 flows: " +
-                           json.dumps( ONOS6_flows_json, sort_keys=True,
+                           json.dumps( ONOS6FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS7 flows: " +
-                           json.dumps( ONOS7_flows_json, sort_keys=True,
+                           json.dumps( ONOS7FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=flow_check,
+            actual=flowCheck,
             onpass="The flow count is consistent across all ONOS nodes",
             onfail="ONOS nodes have different flow counts" )
 
@@ -813,7 +816,7 @@
         global flows
         flows = []
         for i in range( 1, 29 ):
-            flows.append( main.Mininet2.get_flowTable( 1.3, "s" + str( i ) ) )
+            flows.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
 
         # TODO: Compare switch flow tables with ONOS flow tables
 
@@ -896,11 +899,11 @@
         hosts.append( main.ONOScli6.hosts() )
         hosts.append( main.ONOScli7.hosts() )
         for controller in range( 0, len( hosts ) ):
-            controller_str = str( controller + 1 )
+            controllerStr = str( controller + 1 )
             for host in hosts[ controller ]:
                 if host[ 'ips' ] == []:
                     main.log.error( "DEBUG:Error with host ips on controller" +
-                                    controller_str + ": " + str( host ) )
+                                    controllerStr + ": " + str( host ) )
         ports = []
         ports.append( main.ONOScli1.ports() )
         ports.append( main.ONOScli2.ports() )
@@ -926,173 +929,173 @@
         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 ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli1.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli2.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli3.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli4.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli5.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli6.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli7.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
 
         # Compare json objects for hosts, dataplane clusters and paths
 
         # hosts
-        consistent_hosts_result = main.TRUE
+        consistentHostsResult = main.TRUE
         for controller in range( len( hosts ) ):
-            controller_str = str( controller + 1 )
+            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" +
-                                     controller_str +
+                                     controllerStr +
                                      " is inconsistent with ONOS1" )
                     main.log.warn( repr( hosts[ controller ] ) )
-                    consistent_hosts_result = main.FALSE
+                    consistentHostsResult = main.FALSE
 
             else:
                 main.log.report( "Error in getting ONOS hosts from ONOS" +
-                                 controller_str )
-                consistent_hosts_result = main.FALSE
-                main.log.warn( "ONOS" + controller_str +
+                                 controllerStr )
+                consistentHostsResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
                                " hosts response: " +
                                repr( hosts[ controller ] ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_hosts_result,
+            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
+        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" +
-                                     controller_str +
+                                     controllerStr +
                                      " is inconsistent with ONOS1" )
-                    consistent_clusters_result = main.FALSE
+                    consistentClustersResult = main.FALSE
 
             else:
                 main.log.report( "Error in getting dataplane clusters " +
-                                 "from ONOS" + controller_str )
-                consistent_clusters_result = main.FALSE
-                main.log.warn( "ONOS" + controller_str +
+                                 "from ONOS" + controllerStr )
+                consistentClustersResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
                                " clusters response: " +
                                repr( clusters[ controller ] ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_clusters_result,
+            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
-        num_clusters = len( json.loads( clusters[ 0 ] ) )
+        numClusters = len( json.loads( clusters[ 0 ] ) )
         utilities.assert_equals(
             expect=1,
-            actual=num_clusters,
+            actual=numClusters,
             onpass="ONOS shows 1 SCC",
             onfail="ONOS shows " +
-            str( num_clusters ) +
+            str( numClusters ) +
             " SCCs" )
 
         # paths
-        consistent_paths_result = main.TRUE
+        consistentPathsResult = main.TRUE
         for controller in range( len( paths ) ):
-            controller_str = str( controller + 1 )
+            controllerStr = str( controller + 1 )
             if "Error" not in paths[ controller ]:
                 if paths[ controller ] == paths[ 0 ]:
                     continue
                 else:  # paths not consistent
-                    main.log.report( "paths from ONOS" + controller_str +
+                    main.log.report( "paths from ONOS" + controllerStr +
                                      " is inconsistent with ONOS1" )
-                    consistent_paths_result = main.FALSE
+                    consistentPathsResult = main.FALSE
 
             else:
                 main.log.report( "Error in getting paths from ONOS" +
-                                 controller_str )
-                consistent_paths_result = main.FALSE
-                main.log.warn( "ONOS" + controller_str + " paths response: " +
+                                 controllerStr )
+                consistentPathsResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr + " paths response: " +
                                repr( paths[ controller ] ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_paths_result,
+            actual=consistentPathsResult,
             onpass="Paths count is consistent across all ONOS nodes",
             onfail="ONOS nodes have different counts of paths" )
 
         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 ):
-            controller_str = str( controller + 1 )
+        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 ]:
-                current_devices_result = main.Mininet1.compare_switches(
+                currentDevicesResult = main.Mininet1.compareSwitches(
                     MNTopo,
                     json.loads(
                         devices[ controller ] ) )
             else:
-                current_devices_result = main.FALSE
+                currentDevicesResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_devices_result,
-                                     onpass="ONOS" + controller_str +
-                                     " Switches view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " Switches view is incorrect" )
+                                    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 ]:
-                current_ports_result = main.Mininet1.compare_ports(
+                currentPortsResult = main.Mininet1.comparePorts(
                     MNTopo,
                     json.loads(
                         ports[ controller ] ) )
             else:
-                current_ports_result = main.FALSE
+                currentPortsResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_ports_result,
-                                     onpass="ONOS" + controller_str +
-                                     " ports view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " ports view is incorrect" )
+                                    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 ]:
-                current_links_result = main.Mininet1.compare_links(
+                currentLinksResult = main.Mininet1.compareLinks(
                     MNTopo,
                     json.loads(
                         links[ controller ] ) )
             else:
-                current_links_result = main.FALSE
+                currentLinksResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_links_result,
-                                     onpass="ONOS" + controller_str +
-                                     " links view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " links view is incorrect" )
+                                    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
+            devicesResults = devicesResults and currentDevicesResult
+            portsResults = portsResults and currentPortsResult
+            linksResults = linksResults and currentLinksResult
 
-        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" )
+        topoResult = devicesResults and portsResults and linksResults\
+            and consistentHostsResult and consistentClustersResult\
+            and consistentPathsResult
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                onpass="Topology Check Test successful",
+                                onfail="Topology Check Test 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" )
+        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 ):
         """
@@ -1102,34 +1105,34 @@
         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 )
+        main.ONOSbench.onosKill( ONOS1Ip )
         time.sleep( 10 )
-        main.ONOSbench.onos_kill( ONOS2_ip )
+        main.ONOSbench.onosKill( ONOS2Ip )
         time.sleep( 10 )
-        main.ONOSbench.onos_kill( ONOS3_ip )
+        main.ONOSbench.onosKill( ONOS3Ip )
 
         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
 
-        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
+        cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
+        cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
+        cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
+        cliResults = cliResult1 and cliResult2 and cliResult3
 
         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" )
+        caseResults = main.TRUE and onosIsupResult and cliResults
+        utilities.assert_equals( expect=main.TRUE, actual=caseResults,
+                                onpass="ONOS restart successful",
+                                onfail="ONOS restart NOT successful" )
 
     def CASE7( self, main ):
         """
@@ -1139,231 +1142,231 @@
         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
+        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=roles_not_null,
+            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,
+        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()
+        # print json.dumps( json.loads( ONOS1Mastership ), 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:
+        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( ONOS1_mastership ) )
+                           repr( ONOS1Mastership ) )
             main.log.warn( "ONOS2 mastership response: " +
-                           repr( ONOS2_mastership ) )
+                           repr( ONOS2Mastership ) )
             main.log.warn( "ONOS3 mastership response: " +
-                           repr( ONOS3_mastership ) )
+                           repr( ONOS3Mastership ) )
             main.log.warn( "ONOS4 mastership response: " +
-                           repr( ONOS4_mastership ) )
+                           repr( ONOS4Mastership ) )
             main.log.warn( "ONOS5 mastership response: " +
-                           repr( ONOS5_mastership ) )
+                           repr( ONOS5Mastership ) )
             main.log.warn( "ONOS6 mastership response: " +
-                           repr( ONOS6_mastership ) )
+                           repr( ONOS6Mastership ) )
             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
+                           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,
+                json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS2 roles: ", json.dumps(
-                json.loads( ONOS2_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS3 roles: ", json.dumps(
-                json.loads( ONOS3_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS4 roles: ", json.dumps(
-                json.loads( ONOS4_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS5 roles: ", json.dumps(
-                json.loads( ONOS5_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS6 roles: ", json.dumps(
-                json.loads( ONOS6_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS7 roles: ", json.dumps(
-                json.loads( ONOS7_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
-            consistent_mastership = main.FALSE
+            consistentMastership = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_mastership,
+            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 )
 
-        current_json = json.loads( ONOS1_mastership )
-        old_json = json.loads( mastership_state )
-        mastership_check = main.TRUE
+        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
+            current = [ switch[ 'master' ] for switch in currentJson
                         if switchDPID in switch[ 'id' ] ]
-            old = [ switch[ 'master' ] for switch in old_json
+            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:
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
             main.log.report( "Mastership of Switches was not changed" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=mastership_check,
+            actual=mastershipCheck,
             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
+        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:
+        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( 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.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,
+            print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS2 intents: " )
-            print json.dumps( json.loads( ONOS2_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS3 intents: " )
-            print json.dumps( json.loads( ONOS3_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS4 intents: " )
-            print json.dumps( json.loads( ONOS4_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS5 intents: " )
-            print json.dumps( json.loads( ONOS5_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS6 intents: " )
-            print json.dumps( json.loads( ONOS6_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS7 intents: " )
-            print json.dumps( json.loads( ONOS7_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=intent_check,
+            actual=intentCheck,
             onpass="Intents are consistent across all ONOS nodes",
             onfail="ONOS nodes have different views of intents" )
 
         # 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: 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
+        if 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 ),
+                print json.dumps( json.loads( ONOS1Intents ),
                                   sort_keys=True, indent=4,
                                   separators=( ',', ': ' ) )
             except:
                 pass
-            same_intents = main.FALSE
+            sameIntents = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=same_intents,
+            actual=sameIntents,
             onpass="Intents are consistent with before failure",
             onfail="The Intents changed during failure" )
-        intent_check = intent_check and same_intents
+        intentCheck = intentCheck and sameIntents
 
         main.step( "Get the OF Table entries and compare to before " +
                    "component failure" )
-        Flow_Tables = main.TRUE
+        FlowTables = 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(
+            tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
+            flows2.append( tmpFlows )
+            tempResult = main.Mininet2.flowComp(
                 flow1=flows[ i ],
-                flow2=tmp_flows )
-            Flow_Tables = Flow_Tables and temp_result
-            if Flow_Tables == main.FALSE:
+                flow2=tmpFlows )
+            FlowTables = FlowTables and tempResult
+            if FlowTables == main.FALSE:
                 main.log.info( "Differences in flow table for switch: s" +
                                str( i + 1 ) )
-        if Flow_Tables == main.TRUE:
+        if FlowTables == main.TRUE:
             main.log.report( "No changes were found in the flow tables" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Flow_Tables,
+            actual=FlowTables,
             onpass="No changes were found in the flow tables",
             onfail="Changes were found in the flow tables" )
 
@@ -1375,77 +1378,77 @@
         main.Mininet2.pingKill(
             main.params[ 'TESTONUSER' ],
             main.params[ 'TESTONIP' ] )
-        Loss_In_Pings = main.FALSE
+        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 ) )
-            Loss_In_Pings = main.Mininet2.checkForLoss(
+            LossInPings = main.Mininet2.checkForLoss(
                 "/tmp/ping.h" +
-                str( i ) ) or Loss_In_Pings
-        if Loss_In_Pings == main.TRUE:
+                str( i ) ) or LossInPings
+        if LossInPings == main.TRUE:
             main.log.info( "Loss in ping detected" )
-        elif Loss_In_Pings == main.ERROR:
+        elif LossInPings == main.ERROR:
             main.log.info( "There are multiple mininet process running" )
-        elif Loss_In_Pings == main.FALSE:
+        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=Loss_In_Pings,
+            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 ):
+        leaderList = []
+        leaderResult = main.TRUE
+        for controller in range( 1, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            leaderN = node.election_test_leader()
-            leader_list.append( leaderN )
+            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" +
+                                 "electionTestLeader function, check the" +
                                  " error logs" )
-                leader_result = main.FALSE
+                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" )
-                leader_result = main.FALSE
-            elif leaderN == ONOS1_ip or leaderN == ONOS2_ip or\
-                    leaderN == ONOS3_ip:
+                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" )
-                leader_result = main.FALSE
-        if len( set( leader_list ) ) != 1:
-            leader_result = main.FALSE
+                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 leader_result:
-            main.log.report( "Leadership election tests passed(consistent " +
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
                              "view of leader across listeners and a new " +
-                             "leader was re-elected if applicable)" )
+                             "leader was re-elected if applicable )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            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 = 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" )
+                                onpass="Constant State Tests Passed",
+                                onfail="Constant state tests failed" )
 
     def CASE8( self, main ):
         """
@@ -1482,22 +1485,22 @@
             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
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = 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:
+        startTime = time.time()
+        while topoResult == main.FALSE and elapsed < 60:
             count = count + 1
             if count > 1:
                 # TODO: Depricate STS usage
                 MNTopo = TestONTopology(
                     main.Mininet1,
                     ctrls )
-            cli_start = time.time()
+            cliStart = time.time()
             devices = []
             devices.append( main.ONOScli1.devices() )
             devices.append( main.ONOScli2.devices() )
@@ -1515,13 +1518,13 @@
             hosts.append( json.loads( main.ONOScli6.hosts() ) )
             hosts.append( json.loads( main.ONOScli7.hosts() ) )
             for controller in range( 0, len( hosts ) ):
-                controller_str = str( controller + 1 )
+                controllerStr = str( controller + 1 )
                 for host in hosts[ controller ]:
                     host
                     if host[ 'ips' ] == []:
                         main.log.error(
                             "DEBUG:Error with host ips on controller" +
-                            controller_str + ": " + str( host ) )
+                            controllerStr + ": " + str( host ) )
             ports = []
             ports.append( main.ONOScli1.ports() )
             ports.append( main.ONOScli2.ports() )
@@ -1547,178 +1550,178 @@
             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 ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli1.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli2.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli3.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli4.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli5.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli6.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli7.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
 
-            elapsed = time.time() - start_time
-            cli_time = time.time() - cli_start
-            print "CLI time: " + str( cli_time )
+            elapsed = time.time() - startTime
+            cliTime = time.time() - cliStart
+            print "CLI time: " + str( cliTime )
 
-            for controller in range( num_controllers ):
-                controller_str = str( controller + 1 )
+            for controller in range( numControllers ):
+                controllerStr = str( controller + 1 )
                 if devices[ controller ] or "Error" not in devices[
                         controller ]:
-                    current_devices_result = main.Mininet1.compare_switches(
+                    currentDevicesResult = main.Mininet1.compareSwitches(
                         MNTopo,
                         json.loads(
                             devices[ controller ] ) )
                 else:
-                    current_devices_result = main.FALSE
+                    currentDevicesResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_devices_result,
-                                         onpass="ONOS" + controller_str +
-                                                " Switches view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " Switches view is incorrect" )
+                                        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 ]:
-                    current_ports_result = main.Mininet1.compare_ports(
+                    currentPortsResult = main.Mininet1.comparePorts(
                         MNTopo,
                         json.loads(
                             ports[ controller ] ) )
                 else:
-                    current_ports_result = main.FALSE
+                    currentPortsResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_ports_result,
-                                         onpass="ONOS" + controller_str +
-                                                " ports view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " ports view is incorrect" )
+                                        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 ]:
-                    current_links_result = main.Mininet1.compare_links(
+                    currentLinksResult = main.Mininet1.compareLinks(
                         MNTopo,
                         json.loads(
                             links[ controller ] ) )
                 else:
-                    current_links_result = main.FALSE
+                    currentLinksResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_links_result,
-                                         onpass="ONOS" + controller_str +
-                                                " links view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " 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
+                                        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, dataplane clusters and paths
 
             # hosts
-            consistent_hosts_result = main.TRUE
+            consistentHostsResult = main.TRUE
             for controller in range( len( hosts ) ):
-                controller_str = str( controller + 1 )
+                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" + controller_str +
+                        main.log.report( "hosts from ONOS" + controllerStr +
                                          " is inconsistent with ONOS1" )
                         main.log.warn( repr( hosts[ controller ] ) )
-                        consistent_hosts_result = main.FALSE
+                        consistentHostsResult = main.FALSE
 
                 else:
                     main.log.report( "Error in getting ONOS hosts from ONOS" +
-                                     controller_str )
-                    consistent_hosts_result = main.FALSE
-                    main.log.warn( "ONOS" + controller_str +
+                                     controllerStr )
+                    consistentHostsResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
                                    " hosts response: " +
                                    repr( hosts[ controller ] ) )
             utilities.assert_equals(
                 expect=main.TRUE,
-                actual=consistent_hosts_result,
+                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
+            consistentClustersResult = main.TRUE
             for controller in range( len( clusters ) ):
-                controller_str = str( controller + 1 )
+                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" +
-                                         controller_str +
+                                         controllerStr +
                                          " is inconsistent with ONOS1" )
-                        consistent_clusters_result = main.FALSE
+                        consistentClustersResult = main.FALSE
 
                 else:
                     main.log.report( "Error in getting dataplane clusters " +
-                                     "from ONOS" + controller_str )
-                    consistent_clusters_result = main.FALSE
-                    main.log.warn( "ONOS" + controller_str +
+                                     "from ONOS" + controllerStr )
+                    consistentClustersResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
                                    " clusters response: " +
                                    repr( clusters[ controller ] ) )
             utilities.assert_equals(
                 expect=main.TRUE,
-                actual=consistent_clusters_result,
+                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
-            num_clusters = len( json.loads( clusters[ 0 ] ) )
+            numClusters = len( json.loads( clusters[ 0 ] ) )
             utilities.assert_equals(
                 expect=1,
-                actual=num_clusters,
+                actual=numClusters,
                 onpass="ONOS shows 1 SCC",
                 onfail="ONOS shows " +
-                str( num_clusters ) +
+                str( numClusters ) +
                 " SCCs" )
 
             # paths
-            consistent_paths_result = main.TRUE
+            consistentPathsResult = main.TRUE
             for controller in range( len( paths ) ):
-                controller_str = str( controller + 1 )
+                controllerStr = str( controller + 1 )
                 if "Error" not in paths[ controller ]:
                     if paths[ controller ] == paths[ 0 ]:
                         continue
                     else:  # paths not consistent
-                        main.log.report( "paths from ONOS" + controller_str +
+                        main.log.report( "paths from ONOS" + controllerStr +
                                          " is inconsistent with ONOS1" )
-                        consistent_paths_result = main.FALSE
+                        consistentPathsResult = main.FALSE
 
                 else:
                     main.log.report( "Error in getting paths from ONOS" +
-                                     controller_str )
-                    consistent_paths_result = main.FALSE
-                    main.log.warn( "ONOS" + controller_str +
+                                     controllerStr )
+                    consistentPathsResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
                                    " paths response: " +
                                    repr( paths[ controller ] ) )
             utilities.assert_equals(
                 expect=main.TRUE,
-                actual=consistent_paths_result,
+                actual=consistentPathsResult,
                 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 )
+            topoResult = ( devicesResults and portsResults and linksResults
+                           and consistentHostsResult
+                           and consistentClustersResult
+                           and consistentPathsResult )
 
-        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"
+        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.report(
-            "Very crass estimate for topology discovery/convergence(" +
-            str( note ) + "): " + str( elapsed ) + " seconds, " +
+            "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:
+        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 ):
@@ -1728,23 +1731,23 @@
         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"
+            "is working properly"
         main.log.report( description )
         main.case( description )
 
         main.step( "Kill Link between s3 and s28" )
-        Link_Down = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
+        LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
         main.log.info(
             "Waiting " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " 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" )
+        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 ):
@@ -1754,23 +1757,23 @@
         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"
+            "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" )
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
         main.log.info(
             "Waiting " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " 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" )
+        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 ):
@@ -1780,7 +1783,7 @@
         # 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 )
@@ -1791,19 +1794,19 @@
         # TODO: Make this switch parameterizable
         main.step( "Kill " + switch )
         main.log.report( "Deleting " + switch )
-        main.Mininet1.del_switch( switch )
-        main.log.info( "Waiting " + str( switch_sleep ) +
+        main.Mininet1.delSwitch( switch )
+        main.log.info( "Waiting " + str( switchSleep ) +
                        " seconds for switch down to be discovered" )
-        time.sleep( switch_sleep )
-        device = main.ONOScli1.get_device( dpid=switchDPID )
+        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?" )
+                                onpass="Kill switch succesful",
+                                onfail="Failed to kill switch?" )
 
     def CASE12( self, main ):
         """
@@ -1812,7 +1815,7 @@
         # 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()
@@ -1822,41 +1825,41 @@
 
         main.step( "Add back " + switch )
         main.log.report( "Adding back " + switch )
-        main.Mininet1.add_switch( switch, dpid=switchDPID )
+        main.Mininet1.addSwitch( switch, dpid=switchDPID )
         # TODO: New dpid or same? Ask Thomas?
         for peer in links:
-            main.Mininet1.add_link( switch, peer )
-        main.Mininet1.assign_sw_controller(
+            main.Mininet1.addLink( switch, peer )
+        main.Mininet1.assignSwController(
             sw=switch.split( 's' )[ 1 ],
-            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 )
+            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( switch_sleep ) +
+            str( switchSleep ) +
             " seconds for switch up to be discovered" )
-        time.sleep( switch_sleep )
-        device = main.ONOScli1.get_device( dpid=switchDPID )
+        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?" )
+                                onpass="add switch succesful",
+                                onfail="Failed to add switch?" )
 
     def CASE13( self, main ):
         """
@@ -1866,13 +1869,13 @@
         import time
         # TODO: make use of this elsewhere
         ips = []
-        ips.append(ONOS1_ip)
-        ips.append(ONOS2_ip)
-        ips.append(ONOS3_ip)
-        ips.append(ONOS4_ip)
-        ips.append(ONOS5_ip)
-        ips.append(ONOS6_ip)
-        ips.append(ONOS7_ip)
+        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 = {}
@@ -1887,50 +1890,50 @@
         main.log.report( description )
         main.case( description )
         main.step( "Killing tcpdumps" )
-        main.Mininet2.stop_tcpdump()
+        main.Mininet2.stopTcpdump()
 
         main.step( "Checking ONOS Logs for errors" )
-        for i in range(7):
+        for i in range( 7 ):
             print colors[ 'purple' ] + "Checking logs for errors on " + \
-                    "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
-            print main.ONOSbench.check_logs( ips[i] )
+                "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
-        teststation_user = main.params[ 'TESTONUSER' ]
-        teststation_IP = main.params[ 'TESTONIP' ]
+        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" ]
+        logFolder = "/opt/onos/log/"
+        logFiles = [ "karaf.log", "karaf.log.1" ]
         # NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            for i in range(7):
-                main.ONOSbench.handle.sendline( "scp sdn@" + ips[i] + ":" +
-                                                log_folder + f + " " +
-                                                teststation_user + "@" +
-                                                teststation_IP + ":" +
-                                                dst_dir + str( testname ) +
+        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 /
-        log_folder = "/opt/onos/var/"
-        log_files = [ "stderr.log", "stdout.log" ]
+        logFolder = "/opt/onos/var/"
+        logFiles = [ "stderr.log", "stdout.log" ]
         # NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            for i in range(7):
-                main.ONOSbench.handle.sendline( "scp sdn@" + ips[i] + ":" +
-                                                log_folder + f + " " +
-                                                teststation_user + "@" +
-                                                teststation_IP + ":" +
-                                                dst_dir + str( testname ) +
+        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
@@ -1940,52 +1943,52 @@
 
         # TODO: actually check something here
         utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
-                                 onpass="Test cleanup successful",
-                                 onfail="Test cleanup NOT successful" )
+                                onpass="Test cleanup successful",
+                                onfail="Test cleanup NOT successful" )
 
     def CASE14( self, main ):
         """
         start election app on all onos nodes
         """
-        leader_result = main.TRUE
+        leaderResult = main.TRUE
         # install app on onos 1
         main.log.info( "Install leadership election app" )
-        main.ONOScli1.feature_install( "onos-app-election" )
+        main.ONOScli1.featureInstall( "onos-app-election" )
         # wait for election
         # check for leader
-        leader = main.ONOScli1.election_test_leader()
+        leader = main.ONOScli1.electionTestLeader()
         # verify leader is ONOS1
-        if leader == ONOS1_ip:
+        if leader == ONOS1Ip:
             # all is well
             pass
         elif leader is None:
             # No leader elected
             main.log.report( "No leader was elected" )
-            leader_result = main.FALSE
+            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" +
+            main.log.report( "Something is wrong with electionTestLeader" +
                              " function, check the error logs" )
-            leader_result = main.FALSE
+            leaderResult = main.FALSE
         else:
             # error in  response
             main.log.report(
-                "Unexpected response from election_test_leader function:'" +
-                str(leader) +
+                "Unexpected response from electionTestLeader function:'" +
+                str( leader ) +
                 "'" )
-            leader_result = main.FALSE
+            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 ):
+        for controller in range( 2, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            node.feature_install( "onos-app-election" )
-            leaderN = node.election_test_leader()
+            node.featureInstall( "onos-app-election" )
+            leaderN = node.electionTestLeader()
             # verify leader is ONOS1
-            if leaderN == ONOS1_ip:
+            if leaderN == ONOS1Ip:
                 # all is well
                 pass
             elif leaderN == main.FALSE:
@@ -1993,23 +1996,23 @@
                 # 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" +
+                                 "electionTestLeader function, check the" +
                                  " error logs" )
-                leader_result = main.FALSE
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
+                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 leader_result:
+        if leaderResult:
             main.log.report( "Leadership election tests passed( consistent " +
                              "view of leader across listeners and a leader " +
-                             "was elected)" )
+                             "was elected )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            actual=leaderResult,
             onpass="Leadership election passed",
             onfail="Something went wrong with Leadership election" )
 
@@ -2017,49 +2020,49 @@
         """
         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()
+        leader = main.ONOScli1.electionTestLeader()
         # 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" )
+        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) +
+                str( leader ) +
                 "'" )
-            leader_result = main.FALSE
-        withdraw_result = old_leader.election_test_withdraw()
+            leaderResult = main.FALSE
+        withdrawResult = oldLeader.electionTestWithdraw()
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=withdraw_result,
+            actual=withdrawResult,
             onpass="App was withdrawn from election",
             onfail="App was not withdrawn from election" )
 
         main.step( "Make sure new leader is elected" )
-        leader_list = []
-        for controller in range( 1, num_controllers + 1 ):
+        leaderList = []
+        for controller in range( 1, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            leader_list.append( node.election_test_leader() )
-        for leaderN in leader_list:
+            leaderList.append( node.electionTestLeader() )
+        for leaderN in leaderList:
             if leaderN == leader:
                 main.log.report(
                     "ONOS" +
@@ -2067,58 +2070,58 @@
                     " still sees " +
                     str( leader ) +
                     " as leader after they withdrew" )
-                leader_result = main.FALSE
+                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 " +
-                                 "election_test_leader function, " +
+                                 "electionTestLeader function, " +
                                  "check the error logs" )
-                leader_result = main.FALSE
-        consistent_leader = main.FALSE
-        if len( set( leader_list ) ) == 1:
+                leaderResult = main.FALSE
+        consistentLeader = main.FALSE
+        if len( set( leaderList ) ) == 1:
             main.log.info( "Each Election-app sees '" +
-                           str(leader_list[0]) +
+                           str( leaderList[ 0 ] ) +
                            "' as the leader" )
-            consistent_leader = main.TRUE
+            consistentLeader = main.TRUE
         else:
             main.log.report(
                 "Inconsistent responses for leader of Election-app:" )
-            for n in range( len( leader_list ) ):
+            for n in range( len( leaderList ) ):
                 main.log.report( "ONOS" + str( n + 1 ) + " response: " +
-                                 str( leader_list[ n ] ) )
-        if leader_result:
-            main.log.report( "Leadership election tests passed(consistent " +
+                                 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)" )
+                             "resigned )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            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()
+            "Run for election on old leader( just so everyone is in the hat )" )
+        runResult = oldLeader.electionTestRun()
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=run_result,
+            actual=runResult,
             onpass="App re-ran for election",
             onfail="App failed to run for election" )
-        if consistent_leader == main.TRUE:
-            after_run = main.ONOScli1.election_test_leader()
+        if consistentLeader == main.TRUE:
+            afterRun = main.ONOScli1.electionTestLeader()
             # verify leader didn't just change
-            if after_run == leader_list[ 0 ]:
-                leader_result = main.TRUE
+            if afterRun == leaderList[ 0 ]:
+                leaderResult = main.TRUE
             else:
-                leader_result = main.FALSE
+                leaderResult = main.FALSE
         # TODO: assert on  run and withdraw results?
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            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.py b/TestON/tests/HATestSanity/HATestSanity.py
index d05b7c9..16df59c 100644
--- a/TestON/tests/HATestSanity/HATestSanity.py
+++ b/TestON/tests/HATestSanity/HATestSanity.py
@@ -20,6 +20,8 @@
 CASE14: start election app on all onos nodes
 CASE15: Check that Leadership Election is still functional
 """
+
+
 class HATestSanity:
 
     def __init__( self ):
@@ -41,161 +43,167 @@
         """
         main.log.report( "ONOS HA Sanity test - initialization" )
         main.case( "Setting up test environment" )
+        # main.step( "This is a multiline \
+        #            comment\
+        #            this is \
+        #            a long \comment" )
+        print "First Line"
         # TODO: save all the timers and output them for plotting
 
         # load some vairables from the params file
-        PULL_CODE = False
+        PULLCODE = False
         if main.params[ 'Git' ] == 'True':
-            PULL_CODE = True
+            PULLCODE = True
 
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
+        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
+        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" )
-        cell_result = main.ONOSbench.set_cell( cell_name )
-        verify_result = main.ONOSbench.verify_cell()
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
         # FIXME:this is short term fix
         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.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 )
+        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 )
 
-        clean_install_result = main.TRUE
-        git_pull_result = main.TRUE
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
 
         main.step( "Compiling the latest version of ONOS" )
-        if PULL_CODE:
+        if PULLCODE:
             # TODO Configure branch in params
             main.step( "Git checkout and pull master" )
-            main.ONOSbench.git_checkout( "master" )
-            git_pull_result = main.ONOSbench.git_pull()
+            main.ONOSbench.gitCheckout( "master" )
+            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()
+            cleanInstallResult = main.TRUE
+
+            if gitPullResult == main.TRUE:
+                cleanInstallResult = main.ONOSbench.cleanInstall()
             else:
                 main.log.warn( "Did not pull new code so skipping mvn " +
                                "clean install" )
-        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" )
-        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
+        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:
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            if not onos1Isup:
                 main.log.report( "ONOS1 didn't start!" )
-            onos2_isup = main.ONOSbench.isup( ONOS2_ip )
-            if not onos2_isup:
+            onos2Isup = main.ONOSbench.isup( ONOS2Ip )
+            if not onos2Isup:
                 main.log.report( "ONOS2 didn't start!" )
-            onos3_isup = main.ONOSbench.isup( ONOS3_ip )
-            if not onos3_isup:
+            onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+            if not onos3Isup:
                 main.log.report( "ONOS3 didn't start!" )
-            onos4_isup = main.ONOSbench.isup( ONOS4_ip )
-            if not onos4_isup:
+            onos4Isup = main.ONOSbench.isup( ONOS4Ip )
+            if not onos4Isup:
                 main.log.report( "ONOS4 didn't start!" )
-            onos5_isup = main.ONOSbench.isup( ONOS5_ip )
-            if not onos5_isup:
+            onos5Isup = main.ONOSbench.isup( ONOS5Ip )
+            if not onos5Isup:
                 main.log.report( "ONOS5 didn't start!" )
-            onos6_isup = main.ONOSbench.isup( ONOS6_ip )
-            if not onos6_isup:
+            onos6Isup = main.ONOSbench.isup( ONOS6Ip )
+            if not onos6Isup:
                 main.log.report( "ONOS6 didn't start!" )
-            onos7_isup = main.ONOSbench.isup( ONOS7_ip )
-            if not onos7_isup:
+            onos7Isup = main.ONOSbench.isup( ONOS7Ip )
+            if not onos7Isup:
                 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:
+            onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
+                and onos4Isup and onos5Isup and onos6Isup and onos7Isup
+            if onosIsupResult == main.TRUE:
                 break
 
-        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
+        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.start_tcpdump(
+        main.Mininet2.startTcpdump(
             str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
             + "-MN.pcap",
             intf=main.params[ 'MNtcpdump' ][ 'intf' ],
             port=main.params[ 'MNtcpdump' ][ 'port' ] )
 
-        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 )
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and onosInstallResult
+                        and onosIsupResult and cliResults )
 
-        utilities.assert_equals( expect=main.TRUE, actual=case1_result,
-                                 onpass="Test startup successful",
-                                 onfail="Test startup NOT successful" )
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+                                onpass="Test startup successful",
+                                onfail="Test startup NOT successful" )
 
-        if case1_result == main.FALSE:
+        if case1Result == main.FALSE:
             main.cleanup()
             main.exit()
 
@@ -210,174 +218,174 @@
         main.step( "Assign switches to controllers" )
 
         for i in range( 1, 29 ):
-            main.Mininet1.assign_sw_controller(
+            main.Mininet1.assignSwController(
                 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 )
+                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
+        mastershipCheck = main.TRUE
         for i in range( 1, 29 ):
-            response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+            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
+            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:
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
             main.log.report( "Switch mastership assigned correctly" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=mastership_check,
+            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
+        roleCall = main.TRUE
+        roleCheck = main.TRUE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "1000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS1_ip )
+        deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS1Ip )
         # Check assignment
-        if ONOS1_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "2800" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS1_ip )
+        deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS1Ip )
         # Check assignment
-        if ONOS1_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "2000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS2_ip )
+        deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS2Ip )
         # Check assignment
-        if ONOS2_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "3000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS2_ip )
+        deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS2Ip )
         # Check assignment
-        if ONOS2_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "5000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS3_ip )
+        deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS3Ip )
         # Check assignment
-        if ONOS3_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "6000" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS3_ip )
+        deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS3Ip )
         # Check assignment
-        if ONOS3_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         # Assign switch
-        device_id = main.ONOScli1.get_device( "3004" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS4_ip )
+        deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS4Ip )
         # Check assignment
-        if ONOS4_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         for i in range( 8, 18 ):
             dpid = '3' + str( i ).zfill( 3 )
-            device_id = main.ONOScli1.get_device( dpid ).get( 'id' )
-            role_call = role_call and main.ONOScli1.device_role(
-                device_id,
-                ONOS5_ip )
+            deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS5Ip )
             # Check assignment
-            if ONOS5_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-                role_check = role_check and main.TRUE
+            if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
             else:
-                role_check = role_check and main.FALSE
+                roleCheck = roleCheck and main.FALSE
 
-        device_id = main.ONOScli1.get_device( "6007" ).get( 'id' )
-        role_call = role_call and main.ONOScli1.device_role(
-            device_id,
-            ONOS6_ip )
+        deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+        roleCall = roleCall and main.ONOScli1.deviceRole(
+            deviceId,
+            ONOS6Ip )
         # Check assignment
-        if ONOS6_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-            role_check = role_check and main.TRUE
+        if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+            roleCheck = roleCheck and main.TRUE
         else:
-            role_check = role_check and main.FALSE
+            roleCheck = roleCheck and main.FALSE
 
         for i in range( 18, 28 ):
             dpid = '6' + str( i ).zfill( 3 )
-            device_id = main.ONOScli1.get_device( dpid ).get( 'id' )
-            role_call = role_call and main.ONOScli1.device_role(
-                device_id,
-                ONOS7_ip )
+            deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+            roleCall = roleCall and main.ONOScli1.deviceRole(
+                deviceId,
+                ONOS7Ip )
             # Check assignment
-            if ONOS7_ip in main.ONOScli1.get_role( device_id ).get( 'master' ):
-                role_check = role_check and main.TRUE
+            if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+                roleCheck = roleCheck and main.TRUE
             else:
-                role_check = role_check and main.FALSE
+                roleCheck = roleCheck and main.FALSE
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=role_call,
+            actual=roleCall,
             onpass="Re-assigned switch mastership to designated controller",
-            onfail="Something wrong with device_role calls" )
+            onfail="Something wrong with deviceRole calls" )
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=role_check,
+            actual=roleCheck,
             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,
+        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" )
+                                 " mastership" )
 
     def CASE3( self, main ):
         """
@@ -387,41 +395,41 @@
         main.log.report( "Adding host intents" )
         main.case( "Adding host Intents" )
 
-        main.step( "Discovering  Hosts( Via pingall for now)" )
+        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" )
+        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
+        pingResult = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall()
         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.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" )
+        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
-        intent_add_result = True
+        intentAddResult = True
         for i in range( 8, 18 ):
             main.log.info( "Adding host intent between h" + str( i ) +
                            " and h" + str( i + 10 ) )
@@ -429,23 +437,24 @@
                 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' ]
+            host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
+            host2Id = main.ONOScli1.getHost( 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 )
+            if host1Id and host2Id:
+                tmpResult = main.ONOScli1.addHostIntent(
+                    host1Id,
+                    host2Id )
             else:
-                main.log.error( "Error, get_host() failed" )
-                tmp_result = main.FALSE
-            intent_add_result = bool( ping_result and intent_add_result
-                                      and tmp_result )
+                main.log.error( "Error, getHost() failed" )
+                tmpResult = main.FALSE
+            intentAddResult = bool( pingResult and intentAddResult
+                                     and tmpResult )
+            # TODO Check that intents were added?
         utilities.assert_equals(
             expect=True,
-            actual=intent_add_result,
-            onpass="Switch mastership correctly assigned",
-            onfail="Error in (re)assigning switch mastership" )
+            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 ):
@@ -455,26 +464,27 @@
         description = " Ping across added host intents"
         main.log.report( description )
         main.case( description )
-        Ping_Result = main.TRUE
+        PingResult = 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
+            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!" )
-                Ping_Result = main.TRUE
-        if Ping_Result == main.FALSE:
+                PingResult = main.TRUE
+        if PingResult == main.FALSE:
             main.log.report(
                 "Intents have not been installed correctly, pings failed." )
-        if Ping_Result == main.TRUE:
+            main.log.info( main.ONOScli1.intents() )
+        if PingResult == main.TRUE:
             main.log.report(
                 "Intents have been installed correctly and verified by pings" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Ping_Result,
+            actual=PingResult,
             onpass="Intents have been installed correctly and pings work",
             onfail="Intents have not been installed correctly, pings failed." )
 
@@ -493,81 +503,81 @@
         # We can then compare them with eachother and also with past states
 
         main.step( "Get the Mastership of each switch from each controller" )
-        global mastership_state
-        mastership_state = []
+        global mastershipState
+        mastershipState = []
 
         # 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
+        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=roles_not_null,
+            actual=rolesNotNull,
             onpass="Each device has a master",
             onfail="Some devices don't have a master assigned" )
 
-        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,
+        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()
+        # print json.dumps( json.loads( ONOS1Mastership ), 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:
+        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( ONOS1_mastership ) )
+                repr( ONOS1Mastership ) )
             main.log.warn(
                 "ONOS2 mastership response: " +
-                repr( ONOS2_mastership ) )
+                repr( ONOS2Mastership ) )
             main.log.warn(
                 "ONOS3 mastership response: " +
-                repr( ONOS3_mastership ) )
+                repr( ONOS3Mastership ) )
             main.log.warn(
                 "ONOS4 mastership response: " +
-                repr( ONOS4_mastership ) )
+                repr( ONOS4Mastership ) )
             main.log.warn(
                 "ONOS5 mastership response: " +
-                repr( ONOS5_mastership ) )
+                repr( ONOS5Mastership ) )
             main.log.warn(
                 "ONOS6 mastership response: " +
-                repr( ONOS6_mastership ) )
+                repr( ONOS6Mastership ) )
             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
+                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 ),
+                    json.loads( ONOS1Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -576,7 +586,7 @@
             main.log.warn(
                 "ONOS2 roles: ",
                 json.dumps(
-                    json.loads( ONOS2_mastership ),
+                    json.loads( ONOS2Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -585,7 +595,7 @@
             main.log.warn(
                 "ONOS3 roles: ",
                 json.dumps(
-                    json.loads( ONOS3_mastership ),
+                    json.loads( ONOS3Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -594,7 +604,7 @@
             main.log.warn(
                 "ONOS4 roles: ",
                 json.dumps(
-                    json.loads( ONOS4_mastership ),
+                    json.loads( ONOS4Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -603,7 +613,7 @@
             main.log.warn(
                 "ONOS5 roles: ",
                 json.dumps(
-                    json.loads( ONOS5_mastership ),
+                    json.loads( ONOS5Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -612,7 +622,7 @@
             main.log.warn(
                 "ONOS6 roles: ",
                 json.dumps(
-                    json.loads( ONOS6_mastership ),
+                    json.loads( ONOS6Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -621,59 +631,59 @@
             main.log.warn(
                 "ONOS7 roles: ",
                 json.dumps(
-                    json.loads( ONOS7_mastership ),
+                    json.loads( ONOS7Mastership ),
                     sort_keys=True,
                     indent=4,
                     separators=(
                         ',',
                         ': ' ) ) )
-            consistent_mastership = main.FALSE
+            consistentMastership = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_mastership,
+            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:
+        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( 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.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 ),
+                    json.loads( ONOS1Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -682,7 +692,7 @@
             main.log.warn(
                 "ONOS2 intents: ",
                 json.dumps(
-                    json.loads( ONOS2_intents ),
+                    json.loads( ONOS2Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -691,7 +701,7 @@
             main.log.warn(
                 "ONOS3 intents: ",
                 json.dumps(
-                    json.loads( ONOS3_intents ),
+                    json.loads( ONOS3Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -700,7 +710,7 @@
             main.log.warn(
                 "ONOS4 intents: ",
                 json.dumps(
-                    json.loads( ONOS4_intents ),
+                    json.loads( ONOS4Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -709,7 +719,7 @@
             main.log.warn(
                 "ONOS5 intents: ",
                 json.dumps(
-                    json.loads( ONOS5_intents ),
+                    json.loads( ONOS5Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -718,7 +728,7 @@
             main.log.warn(
                 "ONOS6 intents: ",
                 json.dumps(
-                    json.loads( ONOS6_intents ),
+                    json.loads( ONOS6Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -727,7 +737,7 @@
             main.log.warn(
                 "ONOS7 intents: ",
                 json.dumps(
-                    json.loads( ONOS7_intents ),
+                    json.loads( ONOS7Intents ),
                     sort_keys=True,
                     indent=4,
                     separators=(
@@ -735,78 +745,78 @@
                         ': ' ) ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=intent_check,
+            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 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 )
-        ONOS1_flows_json = json.loads( ONOS1_flows )
-        ONOS2_flows_json = json.loads( ONOS2_flows )
-        ONOS3_flows_json = json.loads( ONOS3_flows )
-        ONOS4_flows_json = json.loads( ONOS4_flows )
-        ONOS5_flows_json = json.loads( ONOS5_flows )
-        ONOS6_flows_json = json.loads( ONOS6_flows )
-        ONOS7_flows_json = json.loads( ONOS7_flows )
-        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:
+        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" )
-            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( ONOS1_flows_json ) == len( ONOS2_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS3_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS4_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS5_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS6_flows_json )\
-                and len( ONOS1_flows_json ) == len( ONOS7_flows_json ):
+            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 )
+        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?
-            flow_state = ONOS1_flows
-            flow_check = main.TRUE
+            flowState = ONOS1Flows
+            flowCheck = main.TRUE
             main.log.report( "Flow count is consistent across all ONOS nodes" )
         else:
             main.log.warn( "ONOS1 flows: " +
-                           json.dumps( ONOS1_flows_json, sort_keys=True,
+                           json.dumps( ONOS1FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS2 flows: " +
-                           json.dumps( ONOS2_flows_json, sort_keys=True,
+                           json.dumps( ONOS2FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS3 flows: " +
-                           json.dumps( ONOS3_flows_json, sort_keys=True,
+                           json.dumps( ONOS3FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS4 flows: " +
-                           json.dumps( ONOS4_flows_json, sort_keys=True,
+                           json.dumps( ONOS4FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS5 flows: " +
-                           json.dumps( ONOS5_flows_json, sort_keys=True,
+                           json.dumps( ONOS5FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS6 flows: " +
-                           json.dumps( ONOS6_flows_json, sort_keys=True,
+                           json.dumps( ONOS6FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS7 flows: " +
-                           json.dumps( ONOS7_flows_json, sort_keys=True,
+                           json.dumps( ONOS7FlowsJson, sort_keys=True,
                                        indent=4, separators=( ',', ': ' ) ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=flow_check,
+            actual=flowCheck,
             onpass="The flow count is consistent across all ONOS nodes",
             onfail="ONOS nodes have different flow counts" )
 
@@ -814,7 +824,7 @@
         global flows
         flows = []
         for i in range( 1, 29 ):
-            flows.append( main.Mininet2.get_flowTable( 1.3, "s" + str( i ) ) )
+            flows.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
 
         # TODO: Compare switch flow tables with ONOS flow tables
 
@@ -921,173 +931,173 @@
         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 ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli1.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli2.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli3.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli4.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli5.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli6.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
+        tempTopo = main.ONOSbench.getTopology( main.ONOScli7.topology() )
+        paths.append( tempTopo.get( 'paths', False ) )
 
         # Compare json objects for hosts, dataplane clusters and paths
 
         # hosts
-        consistent_hosts_result = main.TRUE
+        consistentHostsResult = main.TRUE
         for controller in range( len( hosts ) ):
-            controller_str = str( controller + 1 )
+            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" +
-                                     controller_str +
+                                     controllerStr +
                                      " is inconsistent with ONOS1" )
                     main.log.warn( repr( hosts[ controller ] ) )
-                    consistent_hosts_result = main.FALSE
+                    consistentHostsResult = main.FALSE
 
             else:
                 main.log.report( "Error in getting ONOS hosts from ONOS" +
-                                 controller_str )
-                consistent_hosts_result = main.FALSE
-                main.log.warn( "ONOS" + controller_str +
+                                 controllerStr )
+                consistentHostsResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
                                " hosts response: " +
                                repr( hosts[ controller ] ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_hosts_result,
+            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
+        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" +
-                                     controller_str +
+                                     controllerStr +
                                      " is inconsistent with ONOS1" )
-                    consistent_clusters_result = main.FALSE
+                    consistentClustersResult = main.FALSE
 
             else:
                 main.log.report( "Error in getting dataplane clusters " +
-                                 "from ONOS" + controller_str )
-                consistent_clusters_result = main.FALSE
-                main.log.warn( "ONOS" + controller_str +
+                                 "from ONOS" + controllerStr )
+                consistentClustersResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr +
                                " clusters response: " +
                                repr( clusters[ controller ] ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_clusters_result,
+            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
-        num_clusters = len( json.loads( clusters[ 0 ] ) )
+        numClusters = len( json.loads( clusters[ 0 ] ) )
         utilities.assert_equals(
             expect=1,
-            actual=num_clusters,
+            actual=numClusters,
             onpass="ONOS shows 1 SCC",
             onfail="ONOS shows " +
-            str( num_clusters ) +
+            str( numClusters ) +
             " SCCs" )
 
         # paths
-        consistent_paths_result = main.TRUE
+        consistentPathsResult = main.TRUE
         for controller in range( len( paths ) ):
-            controller_str = str( controller + 1 )
+            controllerStr = str( controller + 1 )
             if "Error" not in paths[ controller ]:
                 if paths[ controller ] == paths[ 0 ]:
                     continue
                 else:  # paths not consistent
-                    main.log.report( "paths from ONOS" + controller_str +
+                    main.log.report( "paths from ONOS" + controllerStr +
                                      " is inconsistent with ONOS1" )
-                    consistent_paths_result = main.FALSE
+                    consistentPathsResult = main.FALSE
 
             else:
                 main.log.report( "Error in getting paths from ONOS" +
-                                 controller_str )
-                consistent_paths_result = main.FALSE
-                main.log.warn( "ONOS" + controller_str + " paths response: " +
+                                 controllerStr )
+                consistentPathsResult = main.FALSE
+                main.log.warn( "ONOS" + controllerStr + " paths response: " +
                                repr( paths[ controller ] ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_paths_result,
+            actual=consistentPathsResult,
             onpass="Paths count is consistent across all ONOS nodes",
             onfail="ONOS nodes have different counts of paths" )
 
         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 ):
-            controller_str = str( controller + 1 )
+        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 ]:
-                current_devices_result = main.Mininet1.compare_switches(
+                currentDevicesResult = main.Mininet1.compareSwitches(
                     MNTopo,
                     json.loads(
                         devices[ controller ] ) )
             else:
-                current_devices_result = main.FALSE
+                currentDevicesResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_devices_result,
-                                     onpass="ONOS" + controller_str +
-                                     " Switches view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " Switches view is incorrect" )
+                                    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 ]:
-                current_ports_result = main.Mininet1.compare_ports(
+                currentPortsResult = main.Mininet1.comparePorts(
                     MNTopo,
                     json.loads(
                         ports[ controller ] ) )
             else:
-                current_ports_result = main.FALSE
+                currentPortsResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_ports_result,
-                                     onpass="ONOS" + controller_str +
-                                     " ports view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " ports view is incorrect" )
+                                    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 ]:
-                current_links_result = main.Mininet1.compare_links(
+                currentLinksResult = main.Mininet1.compareLinks(
                     MNTopo,
                     json.loads(
                         links[ controller ] ) )
             else:
-                current_links_result = main.FALSE
+                currentLinksResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_links_result,
-                                     onpass="ONOS" + controller_str +
-                                     " links view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " links view is incorrect" )
+                                    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
+            devicesResults = devicesResults and currentDevicesResult
+            portsResults = portsResults and currentPortsResult
+            linksResults = linksResults and currentLinksResult
 
-        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" )
+        topoResult = devicesResults and portsResults and linksResults\
+            and consistentHostsResult and consistentClustersResult\
+            and consistentPathsResult
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                onpass="Topology Check Test successful",
+                                onfail="Topology Check Test 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" )
+        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 ):
         """
@@ -1110,230 +1120,230 @@
         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
+        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=roles_not_null,
+            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,
+        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()
+        # print json.dumps( json.loads( ONOS1Mastership ), 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:
+        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( ONOS1_mastership ) )
+                           repr( ONOS1Mastership ) )
             main.log.warn( "ONOS2 mastership response: " +
-                           repr( ONOS2_mastership ) )
+                           repr( ONOS2Mastership ) )
             main.log.warn( "ONOS3 mastership response: " +
-                           repr( ONOS3_mastership ) )
+                           repr( ONOS3Mastership ) )
             main.log.warn( "ONOS4 mastership response: " +
-                           repr( ONOS4_mastership ) )
+                           repr( ONOS4Mastership ) )
             main.log.warn( "ONOS5 mastership response: " +
-                           repr( ONOS5_mastership ) )
+                           repr( ONOS5Mastership ) )
             main.log.warn( "ONOS6 mastership response: " +
-                           repr( ONOS6_mastership ) )
+                           repr( ONOS6Mastership ) )
             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
+                           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,
+                json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS2 roles: ", json.dumps(
-                json.loads( ONOS2_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS3 roles: ", json.dumps(
-                json.loads( ONOS3_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS4 roles: ", json.dumps(
-                json.loads( ONOS4_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS5 roles: ", json.dumps(
-                json.loads( ONOS5_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS6 roles: ", json.dumps(
-                json.loads( ONOS6_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
             main.log.warn( "ONOS7 roles: ", json.dumps(
-                json.loads( ONOS7_mastership ), sort_keys=True, indent=4,
+                json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
                 separators=( ',', ': ' ) ) )
-            consistent_mastership = main.FALSE
+            consistentMastership = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_mastership,
+            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 )
 
-        current_json = json.loads( ONOS1_mastership )
-        old_json = json.loads( mastership_state )
-        mastership_check = main.TRUE
+        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
+            current = [ switch[ 'master' ] for switch in currentJson
                         if switchDPID in switch[ 'id' ] ]
-            old = [ switch[ 'master' ] for switch in old_json
+            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:
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
             main.log.report( "Mastership of Switches was not changed" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=mastership_check,
+            actual=mastershipCheck,
             onpass="Mastership of Switches was not changed",
             onfail="Mastership of some switches changed" )
-        mastership_check = mastership_check and consistent_mastership
+        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:
+        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( 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.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,
+            print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS2 intents: " )
-            print json.dumps( json.loads( ONOS2_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS3 intents: " )
-            print json.dumps( json.loads( ONOS3_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS4 intents: " )
-            print json.dumps( json.loads( ONOS4_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS5 intents: " )
-            print json.dumps( json.loads( ONOS5_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS6 intents: " )
-            print json.dumps( json.loads( ONOS6_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
             main.log.warn( "ONOS7 intents: " )
-            print json.dumps( json.loads( ONOS7_intents ), sort_keys=True,
+            print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
                               indent=4, separators=( ',', ': ' ) )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=intent_check,
+            actual=intentCheck,
             onpass="Intents are consistent across all ONOS nodes",
             onfail="ONOS nodes have different views of intents" )
 
         # 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: 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
+        if 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 ),
+                print json.dumps( json.loads( ONOS1Intents ),
                                   sort_keys=True, indent=4,
                                   separators=( ',', ': ' ) )
             except:
                 pass
-            same_intents = main.FALSE
+            sameIntents = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=same_intents,
+            actual=sameIntents,
             onpass="Intents are consistent with before failure",
             onfail="The Intents changed during failure" )
-        intent_check = intent_check and same_intents
+        intentCheck = intentCheck and sameIntents
 
         main.step( "Get the OF Table entries and compare to before " +
                    "component failure" )
-        Flow_Tables = main.TRUE
+        FlowTables = 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(
+            tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
+            flows2.append( tmpFlows )
+            tempResult = main.Mininet2.flowComp(
                 flow1=flows[ i ],
-                flow2=tmp_flows )
-            Flow_Tables = Flow_Tables and temp_result
-            if Flow_Tables == main.FALSE:
+                flow2=tmpFlows )
+            FlowTables = FlowTables and tempResult
+            if FlowTables == main.FALSE:
                 main.log.info( "Differences in flow table for switch: s" +
                                str( i + 1 ) )
-        if Flow_Tables == main.TRUE:
+        if FlowTables == main.TRUE:
             main.log.report( "No changes were found in the flow tables" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Flow_Tables,
+            actual=FlowTables,
             onpass="No changes were found in the flow tables",
             onfail="Changes were found in the flow tables" )
 
@@ -1345,37 +1355,37 @@
         main.Mininet2.pingKill(
             main.params[ 'TESTONUSER' ],
             main.params[ 'TESTONIP' ] )
-        Loss_In_Pings = main.FALSE
+        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 ) )
-            Loss_In_Pings = main.Mininet2.checkForLoss(
+            LossInPings = main.Mininet2.checkForLoss(
                 "/tmp/ping.h" +
-                str( i ) ) or Loss_In_Pings
-        if Loss_In_Pings == main.TRUE:
+                str( i ) ) or LossInPings
+        if LossInPings == main.TRUE:
             main.log.info( "Loss in ping detected" )
-        elif Loss_In_Pings == main.ERROR:
+        elif LossInPings == main.ERROR:
             main.log.info( "There are multiple mininet process running" )
-        elif Loss_In_Pings == main.FALSE:
+        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=Loss_In_Pings,
+            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 ):
+        leader = ONOS1Ip
+        leaderResult = main.TRUE
+        for controller in range( 1, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            leaderN = node.election_test_leader()
+            leaderN = node.electionTestLeader()
             # verify leader is ONOS1
             if leaderN == leader:
                 # all is well
@@ -1385,33 +1395,33 @@
             elif leaderN == main.FALSE:
                 # error in  response
                 main.log.report( "Something is wrong with " +
-                                 "election_test_leader function," +
+                                 "electionTestLeader function," +
                                  " check the error logs" )
-                leader_result = main.FALSE
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
+                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 leader_result:
-            main.log.report( "Leadership election tests passed(consistent " +
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
                              "view of leader across listeners and a new " +
-                             "leader was re-elected if applicable)" )
+                             "leader was re-elected if applicable )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            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 = 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" )
+                                onpass="Constant State Tests Passed",
+                                onfail="Constant state tests failed" )
 
     def CASE8( self, main ):
         """
@@ -1448,22 +1458,22 @@
             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
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = 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:
+        startTime = time.time()
+        while topoResult == main.FALSE and elapsed < 60:
             count = count + 1
             if count > 1:
                 # TODO: Depricate STS usage
                 MNTopo = TestONTopology(
                     main.Mininet1,
                     ctrls )
-            cli_start = time.time()
+            cliStart = time.time()
             devices = []
             devices.append( main.ONOScli1.devices() )
             devices.append( main.ONOScli2.devices() )
@@ -1505,178 +1515,178 @@
             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 ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli1.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli2.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli3.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli4.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli5.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli6.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
+            tempTopo = main.ONOSbench.getTopology( main.ONOScli7.topology() )
+            paths.append( tempTopo.get( 'paths', False ) )
 
-            elapsed = time.time() - start_time
-            cli_time = time.time() - cli_start
-            print "CLI time: " + str( cli_time )
+            elapsed = time.time() - startTime
+            cliTime = time.time() - cliStart
+            print "CLI time: " + str( cliTime )
 
-            for controller in range( num_controllers ):
-                controller_str = str( controller + 1 )
+            for controller in range( numControllers ):
+                controllerStr = str( controller + 1 )
                 if devices[ controller ] or "Error" not in devices[
                         controller ]:
-                    current_devices_result = main.Mininet1.compare_switches(
+                    currentDevicesResult = main.Mininet1.compareSwitches(
                         MNTopo,
                         json.loads(
                             devices[ controller ] ) )
                 else:
-                    current_devices_result = main.FALSE
+                    currentDevicesResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_devices_result,
-                                         onpass="ONOS" + controller_str +
-                                                " Switches view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " Switches view is incorrect" )
+                                        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 ]:
-                    current_ports_result = main.Mininet1.compare_ports(
+                    currentPortsResult = main.Mininet1.comparePorts(
                         MNTopo,
                         json.loads(
                             ports[ controller ] ) )
                 else:
-                    current_ports_result = main.FALSE
+                    currentPortsResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_ports_result,
-                                         onpass="ONOS" + controller_str +
-                                                " ports view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " ports view is incorrect" )
+                                        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 ]:
-                    current_links_result = main.Mininet1.compare_links(
+                    currentLinksResult = main.Mininet1.compareLinks(
                         MNTopo,
                         json.loads(
                             links[ controller ] ) )
                 else:
-                    current_links_result = main.FALSE
+                    currentLinksResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_links_result,
-                                         onpass="ONOS" + controller_str +
-                                                " links view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " 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
+                                        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, dataplane clusters and paths
 
             # hosts
-            consistent_hosts_result = main.TRUE
+            consistentHostsResult = main.TRUE
             for controller in range( len( hosts ) ):
-                controller_str = str( controller + 1 )
+                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" + controller_str +
+                        main.log.report( "hosts from ONOS" + controllerStr +
                                          " is inconsistent with ONOS1" )
                         main.log.warn( repr( hosts[ controller ] ) )
-                        consistent_hosts_result = main.FALSE
+                        consistentHostsResult = main.FALSE
 
                 else:
                     main.log.report( "Error in getting ONOS hosts from ONOS" +
-                                     controller_str )
-                    consistent_hosts_result = main.FALSE
-                    main.log.warn( "ONOS" + controller_str +
+                                     controllerStr )
+                    consistentHostsResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
                                    " hosts response: " +
                                    repr( hosts[ controller ] ) )
             utilities.assert_equals(
                 expect=main.TRUE,
-                actual=consistent_hosts_result,
+                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
+            consistentClustersResult = main.TRUE
             for controller in range( len( clusters ) ):
-                controller_str = str( controller + 1 )
+                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" +
-                                         controller_str +
+                                         controllerStr +
                                          " is inconsistent with ONOS1" )
-                        consistent_clusters_result = main.FALSE
+                        consistentClustersResult = main.FALSE
 
                 else:
                     main.log.report( "Error in getting dataplane clusters " +
-                                     "from ONOS" + controller_str )
-                    consistent_clusters_result = main.FALSE
-                    main.log.warn( "ONOS" + controller_str +
+                                     "from ONOS" + controllerStr )
+                    consistentClustersResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
                                    " clusters response: " +
                                    repr( clusters[ controller ] ) )
             utilities.assert_equals(
                 expect=main.TRUE,
-                actual=consistent_clusters_result,
+                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
-            num_clusters = len( json.loads( clusters[ 0 ] ) )
+            numClusters = len( json.loads( clusters[ 0 ] ) )
             utilities.assert_equals(
                 expect=1,
-                actual=num_clusters,
+                actual=numClusters,
                 onpass="ONOS shows 1 SCC",
                 onfail="ONOS shows " +
-                str( num_clusters ) +
+                str( numClusters ) +
                 " SCCs" )
 
             # paths
-            consistent_paths_result = main.TRUE
+            consistentPathsResult = main.TRUE
             for controller in range( len( paths ) ):
-                controller_str = str( controller + 1 )
+                controllerStr = str( controller + 1 )
                 if "Error" not in paths[ controller ]:
                     if paths[ controller ] == paths[ 0 ]:
                         continue
                     else:  # paths not consistent
-                        main.log.report( "paths from ONOS" + controller_str +
+                        main.log.report( "paths from ONOS" + controllerStr +
                                          " is inconsistent with ONOS1" )
-                        consistent_paths_result = main.FALSE
+                        consistentPathsResult = main.FALSE
 
                 else:
                     main.log.report( "Error in getting paths from ONOS" +
-                                     controller_str )
-                    consistent_paths_result = main.FALSE
-                    main.log.warn( "ONOS" + controller_str +
+                                     controllerStr )
+                    consistentPathsResult = main.FALSE
+                    main.log.warn( "ONOS" + controllerStr +
                                    " paths response: " +
                                    repr( paths[ controller ] ) )
             utilities.assert_equals(
                 expect=main.TRUE,
-                actual=consistent_paths_result,
+                actual=consistentPathsResult,
                 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 )
+            topoResult = ( devicesResults and portsResults and linksResults
+                           and consistentHostsResult
+                           and consistentClustersResult
+                           and consistentPathsResult )
 
-        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"
+        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.report(
-            "Very crass estimate for topology discovery/convergence(" +
-            str( note ) + "): " + str( elapsed ) + " seconds, " +
+            "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:
+        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 ):
@@ -1686,23 +1696,23 @@
         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"
+            "is working properly"
         main.log.report( description )
         main.case( description )
 
         main.step( "Kill Link between s3 and s28" )
-        Link_Down = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
+        LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
         main.log.info(
             "Waiting " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " 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" )
+        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 ):
@@ -1712,23 +1722,23 @@
         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"
+            "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" )
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
         main.log.info(
             "Waiting " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " 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" )
+        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 ):
@@ -1738,7 +1748,7 @@
         # 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 )
@@ -1749,19 +1759,19 @@
         # TODO: Make this switch parameterizable
         main.step( "Kill " + switch )
         main.log.report( "Deleting " + switch )
-        main.Mininet1.del_switch( switch )
-        main.log.info( "Waiting " + str( switch_sleep ) +
+        main.Mininet1.delSwitch( switch )
+        main.log.info( "Waiting " + str( switchSleep ) +
                        " seconds for switch down to be discovered" )
-        time.sleep( switch_sleep )
-        device = main.ONOScli1.get_device( dpid=switchDPID )
+        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?" )
+                                onpass="Kill switch succesful",
+                                onfail="Failed to kill switch?" )
 
     def CASE12( self, main ):
         """
@@ -1770,7 +1780,7 @@
         # 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()
@@ -1780,41 +1790,41 @@
 
         main.step( "Add back " + switch )
         main.log.report( "Adding back " + switch )
-        main.Mininet1.add_switch( switch, dpid=switchDPID )
+        main.Mininet1.addSwitch( switch, dpid=switchDPID )
         # TODO: New dpid or same? Ask Thomas?
         for peer in links:
-            main.Mininet1.add_link( switch, peer )
-        main.Mininet1.assign_sw_controller(
+            main.Mininet1.addLink( switch, peer )
+        main.Mininet1.assignSwController(
             sw=switch.split( 's' )[ 1 ],
-            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 )
+            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( switch_sleep ) +
+            str( switchSleep ) +
             " seconds for switch up to be discovered" )
-        time.sleep( switch_sleep )
-        device = main.ONOScli1.get_device( dpid=switchDPID )
+        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?" )
+                                onpass="add switch succesful",
+                                onfail="Failed to add switch?" )
 
     def CASE13( self, main ):
         """
@@ -1824,13 +1834,13 @@
         import time
         # TODO: make use of this elsewhere
         ips = []
-        ips.append(ONOS1_ip)
-        ips.append(ONOS2_ip)
-        ips.append(ONOS3_ip)
-        ips.append(ONOS4_ip)
-        ips.append(ONOS5_ip)
-        ips.append(ONOS6_ip)
-        ips.append(ONOS7_ip)
+        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 = {}
@@ -1845,50 +1855,50 @@
         main.log.report( description )
         main.case( description )
         main.step( "Killing tcpdumps" )
-        main.Mininet2.stop_tcpdump()
+        main.Mininet2.stopTcpdump()
 
         main.step( "Checking ONOS Logs for errors" )
-        for i in range(7):
+        for i in range( 7 ):
             print colors[ 'purple' ] + "Checking logs for errors on " + \
-                    "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
-            print main.ONOSbench.check_logs( ips[i] )
+                "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
-        teststation_user = main.params[ 'TESTONUSER' ]
-        teststation_IP = main.params[ 'TESTONIP' ]
+        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" ]
+        logFolder = "/opt/onos/log/"
+        logFiles = [ "karaf.log", "karaf.log.1" ]
         # NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            for i in range(7):
-                main.ONOSbench.handle.sendline( "scp sdn@" + ips[i] + ":" +
-                                                log_folder + f + " " +
-                                                teststation_user + "@" +
-                                                teststation_IP + ":" +
-                                                dst_dir + str( testname ) +
+        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 /
-        log_folder = "/opt/onos/var/"
-        log_files = [ "stderr.log", "stdout.log" ]
+        logFolder = "/opt/onos/var/"
+        logFiles = [ "stderr.log", "stdout.log" ]
         # NOTE: must end in /
-        dst_dir = "~/packet_captures/"
-        for f in log_files:
-            for i in range(7):
-                main.ONOSbench.handle.sendline( "scp sdn@" + ips[i] + ":" +
-                                                log_folder + f + " " +
-                                                teststation_user + "@" +
-                                                teststation_IP + ":" +
-                                                dst_dir + str( testname ) +
+        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
@@ -1898,52 +1908,52 @@
 
         # TODO: actually check something here
         utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
-                                 onpass="Test cleanup successful",
-                                 onfail="Test cleanup NOT successful" )
+                                onpass="Test cleanup successful",
+                                onfail="Test cleanup NOT successful" )
 
     def CASE14( self, main ):
         """
         start election app on all onos nodes
         """
-        leader_result = main.TRUE
+        leaderResult = main.TRUE
         # install app on onos 1
         main.log.info( "Install leadership election app" )
-        main.ONOScli1.feature_install( "onos-app-election" )
+        main.ONOScli1.featureInstall( "onos-app-election" )
         # wait for election
         # check for leader
-        leader = main.ONOScli1.election_test_leader()
+        leader = main.ONOScli1.electionTestLeader()
         # verify leader is ONOS1
-        if leader == ONOS1_ip:
+        if leader == ONOS1Ip:
             # all is well
             pass
         elif leader is None:
             # No leader elected
             main.log.report( "No leader was elected" )
-            leader_result = main.FALSE
+            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" +
+            main.log.report( "Something is wrong with electionTestLeader" +
                              " function, check the error logs" )
-            leader_result = main.FALSE
+            leaderResult = main.FALSE
         else:
             # error in  response
             main.log.report(
-                "Unexpected response from election_test_leader function:'" +
-                str(leader) +
+                "Unexpected response from electionTestLeader function:'" +
+                str( leader ) +
                 "'" )
-            leader_result = main.FALSE
+            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 ):
+        for controller in range( 2, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            node.feature_install( "onos-app-election" )
-            leaderN = node.election_test_leader()
+            node.featureInstall( "onos-app-election" )
+            leaderN = node.electionTestLeader()
             # verify leader is ONOS1
-            if leaderN == ONOS1_ip:
+            if leaderN == ONOS1Ip:
                 # all is well
                 pass
             elif leaderN == main.FALSE:
@@ -1951,23 +1961,23 @@
                 # 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" +
+                                 "electionTestLeader function, check the" +
                                  " error logs" )
-                leader_result = main.FALSE
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
+                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 leader_result:
+        if leaderResult:
             main.log.report( "Leadership election tests passed( consistent " +
                              "view of leader across listeners and a leader " +
-                             "was elected)" )
+                             "was elected )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            actual=leaderResult,
             onpass="Leadership election passed",
             onfail="Something went wrong with Leadership election" )
 
@@ -1975,49 +1985,49 @@
         """
         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()
+        leader = main.ONOScli1.electionTestLeader()
         # 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" )
+        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) +
+                str( leader ) +
                 "'" )
-            leader_result = main.FALSE
-        withdraw_result = old_leader.election_test_withdraw()
+            leaderResult = main.FALSE
+        withdrawResult = oldLeader.electionTestWithdraw()
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=withdraw_result,
+            actual=withdrawResult,
             onpass="App was withdrawn from election",
             onfail="App was not withdrawn from election" )
 
         main.step( "Make sure new leader is elected" )
-        leader_list = []
-        for controller in range( 1, num_controllers + 1 ):
+        leaderList = []
+        for controller in range( 1, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            leader_list.append( node.election_test_leader() )
-        for leaderN in leader_list:
+            leaderList.append( node.electionTestLeader() )
+        for leaderN in leaderList:
             if leaderN == leader:
                 main.log.report(
                     "ONOS" +
@@ -2025,58 +2035,58 @@
                     " still sees " +
                     str( leader ) +
                     " as leader after they withdrew" )
-                leader_result = main.FALSE
+                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 " +
-                                 "election_test_leader function, " +
+                                 "electionTestLeader function, " +
                                  "check the error logs" )
-                leader_result = main.FALSE
-        consistent_leader = main.FALSE
-        if len( set( leader_list ) ) == 1:
+                leaderResult = main.FALSE
+        consistentLeader = main.FALSE
+        if len( set( leaderList ) ) == 1:
             main.log.info( "Each Election-app sees '" +
-                           str(leader_list[0]) +
+                           str( leaderList[ 0 ] ) +
                            "' as the leader" )
-            consistent_leader = main.TRUE
+            consistentLeader = main.TRUE
         else:
             main.log.report(
                 "Inconsistent responses for leader of Election-app:" )
-            for n in range( len( leader_list ) ):
+            for n in range( len( leaderList ) ):
                 main.log.report( "ONOS" + str( n + 1 ) + " response: " +
-                                 str( leader_list[ n ] ) )
-        if leader_result:
-            main.log.report( "Leadership election tests passed(consistent " +
+                                 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)" )
+                             "resigned )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            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()
+            "Run for election on old leader( just so everyone is in the hat )" )
+        runResult = oldLeader.electionTestRun()
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=run_result,
+            actual=runResult,
             onpass="App re-ran for election",
             onfail="App failed to run for election" )
-        if consistent_leader == main.TRUE:
-            after_run = main.ONOScli1.election_test_leader()
+        if consistentLeader == main.TRUE:
+            afterRun = main.ONOScli1.electionTestLeader()
             # verify leader didn't just change
-            if after_run == leader_list[ 0 ]:
-                leader_result = main.TRUE
+            if afterRun == leaderList[ 0 ]:
+                leaderResult = main.TRUE
             else:
-                leader_result = main.FALSE
+                leaderResult = main.FALSE
         # TODO: assert on  run and withdraw results?
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            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/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py b/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py
index ef23794..2aea5bf 100644
--- a/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py
+++ b/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py
@@ -19,6 +19,8 @@
 CASE14: start election app on all onos nodes
 CASE15: Check that Leadership Election is still functional
 """
+
+
 class HATestSingleInstanceRestart:
 
     def __init__( self ):
@@ -44,116 +46,117 @@
         # TODO: save all the timers and output them for plotting
 
         # load some vairables from the params file
-        PULL_CODE = False
+        PULLCODE = False
         if main.params[ 'Git' ] == 'True':
-            PULL_CODE = True
+            PULLCODE = True
 
-        cell_name = main.params[ 'ENV' ][ 'cellName' ]
+        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
+        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" )
-        cell_result = main.ONOSbench.set_cell( cell_name )
-        verify_result = main.ONOSbench.verify_cell()
+        cellResult = main.ONOSbench.setCell( cellName )
+        verifyResult = main.ONOSbench.verifyCell()
 
         # FIXME:this is short term fix
         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.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 )
+        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 )
 
-        clean_install_result = main.TRUE
-        git_pull_result = main.TRUE
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
 
         main.step( "Compiling the latest version of ONOS" )
-        if PULL_CODE:
+        if PULLCODE:
             # TODO Configure branch in params
             main.step( "Git checkout and pull master" )
-            main.ONOSbench.git_checkout( "master" )
-            git_pull_result = main.ONOSbench.git_pull()
+            main.ONOSbench.gitCheckout( "master" )
+            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()
+            cleanInstallResult = main.TRUE
+
+            if gitPullResult == main.TRUE:
+                cleanInstallResult = main.ONOSbench.cleanInstall()
             else:
                 main.log.warn( "Did not pull new code so skipping mvn " +
                                "clean install" )
-        main.ONOSbench.get_version( report=True )
+        main.ONOSbench.getVersion( report=True )
 
-        cell_result = main.ONOSbench.set_cell( "SingleHA" )
-        verify_result = main.ONOSbench.verify_cell()
+        cellResult = main.ONOSbench.setCell( "SingleHA" )
+        verifyResult = main.ONOSbench.verifyCell()
         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" )
         # TODO check bundle:list?
         for i in range( 2 ):
-            onos1_isup = main.ONOSbench.isup( ONOS1_ip )
-            if onos1_isup:
+            onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+            if onos1Isup:
                 break
-        if not onos1_isup:
+        if not onos1Isup:
             main.log.report( "ONOS1 didn't start!" )
 
-        cli_result = main.ONOScli1.start_onos_cli( ONOS1_ip )
+        cliResult = main.ONOScli1.startOnosCli( ONOS1Ip )
 
         main.step( "Start Packet Capture MN" )
-        main.Mininet2.start_tcpdump(
+        main.Mininet2.startTcpdump(
             str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
             + "-MN.pcap",
             intf=main.params[ 'MNtcpdump' ][ 'intf' ],
             port=main.params[ 'MNtcpdump' ][ 'port' ] )
 
-        case1_result = ( clean_install_result and package_result and
-                         cell_result and verify_result and onos1_install_result
-                         and onos1_isup and cli_result )
+        case1Result = ( cleanInstallResult and packageResult and
+                        cellResult and verifyResult and onos1InstallResult
+                        and onos1Isup and cliResult )
 
-        utilities.assert_equals( expect=main.TRUE, actual=case1_result,
-                                 onpass="Test startup successful",
-                                 onfail="Test startup NOT successful" )
+        utilities.assert_equals( expect=main.TRUE, actual=case1Result,
+                                onpass="Test startup successful",
+                                onfail="Test startup NOT successful" )
 
-        if case1_result == main.FALSE:
+        if case1Result == main.FALSE:
             main.cleanup()
             main.exit()
 
@@ -168,26 +171,26 @@
         main.step( "Assign switches to controllers" )
 
         for i in range( 1, 29 ):
-            main.Mininet1.assign_sw_controller(
+            main.Mininet1.assignSwController(
                 sw=str( i ),
-                ip1=ONOS1_ip, port1=ONOS1_port )
+                ip1=ONOS1Ip, port1=ONOS1Port )
 
-        mastership_check = main.TRUE
+        mastershipCheck = main.TRUE
         for i in range( 1, 29 ):
-            response = main.Mininet1.get_sw_controller( "s" + str( i ) )
+            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
+            if re.search( "tcp:" + ONOS1Ip, response ):
+                mastershipCheck = mastershipCheck and main.TRUE
             else:
-                mastership_check = main.FALSE
-        if mastership_check == main.TRUE:
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
             main.log.report( "Switch mastership assigned correctly" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=mastership_check,
+            actual=mastershipCheck,
             onpass="Switch mastership assigned correctly",
             onfail="Switches not assigned correctly to controllers" )
 
@@ -202,29 +205,29 @@
         main.log.report( "Adding host intents" )
         main.case( "Adding host Intents" )
 
-        main.step( "Discovering  Hosts( Via pingall for now)" )
+        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.ONOScli1.featureInstall( "onos-app-fwd" )
 
         # REACTIVE FWD test
-        ping_result = main.FALSE
+        pingResult = main.FALSE
         time1 = time.time()
-        ping_result = main.Mininet1.pingall()
+        pingResult = main.Mininet1.pingall()
         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.feature_uninstall( "onos-app-fwd" )
+        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
-        intent_add_result = True
+        intentAddResult = True
         for i in range( 8, 18 ):
             main.log.info( "Adding host intent between h" + str( i ) +
                            " and h" + str( i + 10 ) )
@@ -232,23 +235,23 @@
                 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' ]
+            host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
+            host2Id = main.ONOScli1.getHost( 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 )
+            if host1Id and host2Id:
+                tmpResult = main.ONOScli1.addHostIntent(
+                    host1Id,
+                    host2Id )
             else:
-                main.log.error( "Error, get_host() failed" )
-                tmp_result = main.FALSE
-            intent_add_result = bool( ping_result and intent_add_result
-                                      and tmp_result )
+                main.log.error( "Error, getHost() failed" )
+                tmpResult = main.FALSE
+            intentAddResult = bool( pingResult and intentAddResult
+                                     and tmpResult )
         utilities.assert_equals(
             expect=True,
-            actual=intent_add_result,
+            actual=intentAddResult,
             onpass="Switch mastership correctly assigned",
-            onfail="Error in (re)assigning switch mastership" )
+            onfail="Error in ( re )assigning switch mastership" )
         # TODO Check if intents all exist in datastore
 
     def CASE4( self, main ):
@@ -258,26 +261,26 @@
         description = " Ping across added host intents"
         main.log.report( description )
         main.case( description )
-        Ping_Result = main.TRUE
+        PingResult = 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
+            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!" )
-                Ping_Result = main.TRUE
-        if Ping_Result == main.FALSE:
+                PingResult = main.TRUE
+        if PingResult == main.FALSE:
             main.log.report(
                 "Intents have not been installed correctly, pings failed." )
-        if Ping_Result == main.TRUE:
+        if PingResult == main.TRUE:
             main.log.report(
                 "Intents have been installed correctly and verified by pings" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Ping_Result,
+            actual=PingResult,
             onpass="Intents have been installed correctly and pings work",
             onfail="Intents have not been installed correctly, pings failed." )
 
@@ -296,58 +299,58 @@
         # We can then compare them with eachother and also with past states
 
         main.step( "Get the Mastership of each switch from each controller" )
-        global mastership_state
-        mastership_state = []
+        global mastershipState
+        mastershipState = []
 
         # Assert that each device has a master
-        roles_not_null = main.ONOScli1.roles_not_null()
+        rolesNotNull = main.ONOScli1.rolesNotNull()
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=roles_not_null,
+            actual=rolesNotNull,
             onpass="Each device has a master",
             onfail="Some devices don't have a master assigned" )
 
-        ONOS1_mastership = main.ONOScli1.roles()
+        ONOS1Mastership = main.ONOScli1.roles()
         # TODO: Make this a meaningful check
-        if "Error" in ONOS1_mastership or not ONOS1_mastership:
+        if "Error" in ONOS1Mastership or not ONOS1Mastership:
             main.log.report( "Error in getting ONOS roles" )
             main.log.warn(
                 "ONOS1 mastership response: " +
-                repr( ONOS1_mastership ) )
-            consistent_mastership = main.FALSE
+                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:
+        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( ONOS1_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:
+        global flowState
+        flowState = []
+        ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
+        flowCheck = main.FALSE
+        if "Error" in ONOS1Flows or not ONOS1Flows:
             main.log.report( "Error in getting ONOS intents" )
-            main.log.warn( "ONOS1 flows repsponse: " + ONOS1_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
+            flowState = ONOS1Flows
+            flowCheck = main.TRUE
 
         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.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
 
         # TODO: Compare switch flow tables with ONOS flow tables
 
@@ -378,68 +381,68 @@
         links.append( main.ONOScli1.links() )
 
         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 ):
-            controller_str = str( controller + 1 )
+        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 ]:
-                current_devices_result = main.Mininet1.compare_switches(
+                currentDevicesResult = main.Mininet1.compareSwitches(
                     MNTopo,
                     json.loads(
                         devices[ controller ] ) )
             else:
-                current_devices_result = main.FALSE
+                currentDevicesResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_devices_result,
-                                     onpass="ONOS" + controller_str +
-                                     " Switches view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " Switches view is incorrect" )
+                                    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 ]:
-                current_ports_result = main.Mininet1.compare_ports(
+                currentPortsResult = main.Mininet1.comparePorts(
                     MNTopo,
                     json.loads(
                         ports[ controller ] ) )
             else:
-                current_ports_result = main.FALSE
+                currentPortsResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_ports_result,
-                                     onpass="ONOS" + controller_str +
-                                     " ports view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " ports view is incorrect" )
+                                    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 ]:
-                current_links_result = main.Mininet1.compare_links(
+                currentLinksResult = main.Mininet1.compareLinks(
                     MNTopo,
                     json.loads(
                         links[ controller ] ) )
             else:
-                current_links_result = main.FALSE
+                currentLinksResult = main.FALSE
             utilities.assert_equals( expect=main.TRUE,
-                                     actual=current_links_result,
-                                     onpass="ONOS" + controller_str +
-                                     " links view is correct",
-                                     onfail="ONOS" + controller_str +
-                                     " links view is incorrect" )
+                                    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
+            devicesResults = devicesResults and currentDevicesResult
+            portsResults = portsResults and currentPortsResult
+            linksResults = linksResults and currentLinksResult
 
-        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" )
+        topoResult = devicesResults and portsResults and linksResults
+        utilities.assert_equals( expect=main.TRUE, actual=topoResult,
+                                onpass="Topology Check Test successful",
+                                onfail="Topology Check Test 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" )
+        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 ):
         """
@@ -449,25 +452,25 @@
 
         main.log.report( "Restart ONOS node" )
         main.log.case( "Restart ONOS node" )
-        main.ONOSbench.onos_kill( ONOS1_ip )
+        main.ONOSbench.onosKill( ONOS1Ip )
         start = time.time()
 
         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" )
+        caseResults = main.TRUE and onos1Isup and cliResult
+        utilities.assert_equals( expect=main.TRUE, actual=caseResults,
+                                onpass="ONOS restart successful",
+                                onfail="ONOS restart NOT successful" )
         main.log.info(
             "ESTIMATE: ONOS took %s seconds to restart" %
             str( elapsed ) )
@@ -481,74 +484,74 @@
         main.case( "Running ONOS Constant State Tests" )
 
         # Assert that each device has a master
-        roles_not_null = main.ONOScli1.roles_not_null()
+        rolesNotNull = main.ONOScli1.rolesNotNull()
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=roles_not_null,
+            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()
+        ONOS1Mastership = main.ONOScli1.roles()
         # FIXME: Refactor this whole case for single instance
-        if "Error" in ONOS1_mastership or not ONOS1_mastership:
+        if "Error" in ONOS1Mastership or not ONOS1Mastership:
             main.log.report( "Error in getting ONOS mastership" )
             main.log.warn(
                 "ONOS1 mastership response: " +
-                repr( ONOS1_mastership ) )
-            consistent_mastership = main.FALSE
+                repr( ONOS1Mastership ) )
+            consistentMastership = main.FALSE
         else:
-            consistent_mastership = main.TRUE
+            consistentMastership = main.TRUE
             main.log.report(
                 "Switch roles are consistent across all ONOS nodes" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=consistent_mastership,
+            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 )
 
-        current_json = json.loads( ONOS1_mastership )
-        old_json = json.loads( mastership_state )
-        mastership_check = main.TRUE
+        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
+            current = [ switch[ 'master' ] for switch in currentJson
                         if switchDPID in switch[ 'id' ] ]
-            old = [ switch[ 'master' ] for switch in old_json
+            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:
+                mastershipCheck = main.FALSE
+        if mastershipCheck == main.TRUE:
             main.log.report( "Mastership of Switches was not changed" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=mastership_check,
+            actual=mastershipCheck,
             onpass="Mastership of Switches was not changed",
             onfail="Mastership of some switches changed" )
-        mastership_check = mastership_check and consistent_mastership
+        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:
+        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( ONOS1_intents ) )
+            main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
         else:
-            intent_check = main.TRUE
+            intentCheck = main.TRUE
             main.log.report( "Intents are consistent across all ONOS nodes" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=intent_check,
+            actual=intentCheck,
             onpass="Intents are consistent across all ONOS nodes",
             onfail="ONOS nodes have different views of intents" )
 
@@ -556,60 +559,60 @@
         # 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: 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
+        if 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 ),
+                print json.dumps( json.loads( ONOS1Intents ),
                                   sort_keys=True, indent=4,
                                   separators=( ',', ': ' ) )
             except:
                 pass
-            same_intents = main.FALSE
+            sameIntents = main.FALSE
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=same_intents,
+            actual=sameIntents,
             onpass="Intents are consistent with before failure",
             onfail="The Intents changed during failure" )
-        intent_check = intent_check and same_intents
+        intentCheck = intentCheck and sameIntents
         """
         main.step( "Get the OF Table entries and compare to before " +
                    "component failure" )
-        Flow_Tables = main.TRUE
+        FlowTables = 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(
+            tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
+            flows2.append( tmpFlows )
+            tempResult = main.Mininet2.flowComp(
                 flow1=flows[ i ],
-                flow2=tmp_flows )
-            Flow_Tables = Flow_Tables and temp_result
-            if Flow_Tables == main.FALSE:
+                flow2=tmpFlows )
+            FlowTables = FlowTables and tempResult
+            if FlowTables == main.FALSE:
                 main.log.info( "Differences in flow table for switch: s" +
                                str( i + 1 ) )
-        if Flow_Tables == main.TRUE:
+        if FlowTables == main.TRUE:
             main.log.report( "No changes were found in the flow tables" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=Flow_Tables,
+            actual=FlowTables,
             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 ):
+        leader = ONOS1Ip
+        leaderResult = main.TRUE
+        for controller in range( 1, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            leaderN = node.election_test_leader()
+            leaderN = node.electionTestLeader()
             # verify leader is ONOS1
             # NOTE even though we restarted ONOS, it is the only one so onos 1
             # must be leader
@@ -619,33 +622,33 @@
             elif leaderN == main.FALSE:
                 # error in  response
                 main.log.report( "Something is wrong with " +
-                                 "election_test_leader function, check the" +
+                                 "electionTestLeader function, check the" +
                                  " error logs" )
-                leader_result = main.FALSE
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
+                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 leader_result:
-            main.log.report( "Leadership election tests passed(consistent " +
+        if leaderResult:
+            main.log.report( "Leadership election tests passed( consistent " +
                              "view of leader across listeners and a new " +
-                             "leader was re-elected if applicable)" )
+                             "leader was re-elected if applicable )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            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 = ( 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" )
+                                onpass="Constant State Tests Passed",
+                                onfail="Constant state tests failed" )
 
     def CASE8( self, main ):
         """
@@ -677,21 +680,21 @@
             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
+        devicesResults = main.TRUE
+        portsResults = main.TRUE
+        linksResults = 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:
+        startTime = time.time()
+        while topoResult == main.FALSE and elapsed < 60:
             count = count + 1
             if count > 1:
                 MNTopo = TestONTopology(
                     main.Mininet1,
                     ctrls )
-            cli_start = time.time()
+            cliStart = time.time()
             devices = []
             devices.append( main.ONOScli1.devices() )
             """
@@ -702,73 +705,73 @@
             ports.append( main.ONOScli1.ports() )
             links = []
             links.append( main.ONOScli1.links() )
-            elapsed = time.time() - start_time
-            cli_time = time.time() - cli_start
-            print "CLI time: " + str( cli_time )
+            elapsed = time.time() - startTime
+            cliTime = time.time() - cliStart
+            print "CLI time: " + str( cliTime )
 
-            for controller in range( num_controllers ):
-                controller_str = str( controller + 1 )
+            for controller in range( numControllers ):
+                controllerStr = str( controller + 1 )
                 if devices[ controller ] or "Error" not in devices[
                         controller ]:
-                    current_devices_result = main.Mininet1.compare_switches(
+                    currentDevicesResult = main.Mininet1.compareSwitches(
                         MNTopo,
                         json.loads(
                             devices[ controller ] ) )
                 else:
-                    current_devices_result = main.FALSE
+                    currentDevicesResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_devices_result,
-                                         onpass="ONOS" + controller_str +
-                                                " Switches view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " Switches view is incorrect" )
+                                        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 ]:
-                    current_ports_result = main.Mininet1.compare_ports(
+                    currentPortsResult = main.Mininet1.comparePorts(
                         MNTopo,
                         json.loads(
                             ports[ controller ] ) )
                 else:
-                    current_ports_result = main.FALSE
+                    currentPortsResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_ports_result,
-                                         onpass="ONOS" + controller_str +
-                                                " ports view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " ports view is incorrect" )
+                                        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 ]:
-                    current_links_result = main.Mininet1.compare_links(
+                    currentLinksResult = main.Mininet1.compareLinks(
                         MNTopo,
                         json.loads(
                             links[ controller ] ) )
                 else:
-                    current_links_result = main.FALSE
+                    currentLinksResult = main.FALSE
                 utilities.assert_equals( expect=main.TRUE,
-                                         actual=current_links_result,
-                                         onpass="ONOS" + controller_str +
-                                                " links view is correct",
-                                         onfail="ONOS" + controller_str +
-                                                " 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
+                                        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
 
-        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"
+        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.report(
-            "Very crass estimate for topology discovery/convergence(" +
-            str( note ) + "): " + str( elapsed ) + " seconds, " +
+            "Very crass estimate for topology discovery/convergence( " +
+            str( note ) + " ): " + 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:
+        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 ):
@@ -778,23 +781,23 @@
         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"
+            "is working properly"
         main.log.report( description )
         main.case( description )
 
         main.step( "Kill Link between s3 and s28" )
-        Link_Down = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
+        LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
         main.log.info(
             "Waiting " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " 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" )
+        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 ):
@@ -804,23 +807,23 @@
         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"
+            "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" )
+        LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
         main.log.info(
             "Waiting " +
-            str( link_sleep ) +
+            str( linkSleep ) +
             " 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" )
+        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 ):
@@ -830,7 +833,7 @@
         # 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 )
@@ -841,19 +844,19 @@
         # TODO: Make this switch parameterizable
         main.step( "Kill " + switch )
         main.log.report( "Deleting " + switch )
-        main.Mininet1.del_switch( switch )
-        main.log.info( "Waiting " + str( switch_sleep ) +
+        main.Mininet1.delSwitch( switch )
+        main.log.info( "Waiting " + str( switchSleep ) +
                        " seconds for switch down to be discovered" )
-        time.sleep( switch_sleep )
-        device = main.ONOScli1.get_device( dpid=switchDPID )
+        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?" )
+                                onpass="Kill switch succesful",
+                                onfail="Failed to kill switch?" )
 
     def CASE12( self, main ):
         """
@@ -862,7 +865,7 @@
         # 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()
@@ -872,26 +875,26 @@
 
         main.step( "Add back " + switch )
         main.log.report( "Adding back " + switch )
-        main.Mininet1.add_switch( switch, dpid=switchDPID )
+        main.Mininet1.addSwitch( switch, dpid=switchDPID )
         # TODO: New dpid or same? Ask Thomas?
         for peer in links:
-            main.Mininet1.add_link( switch, peer )
-        main.Mininet1.assign_sw_controller( sw=switch.split( 's' )[ 1 ],
-                                            ip1=ONOS1_ip, port1=ONOS1_port )
+            main.Mininet1.addLink( switch, peer )
+        main.Mininet1.assignSwController( sw=switch.split( 's' )[ 1 ],
+                                           ip1=ONOS1Ip, port1=ONOS1Port )
         main.log.info(
             "Waiting " +
-            str( switch_sleep ) +
+            str( switchSleep ) +
             " seconds for switch up to be discovered" )
-        time.sleep( switch_sleep )
-        device = main.ONOScli1.get_device( dpid=switchDPID )
+        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?" )
+                                onpass="add switch succesful",
+                                onfail="Failed to add switch?" )
 
     def CASE13( self, main ):
         """
@@ -912,46 +915,46 @@
         main.log.report( description )
         main.case( description )
         main.step( "Killing tcpdumps" )
-        main.Mininet2.stop_tcpdump()
+        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 )
+            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' ]
+        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" ]
+        logFolder = "/opt/onos/log/"
+        logFiles = [ "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 +
+        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( "\$" )
             print main.ONOSbench.handle.before
 
         # std*.log's
         # NOTE: must end in /
-        log_folder = "/opt/onos/var/"
-        log_files = [ "stderr.log", "stdout.log" ]
+        logFolder = "/opt/onos/var/"
+        logFiles = [ "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 +
+        dstDir = "~/packet_captures/"
+        for f in logFiles:
+            main.ONOSbench.handle.sendline( "scp sdn@" + ONOS1Ip + ":" +
+                                            logFolder + f + " " +
+                                            teststationUser + "@" +
+                                            teststationIP + ":" + dstDir +
                                             str( testname ) + "-ONOS1-" + f )
         # sleep so scp can finish
         time.sleep( 10 )
@@ -960,52 +963,52 @@
 
         # TODO: actually check something here
         utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
-                                 onpass="Test cleanup successful",
-                                 onfail="Test cleanup NOT successful" )
+                                onpass="Test cleanup successful",
+                                onfail="Test cleanup NOT successful" )
 
     def CASE14( self, main ):
         """
         start election app on all onos nodes
         """
-        leader_result = main.TRUE
+        leaderResult = main.TRUE
         # install app on onos 1
         main.log.info( "Install leadership election app" )
-        main.ONOScli1.feature_install( "onos-app-election" )
+        main.ONOScli1.featureInstall( "onos-app-election" )
         # wait for election
         # check for leader
-        leader = main.ONOScli1.election_test_leader()
+        leader = main.ONOScli1.electionTestLeader()
         # verify leader is ONOS1
-        if leader == ONOS1_ip:
+        if leader == ONOS1Ip:
             # all is well
             pass
         elif leader is None:
             # No leader elected
             main.log.report( "No leader was elected" )
-            leader_result = main.FALSE
+            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" +
+            main.log.report( "Something is wrong with electionTestLeader" +
                              " function, check the error logs" )
-            leader_result = main.FALSE
+            leaderResult = main.FALSE
         else:
             # error in  response
             main.log.report(
-                "Unexpected response from election_test_leader function:'" +
-                str(leader) +
+                "Unexpected response from electionTestLeader function:'" +
+                str( leader ) +
                 "'" )
-            leader_result = main.FALSE
+            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 ):
+        for controller in range( 2, numControllers + 1 ):
             # loop through ONOScli handlers
             node = getattr( main, ( 'ONOScli' + str( controller ) ) )
-            node.feature_install( "onos-app-election" )
-            leaderN = node.election_test_leader()
+            node.featureInstall( "onos-app-election" )
+            leaderN = node.electionTestLeader()
             # verify leader is ONOS1
-            if leaderN == ONOS1_ip:
+            if leaderN == ONOS1Ip:
                 # all is well
                 pass
             elif leaderN == main.FALSE:
@@ -1013,23 +1016,23 @@
                 # 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" +
+                                 "electionTestLeader function, check the" +
                                  " error logs" )
-                leader_result = main.FALSE
+                leaderResult = main.FALSE
             elif leader != leaderN:
-                leader_result = main.FALSE
+                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 leader_result:
+        if leaderResult:
             main.log.report( "Leadership election tests passed( consistent " +
                              "view of leader across listeners and a leader " +
-                             "was elected)" )
+                             "was elected )" )
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            actual=leaderResult,
             onpass="Leadership election passed",
             onfail="Something went wrong with Leadership election" )
 
@@ -1037,75 +1040,75 @@
         """
         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()
+        leader = main.ONOScli1.electionTestLeader()
         # TODO: do some sanity checking on leader before using it
-        withdraw_result = main.FALSE
-        if leader == ONOS1_ip:
-            old_leader = getattr( main, "ONOScli1" )
+        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) +
+                str( leader ) +
                 "'" )
-            leader_result = main.FALSE
-        withdraw_result = old_leader.election_test_withdraw()
+            leaderResult = main.FALSE
+        withdrawResult = oldLeader.electionTestWithdraw()
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=withdraw_result,
+            actual=withdrawResult,
             onpass="App was withdrawn from election",
             onfail="App was not withdrawn from election" )
 
         main.step( "Make sure new leader is elected" )
-        leader_list = []
-        leaderN = main.ONOScli1.election_test_leader()
+        leaderList = []
+        leaderN = main.ONOScli1.electionTestLeader()
         if leaderN == leader:
             main.log.report( "ONOS still sees " + str( leaderN ) +
                              " as leader after they withdrew" )
-            leader_result = main.FALSE
+            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 election_test_leader " +
+            main.log.report( "Something is wrong with electionTestLeader " +
                              "function, check the error logs" )
-            leader_result = main.FALSE
+            leaderResult = main.FALSE
         elif leaderN is 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)" )
+        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=leader_result,
+            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()
+            "Run for election on old leader( just so everyone is in the hat )" )
+        runResult = oldLeader.electionTestRun()
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=run_result,
+            actual=runResult,
             onpass="App re-ran for election",
             onfail="App failed to run for election" )
-        leader = main.ONOScli1.election_test_leader()
+        leader = main.ONOScli1.electionTestLeader()
         # verify leader is ONOS1
-        if leader == ONOS1_ip:
-            leader_result = main.TRUE
+        if leader == ONOS1Ip:
+            leaderResult = main.TRUE
         else:
-            leader_result = main.FALSE
+            leaderResult = main.FALSE
         # TODO: assert on  run and withdraw results?
 
         utilities.assert_equals(
             expect=main.TRUE,
-            actual=leader_result,
+            actual=leaderResult,
             onpass="Leadership election passed",
             onfail="ONOS1's election app was not leader after it re-ran " +
                    "for election" )
