diff --git a/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py b/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
index d9d0271..d91f09e 100644
--- a/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
+++ b/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
@@ -1,37 +1,39 @@
-'''
+"""
 The functions for intentRerouteLat
 
-'''
+"""
 import numpy
 import time
 import json
 
+
 def _init_( self ):
     self.default = ''
 
+
 def sanityCheck( main, linkNumExpected, flowNumExpected, intentNumExpected ):
-    '''
+    """
     Sanity check on numbers of links, flows and intents in ONOS
-    '''
+    """
     attemps = 0
     main.verify = main.FALSE
     linkNum = 0
     flowNum = 0
     intentNum = 0
     while attemps <= main.verifyAttempts:
-        time.sleep(main.verifySleep)
+        time.sleep( main.verifySleep )
         summary = json.loads( main.Cluster.active( 0 ).CLI.summary( timeout=main.timeout ) )
-        linkNum = summary.get("links")
-        flowNum = summary.get("flows")
-        intentNum = summary.get("intents")
+        linkNum = summary.get( "links" )
+        flowNum = summary.get( "flows" )
+        intentNum = summary.get( "intents" )
         if linkNum == linkNumExpected and flowNum == flowNumExpected and intentNum == intentNumExpected:
-            main.log.info("links: {}, flows: {}, intents: {}".format(linkNum, flowNum, intentNum))
+            main.log.info( "links: {}, flows: {}, intents: {}".format( linkNum, flowNum, intentNum ) )
             main.verify = main.TRUE
             break
         attemps += 1
     if not main.verify:
-        main.log.warn("Links or flows or intents number not as expected")
-        main.log.warn("links: {}, flows: {}, intents: {}".format(linkNum, flowNum, intentNum))
+        main.log.warn( "Links or flows or intents number not as expected" )
+        main.log.warn( "links: {}, flows: {}, intents: {}".format( linkNum, flowNum, intentNum ) )
         # bring back topology
         bringBackTopology( main )
         if main.validRun >= main.warmUp:
@@ -39,6 +41,7 @@
         else:
             main.validRun += 1
 
+
 def bringBackTopology( main ):
     main.log.info( "Bring back topology " )
     main.Cluster.active( 0 ).CLI.pushTestIntents( main.ingress,
@@ -46,20 +49,20 @@
                                                   main.batchSize,
                                                   offset=1,
                                                   options="-w",
-                                                  timeout=main.timeout)
+                                                  timeout=main.timeout )
     main.Cluster.active( 0 ).CLI.purgeWithdrawnIntents()
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "deviceCount",
-                                         value=0)
+                                         value=0 )
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "enabled",
-                                         value="false")
+                                         value="false" )
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "deviceCount",
-                                         value=main.deviceCount)
+                                         value=main.deviceCount )
     main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
                                          "enabled",
-                                         value="true")
+                                         value="true" )
     main.Cluster.active( 0 ).CLI.balanceMasters()
     time.sleep( main.setMasterSleep )
     if main.Cluster.numCtrls > 1:
@@ -69,10 +72,11 @@
                                                  main.Cluster.active( 0 ).ipAddress )
     time.sleep( main.setMasterSleep )
 
+
 def getLogNum( main, nodeId ):
-    '''
+    """
     Return the number of karaf log files
-    '''
+    """
     try:
         logNameList = main.ONOSbench.listLog( main.Cluster.active( nodeId ).ipAddress )
         assert logNameList is not None
@@ -81,13 +85,14 @@
             return 2
         return 1
     except AssertionError:
-        main.log.error("There is no karaf log")
+        main.log.error( "There is no karaf log" )
         return -1
 
+
 def getTopologyTimestamps( main ):
-    '''
+    """
     Get timestamps for the last topology events on all cluster nodes
-    '''
+    """
     timestamps = []
     for i in range( main.Cluster.numCtrls ):
         # Search for last topology event in karaf log
@@ -99,7 +104,7 @@
             main.log.error( "Error when trying to get topology event timestamp" )
             return main.ERROR
         try:
-            timestampField = lines[0].split( "creationTime=" )
+            timestampField = lines[ 0 ].split( "creationTime=" )
             timestamp = timestampField[ 1 ].split( "," )
             timestamp = int( timestamp[ 0 ] )
             timestamps.append( timestamp )
@@ -108,10 +113,11 @@
             return main.ERROR
     return timestamps
 
+
 def getIntentTimestamps( main ):
-    '''
+    """
     Get timestamps for all intent keys on all cluster nodes
-    '''
+    """
     timestamps = {}
     for i in range( main.Cluster.numCtrls ):
         # Search for intent INSTALLED event in karaf log
@@ -128,7 +134,7 @@
                 keyField = line.split( "key=" )
                 key = keyField[ 1 ].split( "," )
                 key = key[ 0 ]
-                if not key in timestamps.keys():
+                if key not in timestamps.keys():
                     timestamps[ key ] = []
                 # Get timestamp
                 timestampField = line.split( "time = " )
@@ -140,10 +146,11 @@
                 return main.ERROR
     return timestamps
 
+
 def calculateLatency( main, topologyTimestamps, intentTimestamps ):
-    '''
+    """
     Calculate reroute latency values using timestamps
-    '''
+    """
     topologyTimestamp = numpy.min( topologyTimestamps )
     firstInstalledLatency = {}
     lastInstalledLatency = {}
