diff --git a/TestON/drivers/common/cli/onosdriver.py b/TestON/drivers/common/cli/onosdriver.py
index 83a6471..d94c0e4 100644
--- a/TestON/drivers/common/cli/onosdriver.py
+++ b/TestON/drivers/common/cli/onosdriver.py
@@ -1779,7 +1779,7 @@
         configFile.close()        
         os.system( "scp " + tempFile + " admin@" + benchIp + ":" + nullDevicePath)
 
-    def createNullLinkProviderFile( self, benchIp, neighborIpList=0, eventRate=0, onNode=False): 
+    def createNullLinkProviderFile( self, benchIp, neighborIpList=0,fileName="", eventRate=0, onNode=False): 
         '''
                 neighbor list is an optional list of neighbors to be written directly to the file
                 onNode - bool, if true, alternate file path will be used to scp, inteneded
@@ -1799,9 +1799,12 @@
             configFile.write("#eventRate = \n")
         else: 
             configFile.write("eventRate = " + str(eventRate) + "\n") 
-
-        configFile.write("#cfgFile = /tmp/foo.cfg        #If enabled, points to the full path to the topology file.\n") 
         
+        if fileName == "":
+            configFile.write("#cfgFile = /tmp/foo.cfg        #If enabled, points to the full path to the topology file.\n") 
+        else: 
+            configFile.write("cfgFile =" + str(fileName) + "\n")
+
         if neighborIpList != 0:
             configFile.write("neighbors = ")
             for n in range (0, len(neighborIpList)):
diff --git a/TestON/tests/IntentEventTP/IntentEventTP.params b/TestON/tests/IntentEventTP/IntentEventTP.params
index d5dd65c..7f355dc 100644
--- a/TestON/tests/IntentEventTP/IntentEventTP.params
+++ b/TestON/tests/IntentEventTP/IntentEventTP.params
@@ -20,41 +20,41 @@
     <CTRL> 
         <USER>admin</USER>
 
-        <ip1>10.128.5.51</ip1>
+        <ip1>10.254.1.201</ip1>
         <port1>6633</port1>
 
-        <ip2>10.128.5.52</ip2>
+        <ip2>10.254.1.202</ip2>
         <port2>6633</port2>
 
-        <ip3>10.128.5.53</ip3>
+        <ip3>10.254.1.203</ip3>
         <port3>6633</port3>
 
-        <ip4>10.128.5.54</ip4>
+        <ip4>10.254.1.204</ip4>
         <port4>6633</port4>
 
-        <ip5>10.128.5.65</ip5>
+        <ip5>10.254.1.205</ip5>
         <port5>6633</port5>
 
-        <ip6>10.128.5.66</ip6>
+        <ip6>10.254.1.206</ip6>
         <port6>6633</port6>
 
-         <ip7>10.128.5.67</ip7>
+         <ip7>10.254.1.207</ip7>
         <port7>6633</port7> 
     </CTRL>
 
-    <MN><ip1>10.128.5.55</ip1></MN>
+    <MN><ip1>10.254.1.200</ip1></MN>
 
     <BENCH>
         <user>admin</user>
-        <ip1>10.128.5.55</ip1>
+        <ip1>10.254.1.200</ip1>
     </BENCH>
 
     <TEST> 
-        <loadFrom>1,0,0,0,0,0,0</loadFrom>                                     #generate load on server, 1 = generator on 
-        <numSwitches>35</numSwitches>
+        <loadFrom>1,1,1,1,1,1,1</loadFrom>                                     #generate load on server, 1 = generator on 
+        <numSwitches>10,10,10,10,10,10,10</numSwitches>
         <skipCleanInstall>yes</skipCleanInstall>
-        <duration>60</duration>
-        <log_interval>5</log_interval>                            
+        <duration>600</duration>
+        <log_interval>20</log_interval>                            
     </TEST>
 
     <METRICS>
diff --git a/TestON/tests/IntentEventTP/IntentEventTP.py b/TestON/tests/IntentEventTP/IntentEventTP.py
index b1f0e91..863599c 100644
--- a/TestON/tests/IntentEventTP/IntentEventTP.py
+++ b/TestON/tests/IntentEventTP/IntentEventTP.py
@@ -33,7 +33,7 @@
         maxNodes = int(main.params[ 'availableNodes' ])
         MNip = main.params[ 'MN' ][ 'ip1' ]
         skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
-        numSwitches = main.params[ 'TEST' ][ 'numSwitches' ]
+        numSwitches = (main.params[ 'TEST' ][ 'numSwitches' ]).split(",")
 
         homeDir = os.path.expanduser('~')
         
@@ -83,68 +83,26 @@
         if skipMvn != "yes":
             mvnResult = main.ONOSbench.cleanInstall()
  
-        #configure null device provider         
-        switchList = [0,int(numSwitches),0,0,0,0,0,0]
-        devicesString  = ""
-        for node in range(1, maxNodes + 1):
-            devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
-            if node < maxNodes:
-                devicesString += (",")
+        #null link
+        #null provider 
+        #linkgraph 
+        #intentPerf
 
-        main.log.info("Configuring device provider: ONOS 1 with " + (numSwitches) + " switches")
-        localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
-        filePath = homeDir + localPath
-        main.log.info(filePath)
+        myDistribution = []
+        for node in range (1, clusterCount + 1):
+            myDistribution.append(numSwitches[node-1])
 
-        configFile = open(filePath, 'w+')
-        configFile.write("devConfigs = " + devicesString + "\n")
-        configFile.write("#numPorts = 8") 
-        configFile.close()
-        main.log.info("DevConfig = " + devicesString) 
-        main.log.info("Device provider file written and closed")
+        main.ONOSbench.createLinkGraphFile( BENCHIp,cellIp,myDistribution)
+        main.ONOSbench.createNullDevProviderFile( BENCHIp, cellIp, myDistribution)
+        main.ONOSbench.createNullLinkProviderFile(BENCHIp)
 
-        ## configuring null link provider
-        main.log.info(" Configuring null provider to disable flicker" )
-        homeDir = os.path.expanduser('~')
-        main.log.info(homeDir)
-        localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
-        filePath = homeDir + localPath
-        main.log.info(filePath)
-
-        neighborsString = ""
-        for node in range(1, maxNodes + 1):
-            neighborsString += ONOSIp[node]
-            if node < maxNodes:
-                neighborsString += ","
-
-        configFile = open(filePath, 'w+')
-        configFile.write("#eventRate =\n")
-        configFile.write("#cfgFile = /tmp/foo.cfg        #If enabled, points to the full path to the topology file.\n")
-        configFile.write("#neighbors = ")
-        configFile.close()
-        main.log.info("Configuration completed")
+        main.log.step("Writing IntentPerf config file") 
+        intentPerfConfig = open( homeDir + "/onos/tools/package/etc/org.onosproject.intentperf.IntentPerfInstaller.cfg", "w+")
+        intentPerfConfig.write("numKeys = 40000\n")        
+        intentPerfConfig.write("cyclePeriod = 1000\n")
+        intentPerfConfig.write("numNeighors = 0\n")
+        intentPerfConfig.close()
         
-        main.log.info("Writing link graph configuration file..." )
-        homeDir = os.path.expanduser('~')
-        localPath = "/onos/tools/package/etc/linkGraph.cfg"
-        filePath = homeDir + localPath
-        linkGraph = open(filePath, 'w+')
-        linkGraph.write("# NullLinkProvider topology description (config file).\n")
-        linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
-        linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
-
-        myPort = 6
-        for node in range(1, clusterCount+1):
-            linkGraph.write("graph " + ONOSIp[node] + " {\n")
-            for switch in range (0, switchList[node]-1):
-                line = ""
-                line = ("\t" + str(switch) + ":" + str(myPort))
-                line += " -- "
-                line += (str(switch+1) + ":" + str(myPort-1) + "\n")
-                linkGraph.write(line) 
-            linkGraph.write("}")
-        linkGraph.close()        
-
         main.step( "Creating ONOS package" )
         packageResult = main.ONOSbench.onosPackage()  
 
@@ -170,7 +128,7 @@
             main.ONOSbench.handle.expect(":~")
             clusterCheck = ((main.ONOSbench.handle.before).splitlines())[3]
             print("\nBefore: " + str(clusterCheck))
-            if "SCC(s)=1," in clusterCheck and ("devices=" + str(numSwitches)) in clusterCheck:                  #check for links and devices too 
+            if "SCC(s)=1," in clusterCheck:     
                 break 
             if clusterCheck != lastOutput:
                 sameOutput = False 
@@ -205,7 +163,7 @@
         cellName = main.params[ 'ENV' ][ 'cellName' ]
         MNip = main.params[ 'MN' ][ 'ip1' ]
         BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
-        numSwitches = int(main.params[ 'TEST' ][ 'numSwitches' ])
+        numSwitches = (main.params[ 'TEST' ][ 'numSwitches' ]).split(",")
         scale = int( main.params[ 'SCALE' ] )
         maxNodes = int(main.params[ 'availableNodes' ])
         clusterCount += scale
@@ -234,53 +192,23 @@
         main.step( "Set Cell" )
         main.ONOSbench.setCell(cellName)
 
-        baselineSwitchCount = numSwitches/clusterCount
-        switchList = [0,0,0,0,0,0,0,0]
-        
-        for node in range(1, clusterCount + 1):
-            switchList[node] = baselineSwitchCount  
-            
-        for node in range(1, (numSwitches%clusterCount)+1):
-            switchList[node] += 1
-                      
-        devicesString  = ""
-        for node in range(1, maxNodes + 1):
-            devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
-            if node < maxNodes:
-                devicesString += (",")
+        myDistribution = []
+        for node in range (1, clusterCount + 1):
+            myDistribution.append(numSwitches[node-1])
 
-        main.log.info("Configuring device provider")
-        localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
-        filePath = homeDir + localPath
-        main.log.info(filePath)
+        main.ONOSbench.createLinkGraphFile( BENCHIp, cellIp, myDistribution)
+        main.ONOSbench.createNullDevProviderFile( BENCHIp, cellIp, myDistribution)
+        main.ONOSbench.createNullLinkProviderFile( BENCHIp )
 
-        configFile = open(filePath, 'w+')
-        configFile.write("devConfigs = " + devicesString +"\n")
-        configFile.write("# numPorts = 8")
-        configFile.close()
-        main.log.info("DevConfig = " + devicesString)
-        main.log.info("Device provider file written and closed")
+        #neighbors = max(1, clusterCount-1) 
+        neighbors = 0
 
-        main.log.info("Writing link graph configuration file..." )
-        homeDir = os.path.expanduser('~')
-        localPath = "/onos/tools/package/etc/linkGraph.cfg"
-        filePath = homeDir + localPath
-        linkGraph = open(filePath, 'w+')
-        linkGraph.write("# NullLinkProvider topology description (config file).\n")
-        linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
-        linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
-
-        myPort = 6
-        for node in range(1, clusterCount+1):
-            linkGraph.write("graph " + ONOSIp[node] + " {\n")
-            for switch in range (0, switchList[node]-1):
-                line = ""
-                line = ("\t" + str(switch) + ":" + str(myPort))
-                line += " -- "
-                line += (str(switch+1) + ":" + str(myPort-1) + "\n")
-                linkGraph.write(line)
-            linkGraph.write("}\n")
-        linkGraph.close()
+        main.log.step("Writing IntentPerf config file")
+        intentPerfConfig = open( homeDir + "/onos/tools/package/etc/org.onosproject.intentperf.IntentPerfInstaller.cfg", "w+")
+        intentPerfConfig.write("numKeys = 40000\n")
+        intentPerfConfig.write("cyclePeriod = 1000\n")
+        intentPerfConfig.write("numNeighors = " + str(neighbors) + "\n")
+        intentPerfConfig.close()
 
         main.step( "Creating ONOS package, preparing to reinstall" )
         packageResult = main.ONOSbench.onosPackage()   
@@ -306,7 +234,7 @@
             main.ONOSbench.handle.expect(":~")
             clusterCheck = ((main.ONOSbench.handle.before).splitlines())[3]
             print("\nBefore: " + str(clusterCheck))
-            if "SCC(s)=1," in clusterCheck and ("nodes=" + str(clusterCount)) in clusterCheck and ("devices=" + str(numSwitches)) in clusterCheck:  
+            if ("SCC(s)=1,") in clusterCheck:   
                 break
             if clusterCheck != lastOutput:
                 sameOutput = False
@@ -326,6 +254,7 @@
         import json
         import string 
         import csv
+        import numpy
 
         main.log.info("Cluster Count = " + str(clusterCount))
 
@@ -338,7 +267,7 @@
 
         metricList = [intentsRate, intentsWithdrawn, intentsFailed]
         
-        tempsleep =40
+        tempsleep =20
         main.log.info("sleeping " + str(tempsleep)) 
         time.sleep(tempsleep)
         
@@ -351,47 +280,59 @@
                 main.ONOSbench.handle.sendline(cmd)
                 main.ONOSbench.handle.expect(":~")
                 main.log.info("Load initiated on node " + str(node))
-       
+        
+            time.sleep(5)
+            actcmd = "onos $OC" + str(node) + " intent-perf-start"
+            main.ONOSbench.handle.sendline(actcmd)
+            main.ONOSbench.handle.expect(":~")
+            main.log.info("Starting ONOS " + str(node) + "  intent-perf...")
+
         main.log.info( "Starting test loop for " + str(testDuration) + " seconds...\n" )
         stop = time.time() + float( testDuration )
         
         while time.time() < stop:
             time.sleep( float( logInterval ) )
+            groupResult = []
             for node in range (1, clusterCount + 1):
-                myResults = ['0','0','0']
-                for metric in metricList: 
-
-                    onosEnv = "onos $OC" + str(node)  
-                    cmd = onosEnv + " " + metric
-                    main.log.info("COMMAND: " + cmd)
-                    main.ONOSbench.handle.sendline( cmd )
-                    time.sleep(10)
-                    main.ONOSbench.handle.expect(":~")                   
-                    rawResult = main.ONOSbench.handle.before
-                    rawResult = (rawResult.splitlines())
-
-                    tempResult = "--"
-                    for word in rawResult:
-                        if debug: print("word: " + word)
-                        if "m1" in str(word): 
-                            tempResult = word
-                            break
-
-                    if tempResult == "--": 
-                        main.log.error("WRONG pexepct.before data\n" + str(rawResult))
-                        main.log.info("retrying command... ")
-                        main.ONOSbench.handle.sendline(cmd)
-                        main.ONOSbench.handle.expect(":~")
-                        test = main.ONOSbench.handle.before
-                        print ("\n\n" + str(test))
-
-                    tempResult = round(float(tempResult.replace("m1=","")),1)
-                    tempResult = str(tempResult)                        # easy way to clean up number/prep to log
-                    resultIndex = metricList.index(metric)
-                    myResults[resultIndex] = tempResult
+                if loadFrom[node] == "0": continue
+                groupResult.append(0)               
                 
-                main.log.info("\tNode " + str(node))
-                main.log.info("Installed\tWithdrawn\tFailed")
-                main.log.info(myResults[0] + "\t\t " + myResults[1] + "\t\t" + myResults[2] + "\n")
-                
+                cmd = " onos-ssh $OC" + str(node) +  """ cat /opt/onos/log/karaf.log | grep "SNAPSHOT | Throughput" | tail -1  """ 
+                main.log.info("COMMAND: " + str(cmd))
+  
+                x = 0 
+                while True: 
+                    main.ONOSbench.handle.sendline(cmd)                   
+                    main.ONOSbench.handle.expect(":~")
+                    raw = main.ONOSbench.handle.before 
+                    if "OVERALL=" in raw: 
+                        break 
+                    x += 1
+                    if x > 10: 
+                        main.log.error("Expected output not being recieved... continuing")
+                        break
+                    time.sleep(2)
 
+                raw = raw.splitlines()
+                splitResults = []
+                for line in raw: 
+                    splitResults.extend(line.split(" "))
+
+                myResult = "--" 
+                for field in splitResults: 
+                    if "OVERALL" in field: 
+                        myResult = field 
+                
+                if myResult == "--": 
+                    main.log.error("Parsing/Pexpect error\n" + str(splitResults)) 
+
+                myResult = myResult.replace(";", "") 
+                myResult = myResult.replace("OVERALL=","")
+                myResult = float(myResult)  
+                groupResult[len(groupResult) -1] = myResult 
+
+                main.log.info("Node " + str(node) + " overall rate: " + str(myResult))
+
+            main.log.report("Results from this round of polling: " + str(groupResult)) 
+            main.log.report("Cluster Total: " + str(numpy.sum(groupResult)) + "\n")
+                
diff --git a/TestON/tests/IntentEventTP/IntentEventTP.topo b/TestON/tests/IntentEventTP/IntentEventTP.topo
index 30a1467..0e45e0f 100644
--- a/TestON/tests/IntentEventTP/IntentEventTP.topo
+++ b/TestON/tests/IntentEventTP/IntentEventTP.topo
@@ -3,7 +3,7 @@
     <COMPONENT>
 
         <ONOSbench>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosDriver</type>
@@ -12,7 +12,7 @@
         </ONOSbench>
 
         <ONOS1cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -21,7 +21,7 @@
         </ONOS1cli>
 
         <ONOS2cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -30,7 +30,7 @@
         </ONOS2cli>
 
         <ONOS3cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -39,7 +39,7 @@
         </ONOS3cli>
 
         <ONOS4cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -48,7 +48,7 @@
         </ONOS4cli>
 
         <ONOS5cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -57,7 +57,7 @@
         </ONOS5cli>
 
         <ONOS6cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -66,7 +66,7 @@
         </ONOS6cli>
 
         <ONOS7cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -75,7 +75,7 @@
         </ONOS7cli>
 
         <ONOS1>
-            <host>10.128.5.51</host>
+            <host>10.254.1.201</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -84,7 +84,7 @@
         </ONOS1>
 
         <ONOS2>
-            <host>10.128.5.52</host>
+            <host>10.254.1.202</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -93,7 +93,7 @@
         </ONOS2>
 
         <ONOS3>
-            <host>10.128.5.53</host>
+            <host>10.254.1.203</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -102,7 +102,7 @@
         </ONOS3>
 
         <ONOS4>
-            <host>10.128.5.54</host>
+            <host>10.254.1.204</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -112,7 +112,7 @@
 
     
         <ONOS5>
-            <host>10.128.5.65</host>
+            <host>10.254.1.205</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -121,7 +121,7 @@
         </ONOS5>
 
         <ONOS6>
-            <host>10.128.5.66</host>
+            <host>10.254.1.206</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -130,7 +130,7 @@
         </ONOS6>
 
         <ONOS7>
-            <host>10.128.5.67</host>
+            <host>10.254.1.207</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
diff --git a/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.params b/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.params
index 194a783..f01f017 100644
--- a/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.params
+++ b/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.params
@@ -1,5 +1,5 @@
 <PARAMS>
-    <testcases>1,2,3,4,2,3,4,2,3,4,2,3</testcases>
+    <testcases>1,2,4,2,4,2,4,2</testcases>
 
     <ENV>
         <cellName>intent_perf_test</cellName>
@@ -49,6 +49,7 @@
         <numMult>1</numMult>
         #Interface to bring down for intent reroute case
         <intfs>s3-eth2</intfs>
+        <cellStr>webconsole,onos-core,onos-api,onos-app-metrics,onos-app-gui,onos-cli,onos-openflow</cellStr>
     </TEST>
 
     <DB>
diff --git a/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.py b/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.py
index 8f23b29..32477a6 100644
--- a/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.py
+++ b/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.py
@@ -23,6 +23,7 @@
         gitPull = main.params['GIT']['autoPull']
         checkoutBranch = main.params['GIT']['checkout']
         intentFilePath = main.params['DB']['intentFilePath']
+        cellStr = main.params[ 'TEST' ][ 'cellStr' ]
         ONOSIp = []
         
         for i in range(1, 8):
@@ -39,7 +40,8 @@
         main.step('Starting mininet topology')
         main.Mininet1.startNet()
         main.step('Creating cell file')
-        cellFileResult = main.TRUE
+        cellFileResult = main.ONOSbench.createCellFile(
+                BENCHIp, cellName, MN1Ip, cellStr, ONOSIp[0])
         main.step('Applying cell file to environment')
         cellApplyResult = main.ONOSbench.setCell(cellName)
         verifyCellResult = main.ONOSbench.verifyCell()
@@ -151,7 +153,6 @@
 
         time.sleep(20)
         
-        batchResultList = []
         deviceIdList = []
         batchInstallLat = []
         batchWithdrawLat = []
@@ -165,6 +166,9 @@
         for device in jsonObj:
             deviceIdList.append(device['id'])
 
+        if not jsonObj:
+            main.log.warn( "Devices not found, check topology" )
+            
         sleepTime = 10
         baseDir = '/tmp/'
         for batch in range(0, 5):
@@ -283,6 +287,7 @@
                 stdWithdrawLat = 'NA'
                 main.log.report('Batch withdraw failed')
                 assertion = main.FALSE
+            
             main.log.report('Avg of batch installation latency ' +
                     'of size ' + str(batchIntentSize) + ': ' +
                     str(avgInstallLat) + ' ms')
@@ -293,6 +298,7 @@
                     str(avgWithdrawLat) + ' ms')
             main.log.report('Std Deviation of batch withdraw latency ' +
                     ': ' + str(round(numpy.std(maxWithdrawLat), 2)) + ' ms')
+            
             main.log.report('Avg of batch withdraw latency ' + 'of size ' +
                     str(batchIntentSize) + ': ' + str(avgWithdrawLat) + ' ms')
             main.log.report('Std Deviation of batch withdraw latency ' +
@@ -302,6 +308,7 @@
                     str(avgSingleWithdrawLat) + ' ms')
             main.log.report('Std Deviation of single withdraw latency ' +
                     ': ' + str(stdSingleWithdrawLat) + ' ms')
+            
             dbCmd = "INSERT INTO intents_latency_tests VALUES('" +\
                     timeToPost + "','intents_latency_results'," +\
                     runNum + ',' + str(clusterCount) + ',' +\
@@ -680,27 +687,28 @@
         import time
         import json
         
-        cellName = main.params[ 'ENV' ][ 'cellName' ]
-        features = main.params[ 'ENV' ][ 'cellFeatures' ]
-        benchIp = main.params[ 'BENCH' ][ 'ip' ]
-        mininetIp = main.params[ 'TEST' ][ 'MN' ]
-        
         clusterCount += 2
+        
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        features = main.params[ 'TEST' ][ 'cellStr' ]
+        benchIp = main.params[ 'BENCH' ][ 'ip' ]
+        mininetIp = main.params[ 'MN' ][ 'ip1' ]
+        
         main.log.report('Increasing cluster size to ' + str(clusterCount))
         
         ONOSIp = []
         for i in range( 1, 8 ):
-            ONOSIp.append( main.params[ 'CTRL' ][ 'ip'+str(i) ]
+            ONOSIp.append( main.params[ 'CTRL' ][ 'ip'+str(i) ] )
 
         main.step( "Cleaning environment" )
-        for i in range( 1, 8 ):
+        for i in range( 0, 7 ):
             main.ONOSbench.onosDie( ONOSIp[i] )
-            main.log.info( "Uninstalling ONOS "+str(i) )
+            main.log.info( "Uninstalling ONOS "+str(i+1) )
             main.ONOSbench.onosUninstall( ONOSIp[i] )
 
         main.step( "Creating new cell file" )
         cellIp = []
-        for node in range( 1, clusterCount + 1 )
+        for node in range( 1, clusterCount + 1 ):
             cellIp.append( ONOSIp[node] )
         main.ONOSbench.createCellFile( benchIp, cellName,
                                        mininetIp, str(features), *cellIp )
@@ -712,12 +720,9 @@
         main.ONOSbench.onosPackage()
 
         for node in range( 1, clusterCount + 1 ):
-            time.sleep(10)
-            main.log.info( "Starting ONOS "+str(node) +
-                            " at IP: "+ONOSIp[node] )
-            main.ONOSbench.onosInstall( ONOSIp[node] )
-            exec "a = main.ONOS%scli.startOnosCli" %str(node)
-            a( ONOSIp[node] )
+            main.ONOSbench.onosInstall( node = ONOSIp[node] )
+            
+        time.sleep( 20 )
 
         for node in range( 1, clusterCount + 1 ):
             for i in range( 2 ):
@@ -729,6 +734,12 @@
                 if not isup:
                     main.log.info( "ONOS" + str(node) + " did not start")
         
+        for node in range( 1, clusterCount + 1 ):
+            exec "a = main.ONOS%scli.startOnosCli" %str(node)
+            a( ONOSIp[node] )
+
+        time.sleep(30)
+
         utilities.assert_equals(expect=main.TRUE, actual=assertion,
             onpass='Scale out to ' + str(clusterCount) + ' nodes successful',
             onfail='Scale out to ' + str(clusterCount) + ' nodes failed')
diff --git a/TestON/tests/IntentReroute/IntentReroute.params b/TestON/tests/IntentReroute/IntentReroute.params
new file mode 100644
index 0000000..4139613
--- /dev/null
+++ b/TestON/tests/IntentReroute/IntentReroute.params
@@ -0,0 +1,78 @@
+<PARAMS>
+
+    <testcases>1,3,2,3,2,3,2,3</testcases>
+
+    <SCALE>2</SCALE>
+    <availableNodes>7</availableNodes>
+ 
+    <ENV>
+        <cellName>intentRerouteCell</cellName>
+        <cellFeatures>webconsole,onos-core,onos-api,onos-cli,onos-null,onos-gui,onos-rest,onos-app-metrics,onos-app-metrics-intent,onos-app-metrics-topology </cellFeatures>
+        <scale1switches>8,</scale1switches>
+        <scale3switches>2,3,3</scale3switches>
+        <scale5switches>2,3,1,1,1</scale5switches>
+        <scale7switches>1,1,2,1,1,1,1</scale7switches>
+    
+    </ENV>
+
+    <TEST>
+        <skipCleanInstall>yes</skipCleanInstall>
+        <warmUp>4</warmUp>
+        <sampleSize>20</sampleSize>                     
+        <wait></wait>
+        <intents>1,100,1000,5000</intents>                       #list format, will be split on ','
+        <debug>True</debug>                          
+    </TEST>
+
+    <METRICS>
+        <Submitted>0</Submitted>
+        <Installed>1</Installed>
+        <Failed>0</Failed>
+        <Withdraw>0</Withdraw>
+        <Withdrawn>0</Withdrawn>
+    </METRICS>
+
+    <GIT>
+        <autopull>on</autopull>
+        <checkout>master</checkout>
+    </GIT>
+
+    <CTRL>
+        <USER>admin</USER>
+        
+        <ip1>10.254.1.201</ip1>
+        <port1>6633</port1>
+        
+        <ip2>10.254.1.202</ip2>
+        <port2>6633</port2>
+        
+        <ip3>10.254.1.203</ip3>
+        <port3>6633</port3>
+        
+        <ip4>10.254.1.204</ip4>
+        <port4>6633</port4>
+        
+        <ip5>10.254.1.205</ip5>
+        <port5>6633</port5>
+        
+        <ip6>10.254.1.206</ip6>
+        <port6>6633</port6> 
+       
+        <ip7>10.254.1.207</ip7>
+        <port7>6633</port7>
+
+    </CTRL>
+
+    <MN>
+        <ip1>10.254.1.200</ip1>
+    </MN>
+
+    <BENCH>
+        <user>admin</user>
+        <ip1>10.254.1.200</ip1>
+    </BENCH>
+
+    <JSON>
+    </JSON>
+
+</PARAMS>
diff --git a/TestON/tests/IntentReroute/IntentReroute.py b/TestON/tests/IntentReroute/IntentReroute.py
new file mode 100644
index 0000000..4a778f8
--- /dev/null
+++ b/TestON/tests/IntentReroute/IntentReroute.py
@@ -0,0 +1,468 @@
+# ScaleOutTemplate - IntentReroute 
+#
+# CASE1 starts number of nodes specified in param file
+#
+# cameron@onlab.us
+
+import sys
+import os.path
+
+
+class IntentReroute:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):            #This is the initialization case
+                                        #this case will clean up all nodes 
+        import time                     #but only node 1 is started in this case
+        import os.path
+
+        global clusterCount             #number of nodes running
+        global ONOSIp                   #list of ONOS IP addresses 
+        clusterCount = 1
+        ONOSIp = [ 0 ]
+
+
+        #Load values from params file
+        checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
+        gitPull = main.params[ 'GIT' ][ 'autopull' ]
+        cellName = main.params[ 'ENV' ][ 'cellName' ]
+        Features= main.params[ 'ENV' ][ 'cellFeatures' ]
+        BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
+        BENCHUser = main.params[ 'BENCH' ][ 'user' ]
+        MN1Ip = main.params[ 'MN' ][ 'ip1' ]
+        maxNodes = int(main.params[ 'availableNodes' ])
+        Features = main.params[ 'ENV' ][ 'cellFeatures' ]
+        skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
+        switchCount = (main.params[ 'ENV' ][ 'scale1switches' ]).split(",")
+        homeDir = os.path.expanduser('~')
+
+        #Populate ONOSIp with ips from params 
+        for i in range(1, maxNodes + 1): 
+            ipString = 'ip' + str(i) 
+            ONOSIp.append(main.params[ 'CTRL' ][ ipString ])   
+    
+        tempIp = []
+        for node in range( 1, clusterCount + 1):
+            tempIp.append(ONOSIp[node])
+
+        #kill off all onos processes 
+        main.log.step("Safety check, killing all ONOS processes")
+        main.log.step("before initiating enviornment setup")
+        for node in range(1, maxNodes + 1):
+            main.ONOSbench.onosDie(ONOSIp[node])
+
+        #construct the cell file
+        main.log.info("Creating cell file")
+        exec "a = main.ONOSbench.createCellFile"
+        cellIp = []
+        for node in range (1, clusterCount + 1):
+            cellIp.append(ONOSIp[node])
+        a(BENCHIp,cellName,MN1Ip,str(Features), *cellIp)
+
+        main.step( "Applying cell file to environment" )
+        cellApplyResult = main.ONOSbench.setCell( cellName )
+
+        #Uninstall everywhere
+        main.log.step( "Cleaning Enviornment..." )
+        for i in range(1, maxNodes + 1):
+            main.log.info(" Uninstalling ONOS " + str(i) )
+            main.ONOSbench.onosUninstall( ONOSIp[i] )
+        
+        #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
+        if skipMvn != "yes":
+            mvnResult = main.ONOSbench.cleanInstall()
+                        
+            #git
+            main.step( "Git checkout and pull " + checkoutBranch )
+            if gitPull == 'on':
+                checkoutResult = main.ONOSbench.gitCheckout( checkoutBranch )
+                pullResult = main.ONOSbench.gitPull()
+
+            else:
+                checkoutResult = main.TRUE
+                pullResult = main.TRUE
+                main.log.info( "Skipped git checkout and pull" )
+        
+        main.ONOSbench.handle.sendline("cp ~/ONLabTest/TestON/dependencies/IntentRerouteTest/oneNode7linear.cfg ~/onos/tools/package/etc/")
+        main.ONOSbench.handle.expect(":~")
+        main.ONOSbench.handle.sendline("cp ~/ONLabTest/TestON/dependencies/IntentRerouteTest/oneNode7linearCut.cfg ~/onos/tools/package/etc/")
+        main.ONOSbench.handle.expect(":~")
+
+        main.ONOSbench.createNullDevProviderFile(BENCHIp, tempIp, switchCount)
+        main.ONOSbench.createNullLinkProviderFile(BENCHIp, fileName=("/opt/onos/apache-karaf-3.0.2/etc/oneNode7linear.cfg"))
+ 
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()  
+
+        main.step( "Installing ONOS package" )
+        install1Result = main.ONOSbench.onosInstall( node=ONOSIp[1] )
+
+        main.step( "verify cells" )
+        verifyCellResult = main.ONOSbench.verifyCell()
+
+        main.step( "Set cell for ONOS cli env" )
+        cli1 = main.ONOS1cli.startOnosCli( ONOSIp[1] )
+
+        
+    def CASE2( self, main ):
+        # This case increases the cluster size by whatever scale is
+        # Note: 'scale' is the size of the step
+        # if scaling is not a part of your test, simply run this case
+        # once after CASE1 to set up your enviornment for your desired 
+        # cluster size. If scaling is a part of you test call this case each time 
+        # you want to increase cluster size
+
+        ''                                                         
+        'Increase number of nodes and initiate CLI'
+        ''
+        import time
+        global clusterCount
+        
+        BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
+        scale = int( main.params[ 'SCALE' ] )
+        clusterCount += scale
+        homeDir = os.path.expanduser('~')
+        switchParams = ("scale" + str(clusterCount) + "switches")
+        switchCount = (main.params[ 'ENV' ][ switchParams ]).split(",") 
+
+        if clusterCount == 1: 
+            temp = "one"
+        if clusterCount == 3: 
+            temp = "three"
+        if clusterCount == 5: 
+            temp = "five"
+        if clusterCount == 7: 
+            temp = "seven"
+
+        lgfile = temp + "Node7linear.cfg"
+        main.ONOSbench.handle.sendline("cp ~/ONLabTest/TestON/dependencies/IntentRerouteTest/" + lgfile + " ~/onos/tools/package/etc/")
+        main.ONOSbench.handle.expect(":~")
+        main.ONOSbench.handle.sendline("cp ~/ONLabTest/TestON/dependencies/IntentRerouteTest/" + temp + "Node7linearCut.cfg" + " ~/onos/tools/package/etc/")
+        main.ONOSbench.handle.expect(":~")
+        
+        main.log.info("Creating cell file")
+        exec "a = main.ONOSbench.createCellFile"
+        cellIp = []
+        for node in range (1, clusterCount + 1):
+            cellIp.append(ONOSIp[node])
+        a(BENCHIp,cellName,MN1Ip,str(Features), *cellIp) 
+    
+        main.step( "Applying cell file to environment" )
+        cellApplyResult = main.ONOSbench.setCell( cellName )
+
+        #Uninstall everywhere
+        main.log.step( "Cleaning Enviornment..." )
+        for node in range(1, maxNodes + 1):
+            main.ONOSbench.onosDie(ONOSIp[node])
+            main.log.info(" Uninstalling ONOS " + str(node) )
+            main.ONOSbench.onosUninstall( ONOSIp[node] )
+
+        tempIp = []
+        for node in range( 1, clusterCount + 1): 
+            tempIp.append(ONOSIp[node]) 
+
+        main.ONOSbench.createNullDevProviderFile(BENCHIp, tempIp, switchCount)
+        main.ONOSbench.createNullLinkProviderFile(BENCHIp, fileName=("/opt/onos/apache-karaf-3.0.2/etc/" + lgfile))
+
+        main.ONOSbench.onosPackage()
+        
+        
+        main.log.report( "Increasing cluster size to " + str( clusterCount ) )
+        for node in range(1, clusterCount + 1):
+            main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])    
+            main.ONOSbench.onosInstall( node=ONOSIp[node])
+            if node == 1: 
+                main.ONOS1cli.startOnosCli( ONOSIp[1] )
+        
+        for node in range(1, clusterCount + 1): 
+            for i in range( 2 ):
+                isup = main.ONOSbench.isup( ONOSIp[node] )
+                if isup:
+                    main.log.info("ONOS " + str(node) + " is up\n")
+                    break
+            if not isup:
+                main.log.report( "ONOS " + str(node) + " didn't start!" ) 
+    
+    def CASE3( self, main ): 
+
+        import time 
+        import numpy 
+        import datetime
+        #from scipy import stats
+
+        ts = time.time()
+        date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
+
+        sampleSize = int(main.params[ 'TEST' ][ 'sampleSize' ]) 
+        warmUp = int(main.params[ 'TEST' ][ 'warmUp' ])
+        intentsList = (main.params[ 'TEST' ][ 'intents' ]).split(",")
+        debug = main.params[ 'TEST' ][ 'debug' ]
+        for i in range(0,len(intentsList)):
+            intentsList[i] = int(intentsList[i]) 
+        
+        timestampMetrics = []
+        if main.params['METRICS']['Submitted'] == "1":
+            timestampMetrics.append("Submitted")
+        if main.params['METRICS']['Installed'] == "1": 
+            timestampMetrics.append("Installed")
+        if main.params['METRICS']['Failed'] == "1":
+            timestampMetrics.append("Failed")    
+        if main.params['METRICS']['Withdraw'] == "1":
+            timestampMetrics.append("Withdraw")
+        if main.params['METRICS']['Withdrawn'] == "1":
+            timestampMetrics.append("Withdrawn")
+        if debug: main.log.info(timestampMetrics) 
+    
+        if debug == "True": 
+            debug = True
+        else: 
+            debug = False
+
+        if clusterCount == 1:
+            temp = "one"
+        if clusterCount == 3:
+            temp = "three"
+        if clusterCount == 5:
+            temp = "five"
+        if clusterCount == 7:
+            temp = "seven"
+
+        lgfile = temp + "Node7linear.cfg"
+        lgfileCut = temp + "Node7linearCut.cfg"
+        linkCount = 0
+
+        for i in range(0,15):
+            main.ONOSbench.handle.sendline("onos $OC1 links|wc -l")
+            main.ONOSbench.handle.expect(":~")
+            linkCount = main.ONOSbench.handle.before
+            if debug: main.log.info("Link Count check: " + linkCount)
+            if str(16) in linkCount:
+                break
+            time.sleep(3)
+            main.log.info("waiting for links")
+
+        links = "--"
+        while "=null:" not in links:
+            if debug: main.log.info("top of loop")
+            main.ONOSbench.handle.sendline("onos $OC1 links")
+            main.ONOSbench.handle.expect(":~")
+            links = main.ONOSbench.handle.before
+            if debug: main.log.info(str(links))
+            time.sleep(1)
+        links = links.splitlines()
+        templinks = links
+
+        tempDevices = []
+        for line in links:
+            temp = line.split(" ")
+            temp[0].replace("src=","")
+            temp[0] = (temp[0].split("/"))[0]
+            tempDevices.append(temp[0])
+
+        tempDevices.sort()
+        devices = []
+        for i in tempDevices:
+            if "src=null" in i:
+                devices.append(i.replace("src=", ""))
+        if debug: main.log.info(str(devices))
+
+        ingress = devices[0]
+        egress = devices.pop()
+        if debug: main.log.info("ingress: " + ingress)
+        if debug: main.log.info("egress: " + egress)
+
+
+        for intents in intentsList:
+            main.log.report("Intent Batch size: " + str(intents) + "\n      ") 
+            myResult = [["latency", "lastNode"] for x in range(sampleSize)]
+            
+            for run in range(0, (warmUp + sampleSize)):
+                if run > warmUp: 
+                    main.log.info("Starting test iteration " + str(run-warmUp)) 
+
+                cmd = """onos $OC1 "push-test-intents -i """
+                cmd += ingress + "/0 "
+                cmd += egress + "/0 "
+                cmd += str(intents) +""" 1" """
+                if debug: main.log.info(cmd)
+
+                withdrawCmd = cmd.replace("intents -i", "intents -w ")
+                 
+                #push-test-intents 
+                main.ONOSbench.handle.sendline(cmd)
+                main.ONOSbench.handle.expect(":~")
+                myRawResult = main.ONOSbench.handle.before
+              
+                for i in range(0, 40):
+                    main.ONOSbench.handle.sendline("onos $OC1 summary")
+                    main.ONOSbench.handle.expect(":~")
+                    linkCheck = main.ONOSbench.handle.before
+                    if ("flows=" + str(8*intents) + ",") in linkCheck:
+                        break
+                    if i == 39:
+                        main.log.error("Flow count incorrect, data invalid.")
+
+                #cut link
+                nodesLinksCut = []
+                if clusterCount == 1: 
+                    nodesLinksCut.append(1)
+                if clusterCount == 3 or clusterCount == 5:
+                    nodesLinksCut.append(2)
+                if clusterCount == 7:
+                    nodesLinksCut.append(3)
+                    nodesLinksCut.append(4)
+
+                for node in nodesLinksCut:
+                    exec "a = main.ONOS%s.createNullLinkProviderFile" %str(node)
+                    a(ONOSIp[node], fileName=("/opt/onos/apache-karaf-3.0.2/etc/" + lgfileCut), onNode=True)
+
+                #collect timestamp from link cut 
+                cmd = "onos-ssh $OC" + str(nodesLinksCut[len(nodesLinksCut)-1]) + " cat /opt/onos/log/karaf.log | grep " + lgfileCut + "| tail -1" 
+                if debug: main.log.info("COMMAND: " + str(cmd))
+                
+                for i in range(0,10):
+                    main.ONOSbench.handle.sendline(cmd)
+                    main.ONOSbench.handle.expect(":~")
+                    raw = main.ONOSbench.handle.before
+                    if "NullLinkProvider" in raw:
+                        break
+                    if i >= 9:
+                        main.log.error("Expected output not being recieved... continuing")
+                        main.log.info(raw)
+                        break
+                    time.sleep(2) 
+
+                temp = raw.splitlines()
+                for line in temp: 
+                    if str(date) in line: 
+                        temp = line 
+                        break
+
+                cutTimestamp = (temp.split(" "))[0] + " " + (temp.split(" "))[1]
+
+                #validate link count and flow count
+                for i in range(0, 40):
+                    main.ONOSbench.handle.sendline("onos $OC1 summary")
+                    main.ONOSbench.handle.expect(":~")
+                    linkCheck = main.ONOSbench.handle.before
+                    if "links=14," in linkCheck and ("flows=" + str(7*intents) + ",") in linkCheck:
+                        break
+                    if i == 39:
+                        main.log.error("Link or flow count incorrect, data invalid.")
+
+                #intents events metrics installed timestamp 
+                IEMtimestamps = [0]*(clusterCount + 1)
+                installedTemp = [0]*(clusterCount + 1)
+                for node in range(1, clusterCount +1):      
+                    cmd = "onos $OC" + str(node) + " intents-events-metrics|grep Timestamp"
+                    raw = ""
+                    while "Timestamp" not in raw:
+                        main.ONOSbench.handle.sendline(cmd)
+                        main.ONOSbench.handle.expect(":~")
+                        raw = main.ONOSbench.handle.before 
+
+                    intentsTimestamps = {}
+                    rawTimestamps = raw.splitlines()
+                    for line in rawTimestamps: 
+                        if "Timestamp" in line and "grep" not in line: 
+                            metricKey = (line.split(" "))[1]
+                            metricTimestamp = (line.split(" ")[len(line.split(" ")) -1]).replace("epoch)=","")
+                            metricTimestamp = float(metricTimestamp)
+                            metricTimestamp = numpy.divide(metricTimestamp, 1000)
+                            if debug: main.log.info(repr(metricTimestamp))
+                            intentsTimestamps[metricKey] = metricTimestamp
+                            if metricKey == "Installed":
+                                installedTemp[node] = metricTimestamp 
+
+                    main.log.info("Node: " + str(node) + " Timestamps: " + str(intentsTimestamps))
+                    IEMtimestamps[node] = intentsTimestamps
+              
+                myMax = max(installedTemp)
+                indexOfMax = installedTemp.index(myMax)
+
+                #number crunch
+                for metric in timestampMetrics:     #this is where we sould add support for computing other timestamp metrics
+                    if metric == "Installed":
+                        if run >= warmUp: 
+                            main.log.report("link cut timestamp: " + cutTimestamp)
+                            #readableInstalledTimestamp = str(intentsTimestamps["Installed"])
+                            readableInstalledTimestamp = str(myMax)
+
+                            #main.log.report("Intent Installed timestamp: " + str(intentsTimestamps["Installed"]))          
+                            main.log.report("Intent Installed timestamp: " + str(myMax))
+
+                            cutEpoch = time.mktime(time.strptime(cutTimestamp, "%Y-%m-%d %H:%M:%S,%f"))
+                            if debug: main.log.info("cutEpoch=" + str(cutEpoch))
+                            #rerouteLatency = float(intentsTimestamps["Installed"] - cutEpoch)
+                            rerouteLatency = float(myMax - cutEpoch)
+
+                            rerouteLatency = numpy.divide(rerouteLatency, 1000)
+                            main.log.report("Reroute latency:" + str(rerouteLatency) + " (seconds)\n    ") 
+                            myResult[run-warmUp][0] = rerouteLatency
+                            myResult[run-warmUp][1] = indexOfMax
+                            if debug: main.log.info("Latency: " + str(myResult[run-warmUp][0])) 
+                            if debug: main.log.info("last node: " + str(myResult[run-warmUp][1]))  
+
+                #time.sleep(12)
+
+                #reset
+                for node in nodesLinksCut:
+                    exec "a = main.ONOS%s.createNullLinkProviderFile" %str(node)
+                    a(ONOSIp[node], fileName=("/opt/onos/apache-karaf-3.0.2/etc/" + lgfile), onNode=True)
+
+                #wait for intent withdraw
+                if debug: main.log.info(withdrawCmd)
+                main.ONOSbench.handle.sendline(withdrawCmd)
+                main.ONOSbench.handle.expect(":~")
+                main.ONOSbench.handle.sendline("onos $OC1 intents|grep WITHDRAWN|wc -l")
+                main.ONOSbench.handle.expect(":~")
+                intentWithdrawCheck = main.ONOSbench.handle.before
+                if (str(intents)) in intentWithdrawCheck: 
+                    main.log.info("intents withdrawn")
+                if debug: main.log.info(intentWithdrawCheck)
+                
+                # wait for links to be reestablished  
+                for i in range(0, 10): 
+                    main.ONOSbench.handle.sendline("onos $OC1 summary")
+                    main.ONOSbench.handle.expect(":~") 
+                    linkCheck = main.ONOSbench.handle.before
+                    if "links=16," in linkCheck:
+                        break
+                    time.sleep(1)
+                    if i == 9: 
+                        main.log.info("Links Failed to reconnect, next iteration of data invalid.") 
+
+                if run < warmUp: 
+                    main.log.info("Warm up run " + str(run+1) + " completed") 
+            
+            if debug: main.log.info(myResult)
+            latTemp = []
+            nodeTemp = []
+            for i in myResult: 
+                latTemp.append(i[0])
+                nodeTemp.append(i[1])
+
+            mode = {}
+            for i in nodeTemp: 
+                if i in mode: 
+                    mode[i] += 1
+                else: 
+                    mode[i] = 1
+
+            for i in mode.keys():
+                if mode[i] == max(mode.values()):
+                    nodeMode = i 
+            
+            average = numpy.average(latTemp)
+            stdDev = numpy.std(latTemp) 
+
+            main.log.report("Scale: " + str(clusterCount) + "  \tIntent batch: " + str(intents))
+            main.log.report("Latency average:................" + str(average)) 
+            main.log.report("Latency standard deviation:....." + str(stdDev))
+            main.log.report("Mode of last node to respond:..." + str(nodeMode))
+            main.log.report("________________________________________________________")
+
+
+             
diff --git a/TestON/tests/IntentReroute/IntentReroute.topo b/TestON/tests/IntentReroute/IntentReroute.topo
new file mode 100644
index 0000000..0e45e0f
--- /dev/null
+++ b/TestON/tests/IntentReroute/IntentReroute.topo
@@ -0,0 +1,146 @@
+<TOPOLOGY>
+
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>10.254.1.200</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS><home>~/onos</home></COMPONENTS>
+        </ONOSbench>
+
+        <ONOS1cli>
+            <host>10.254.1.200</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1cli>
+
+        <ONOS2cli>
+            <host>10.254.1.200</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS2cli>
+
+        <ONOS3cli>
+            <host>10.254.1.200</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS3cli>
+
+        <ONOS4cli>
+            <host>10.254.1.200</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS4cli>
+
+        <ONOS5cli>
+            <host>10.254.1.200</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS5cli>
+
+        <ONOS6cli>
+            <host>10.254.1.200</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>7</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS6cli>
+
+        <ONOS7cli>
+            <host>10.254.1.200</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>8</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS7cli>
+
+        <ONOS1>
+            <host>10.254.1.201</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>9</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOS2>
+            <host>10.254.1.202</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>10</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS2>
+
+        <ONOS3>
+            <host>10.254.1.203</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>11</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS3>
+
+        <ONOS4>
+            <host>10.254.1.204</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>12</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS4>
+
+    
+        <ONOS5>
+            <host>10.254.1.205</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>13</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS5>
+
+        <ONOS6>
+            <host>10.254.1.206</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>14</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS6>
+
+        <ONOS7>
+            <host>10.254.1.207</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>15</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS7>
+
+    </COMPONENT>
+
+</TOPOLOGY>
+
+
+    
diff --git a/TestON/tests/IntentReroute/__init__.py b/TestON/tests/IntentReroute/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/IntentReroute/__init__.py
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.params b/TestON/tests/LinkEventTP/LinkEventTP.params
index b4d50e5..7a47a51 100644
--- a/TestON/tests/LinkEventTP/LinkEventTP.params
+++ b/TestON/tests/LinkEventTP/LinkEventTP.params
@@ -1,10 +1,14 @@
 <PARAMS>
-    <testcases>1,3,2,3,2,3,2,3</testcases>
+    <testcases>1,2,3</testcases>
+    
     <ENV>
-    <cellName>network_tp_test</cellName>
-    <cellFeatures>"webconsole,onos-core,onos-api,onos-cli,onos-null,onos-rest,onos-app-metrics,onos-app-metrics-intent,onos-app-metrics-topology"</cellFeatures>
+        <cellName>network_tp_test</cellName>
+        <cellFeatures>"webconsole,onos-core,onos-api,onos-cli,onos-null,onos-rest,onos-app-metrics,onos-app-metrics-intent,onos-app-metrics-topology"</cellFeatures>
+        <onBaremetal>true</onBaremetal>   "true"
     </ENV>
-    <SCALE>2</SCALE>
+        
+    <SCALE>6</SCALE>
+    
     <availableNodes>7</availableNodes>
 
     <GIT>
@@ -26,7 +30,7 @@
         <port5>6633</port5>
 	<ip6>10.254.1.206</ip6>
         <port6>6633</port6>
-	<ip7>10.254.1.207</ip7>
+        <ip7>10.254.1.207</ip7>
         <port7>6633</port7>
     </CTRL>
 
@@ -38,21 +42,21 @@
     <TEST>          #   duration =      time the test loop runs
                     #   log_interval =  how often the data is reported 
                     #   wait =          time between tests, used to let the averages run down 
-               
-        <flickerRates>1000,0,0,0,0,0,0</flickerRates>
-        <devicesPerNode>20,0,0,0,0,0,0</devicesPerNode>
+        <configFile>/onos/tools/package/etc/org.onosproject.net.topology.impl.DefaultTopologyProvider.cfg</configFile>       
+        <flickerRates>20000,20000,20000,20000,20000,20000,20000</flickerRates>
+        <devicesPerNode>40,40,40,40,40,40,40</devicesPerNode>
         <flickerRate>1000</flickerRate>
         <linkgraphdif>.03</linkgraphdif>          # 0-1 indicated link/graph rate dif tolerance
-        <duration>120</duration>
+        <duration>1800</duration>
         <log_interval>15</log_interval>
         <wait>60</wait>
         <skipCleanInstall>yes</skipCleanInstall>
         <MN>localhost</MN>
-	    <logFile>link_event_tp_results_LOG</logFile>
+        <logFile>link_event_tp_results_LOG</logFile>
     </TEST>
 
     <JSON>
         <intents_rate>intentInstalledRate</intents_rate>
-    </JSON>
+    </JSON> 
 
 </PARAMS>
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.py b/TestON/tests/LinkEventTP/LinkEventTP.py
index e7d2133..a4bc0aa 100644
--- a/TestON/tests/LinkEventTP/LinkEventTP.py
+++ b/TestON/tests/LinkEventTP/LinkEventTP.py
@@ -36,9 +36,12 @@
         flickerRate = main.params[ 'TEST' ][ 'flickerRate']
         deviceDistribution = (main.params[ 'TEST' ][ 'devicesPerNode']).split(",")    
         MNip = main.params[ 'TEST' ][ 'MN' ]
-      
+        logFileName = main.params[ 'TEST' ][ 'logFile' ]
+        onBaremetal = main.params[ 'ENV' ][ 'onBaremetal' ]
+
         main.ONOSbench.handle.sendline("export TERM=vt100")
         main.ONOSbench.handle.expect(":~") 	    
+        homeDir = os.path.expanduser('~')
 
         #Populate ONOSIp with ips from params 
         for i in range(1, maxNodes + 1): 
@@ -90,34 +93,6 @@
         if skipMvn != "yes":
             mvnResult = main.ONOSbench.cleanInstall()
 
-        #configuring file to enable flicker
-        main.log.step(" Configuring null provider to enable flicker. Flicker Rate = " + flickerRate )
-        homeDir = os.path.expanduser('~')
-        main.log.info(homeDir)
-        localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
-        filePath = homeDir + localPath
-        main.log.info(filePath)
-
-        neighborsString = ""
-        for node in range(1, maxNodes + 1):
-            neighborsString += ONOSIp[node]
-            if node < maxNodes:
-                neighborsString += ","
-
-        configFile = open(filePath, 'w+')
-        main.log.info("File opened")
-        configFile.write("# Sample configurations for the NullLinkProvider.\n")
-        configFile.write("# \n")
-        configFile.write("# If enabled, sets time between linkEvent generation\n")
-        configFile.write("# in milliseconds.\n")
-        configFile.write("#\n") 
-        configFile.write("eventRate = " + flickerRate)
-        configFile.write("\n")
-        configFile.write("#Set order of islands to chain together, in a line.\n")
-        configFile.write("neighbors = " + neighborsString)
-        configFile.close()
-        main.log.info("Configuration completed")
-
         ### configure event rate file ###
         main.log.step("Writing Default Topology Provider config file")
         localPath = main.params[ 'TEST' ][ 'configFile' ]
@@ -129,29 +104,28 @@
         configFile.write("maxIdleMs = 0\n")
         configFile.write("maxBatchMs = 0\n")
         main.log.info("File written and closed")
-       
- 
-        devices_by_ip = ""
-        for node in range(1, maxNodes + 1):
-            devices_by_ip += (ONOSIp[node] + ":" + str(5))
-            if node < maxNodes:
-                devices_by_ip +=(",")
-        
-        main.log.step("Configuring device provider")
-        localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
-        filePath = homeDir + localPath
-        main.log.info(filePath)
-        configFile = open(filePath, 'w+')
-        main.log.info("Device config file opened")
-        configFile.write("devConfigs = " + devices_by_ip)
         configFile.close()
-        main.log.info("File closed")
 
-        logFileName = main.params[ 'TEST' ][ 'logFile' ]
         logFile = open(logFileName, 'w+')
         main.log.info("Created log File")
         logFile.close()
 
+        if onBaremetal == "true":
+            filename = "/onos/tools/package/bin/onos-service"
+            serviceConfig = open(homeDir + filename, 'w+')
+            serviceConfig.write("#!/bin/bash\n ")
+            serviceConfig.write("#------------------------------------- \n ")
+            serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
+            serviceConfig.write("#------------------------------------- \n ")
+            serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
+            serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms256m -Xmx8G}" \n """)
+            serviceConfig.write("")
+            serviceConfig.write("ONOS_HOME=/opt/onos \n ")
+            serviceConfig.write("")
+            serviceConfig.write("[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n")
+            serviceConfig.write("""${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """)
+            serviceConfig.close() 
+
         main.step( "Creating ONOS package" )
         packageResult = main.ONOSbench.onosPackage()  
 
@@ -212,11 +186,14 @@
         main.step( "Set Cell" )
         main.ONOSbench.setCell(cellName)
 
+        main.step( "Packaging" ) 
+        main.ONOSbench.onosPackage()
+
         main.log.report( "Increasing cluster size to " + str( clusterCount ) )
         for node in range(1, clusterCount + 1):
             time.sleep(10)
             main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
-            main.ONOSbench.onosInstall( ONOSIp[node] )
+            main.ONOSbench.onosInstall( node=ONOSIp[node] )
             exec "a = main.ONOS%scli.startOnosCli" %str(node)
             a(ONOSIp[node])
         
@@ -245,8 +222,7 @@
         linkResult = main.FALSE
         scale = int( main.params[ 'SCALE' ] )
 
-        testDelay = main.params[ 'TEST' ][ 'wait']
-        time.sleep( float( testDelay ) )
+        testDelay = main.params[ 'TEST' ][ 'wait' ]
                 
         for node in range(1, clusterCount + 1): 
             main.log.info("Writing flicker file to node " + str(node))
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.pyc b/TestON/tests/LinkEventTP/LinkEventTP.pyc
index 08393ed..644df6d 100644
--- a/TestON/tests/LinkEventTP/LinkEventTP.pyc
+++ b/TestON/tests/LinkEventTP/LinkEventTP.pyc
Binary files differ
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.topo b/TestON/tests/LinkEventTP/LinkEventTP.topo
index cf5fc94..3c24161 100644
--- a/TestON/tests/LinkEventTP/LinkEventTP.topo
+++ b/TestON/tests/LinkEventTP/LinkEventTP.topo
@@ -3,7 +3,7 @@
     <COMPONENT>
 
         <ONOSbench>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosDriver</type>
@@ -15,7 +15,7 @@
         </ONOSbench>
 
         <ONOS1cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -24,7 +24,7 @@
         </ONOS1cli>
 
         <ONOS2cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -33,7 +33,7 @@
         </ONOS2cli>
 
         <ONOS3cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -42,7 +42,7 @@
         </ONOS3cli>
 
         <ONOS4cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -51,7 +51,7 @@
         </ONOS4cli>
 
         <ONOS5cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -60,7 +60,7 @@
         </ONOS5cli>
 
 	<ONOS6cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -69,7 +69,7 @@
         </ONOS6cli>
 
         <ONOS7cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -78,7 +78,7 @@
         </ONOS7cli>
 
         <ONOS1>
-            <host>10.128.5.51</host>
+            <host>10.254.1.201</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -87,7 +87,7 @@
         </ONOS1>
 
         <ONOS2>
-            <host>10.128.5.52</host>
+            <host>10.254.1.202</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -96,7 +96,7 @@
         </ONOS2>
 
         <ONOS3>
-            <host>10.128.5.53</host>
+            <host>10.254.1.203</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -105,7 +105,7 @@
         </ONOS3>
 
         <ONOS4>
-            <host>10.128.5.54</host>
+            <host>10.254.1.204</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -115,7 +115,7 @@
 
 	
         <ONOS5>
-            <host>10.128.5.65</host>
+            <host>10.254.1.205</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -124,7 +124,7 @@
         </ONOS5>
 
         <ONOS6>
-            <host>10.128.5.66</host>
+            <host>10.254.1.206</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -133,7 +133,7 @@
         </ONOS6>
 
         <ONOS7>
-            <host>10.128.5.67</host>
+            <host>10.254.1.207</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
diff --git a/TestON/tests/LinkEventTP/__init__.pyc b/TestON/tests/LinkEventTP/__init__.pyc
index 5415a7b..62abfab 100644
--- a/TestON/tests/LinkEventTP/__init__.pyc
+++ b/TestON/tests/LinkEventTP/__init__.pyc
Binary files differ
diff --git a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params
index 09c741c..24588e0 100644
--- a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params
+++ b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params
@@ -39,6 +39,8 @@
     <TSHARK>
         <ofpPortStatus>OF 1.3 146</ofpPortStatus>
         <ofpRoleReply>OF 1.3 90 of_role_reply</ofpRoleReply>
+        <featureReply>OF 1.3 98 of_features_reply</featureReply>
+        <roleRequest>OF 1.3 90 of_role_request</roleRequest>
         <tcpSynAck>TCP 74 6633</tcpSynAck>
     </TSHARK>
 
@@ -59,7 +61,7 @@
         </topoConfigName>
 
         #Number of times to iterate each case
-        <numIter>10</numIter>
+        <numIter>35</numIter>
         <numSwitch>2</numSwitch>
         #Number of iterations to ignore initially
         <iterIgnore>2</iterIgnore>
diff --git a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
index 872238e..8a9591d 100644
--- a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
+++ b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
@@ -156,8 +156,10 @@
         defaultSwPort = main.params['CTRL']['port1']
         numIter = main.params['TEST']['numIter']
         iterIgnore = int(main.params['TEST']['iterIgnore'])
+        
         deviceTimestamp = main.params['JSON']['deviceTimestamp']
         graphTimestamp = main.params['JSON']['graphTimestamp']
+
         debugMode = main.params['TEST']['debugMode']
         onosLog = main.params['TEST']['onosLogFile']
         resultPath = main.params['DB']['switchEventResultPath']
@@ -166,25 +168,26 @@
         thresholdMin = int(thresholdObj[0])
         thresholdMax = int(thresholdObj[1])
        
-        #TODO: Look for 'role-request' messages,
-        #      which replaces the 'vendor' messages previously seen
-        #      on OVS 2.0.1
-        tsharkOfString = main.params[ 'TSHARK' ][ 'ofpRoleReply' ]
+        # Look for 'role-request' messages,
+        # which replaces the 'vendor' messages previously seen
+        # on OVS 2.0.1
         tsharkTcpString = main.params[ 'TSHARK' ][ 'tcpSynAck' ]
+        tsharkFeatureReply = main.params[ 'TSHARK' ][ 'featureReply' ]
+        tsharkRoleRequest = main.params[ 'TSHARK' ][ 'roleRequest' ]
+        tsharkOfString = main.params[ 'TSHARK' ][ 'ofpRoleReply' ]
+
         tsharkOfOutput = '/tmp/tshark_of_topo.txt'
         tsharkTcpOutput = '/tmp/tshark_tcp_topo.txt'
+        tsharkRoleOutput = '/tmp/tshark_role_request.txt'
+        tsharkFeatureOutput = '/tmp/tshark_feature_reply.txt'
 
-        latencyEndToEndList = []
-        latencyOfpToGraphList = []
-        latencyOfpToDeviceList = []
-        latencyT0ToDeviceList = []
-        latencyTcpToOfpList = []
-        
         endToEndLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
         ofpToGraphLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
         ofpToDeviceLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
         
         tcpToOfpLatIter = []
+        tcpToFeatureLatIter = []
+        tcpToRoleLatIter = []
         assertion = main.TRUE
         localTime = time.strftime('%x %X')
         localTime = localTime.replace('/', '')
@@ -204,7 +207,9 @@
             main.log.info('Starting tshark capture')
             main.ONOS1.tsharkGrep(tsharkTcpString, tsharkTcpOutput)
             main.ONOS1.tsharkGrep(tsharkOfString, tsharkOfOutput)
-            
+            main.ONOS1.tsharkGrep(tsharkRoleRequest, tsharkRoleOutput)
+            main.ONOS1.tsharkGrep(tsharkFeatureReply, tsharkFeatureOutput)
+
             time.sleep(10)
            
             main.log.info('Assigning s3 to controller')
@@ -219,6 +224,14 @@
             main.log.info('Copying over tshark files')
             os.system('scp ' + ONOSUser + '@' + ONOS1Ip +
                     ':' + tsharkTcpOutput + ' /tmp/')
+            os.system('scp ' + ONOSUser + '@' + ONOS1Ip +
+                    ':' + tsharkRoleOutput + ' /tmp/')
+            os.system('scp ' + ONOSUser + '@' + ONOS1Ip +
+                    ':' + tsharkFeatureOutput + ' /tmp/')
+            os.system('scp ' + ONOSUser + '@' +
+                      ONOS1Ip + ':' + tsharkOfOutput + ' /tmp/')
+           
+            # Get tcp syn / ack output
             time.sleep(5)
             tcpFile = open(tsharkTcpOutput, 'r')
             tempText = tcpFile.readline()
@@ -234,10 +247,8 @@
                 t0Tcp = 0
                 assertion = main.FALSE
             tcpFile.close()
-            
-            os.system('scp ' + ONOSUser + '@' +
-                      ONOS1Ip + ':' + tsharkOfOutput + ' /tmp/')
-            
+           
+            # Get Role reply output
             time.sleep(5)
             ofFile = open(tsharkOfOutput, 'r')
             lineOfp = ''
@@ -247,7 +258,6 @@
                     lineOfp = tempText
                 else:
                     break
-
             obj = lineOfp.split(' ')
             main.log.info('Object read in from OFP capture: ' +
                     str(lineOfp))
@@ -259,7 +269,92 @@
                 t0Ofp = 0
                 assertion = main.FALSE
             ofFile.close()
-            
+           
+            # Get role request output
+            roleFile = open(tsharkRoleOutput, 'r')
+            tempText = roleFile.readline()
+            tempText = tempText.split(' ')
+            if len(tempText) > 1:
+                main.log.info('Object read in from role request capture:' +
+                        str(tempText))
+                roleTimestamp = float(tempText[1]) * 1000.0
+            else:
+                main.log.error('Tshark output file for role request' +
+                        ' returned unexpected results')
+                timeRoleRequest = 0
+                assertion = main.FALSE
+            roleFile.close()
+
+            # Get feature reply output
+            featureFile = open(tsharkFeatureOutput, 'r')
+            tempText = featureFile.readline()
+            tempText = tempText.split(' ')
+            if len(tempText) > 1:
+                main.log.info('Object read in from feature reply capture: '+
+                        str(tempText))
+                featureTimestamp = float(tempText[1]) * 1000.0
+            else:
+                main.log.error('Tshark output file for feature reply' +
+                        ' returned unexpected results')
+                timeFeatureReply = 0
+                assertion = main.FALSE
+            featureFile.close()
+
+            # TODO: calculate feature reply, role request times
+            # stack measurements correctly and report
+
+            """
+            #TODO: Refactor in progress
+
+            for node in range(0, clusterCount):
+                nodeNum = node+1
+                exec "metricsSwUp = main.ONOS%scli.topologyEventsMetrics"%str(nodeNum) 
+                jsonStr = metricsSwUp()
+                jsonObj = json.loads(jsonStr)
+                graphTimestamp = jsonObj[graphTimestamp]['value']
+                deviceTimestamp = jsonObj[deviceTimestamp]['value']
+               
+                deltaGraphTcp = int(graphTimestamp) - int(t0Tcp)
+                deltaDeviceTcp = int(deviceTimestamp) - int(t0Tcp)
+                deltaGraphOfp = int(graphTimestamp) - int(t0Ofp)
+                deltaDeviceOfp = int(deviceTimestamp) - int(t0Ofp)
+                deltaRoleTcp = int(roleTimestamp) - int(t0Tcp) 
+                deltaFeatureTcp = int(featureTimestamp) - int(t0Tcp)
+                deltaOfpTcp = int(t0Ofp) - int(t0Tcp)
+
+                if deltaGraphTcp > thresholdMin and\
+                   deltaGraphTcp < thresholdMax and i >= iterIgnore:
+                    endToEndLatNodeIter[node][i] = deltaGraphTcp
+                    main.log.info("ONOS "+str(nodeNum)+ " tcp-to-graph: "+
+                            str(deltaGraphTcp) + " ms")
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+ " tcp-to-graph "+
+                            "measurement ignored due to excess in "+
+                            "threshold or premature iteration")
+
+                if deltaGraphOfp > thresholdMin and\
+                   deltaGraphOfp < thresholdMax and i >= iterIgnore:
+                    ofpToGraphLatNodeIter[node][i] = deltaGraphOfp
+                    main.log.info("ONOS "+str(nodeNum)+ " ofp-to-graph: "+
+                            str(deltaGraphOfp) + " ms")
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+ " ofp-to-graph: "+
+                            "measurement ignored due to excess in "+
+                            "threshold or premature iteration")
+
+                if deltaDeviceOfp > thresholdMin and\
+                   deltaDeviceOfp < thresholdMax and i >= iterIgnore:
+                    ofpToDeviceLatNodeIter[node][i] = deltaDeviceOfp
+                    main.log.info("ONOS "+str(nodeNum)+ " ofp-to-device: "+
+                            str(deltaDeviceOfp) + " ms")
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+ " ofp-to-device: "+
+                            "measurement ignored due to excess in "+
+                            "threshold or premature iteration")
+
+
+            # ********************
+            """
             jsonStr1 = main.ONOS1cli.topologyEventsMetrics()
             jsonStr2 = ''
             jsonStr3 = ''
@@ -275,7 +370,8 @@
             jsonObj5 = ''
             jsonObj6 = ''
             jsonObj7 = ''
-            
+
+
             graphTimestamp1 = jsonObj1[graphTimestamp]['value']
             deviceTimestamp1 = jsonObj1[deviceTimestamp]['value']
             
@@ -286,39 +382,46 @@
             deltaGraph1 = int(graphTimestamp1) - int(t0Tcp)
             deltaOfpGraph1 = int(graphTimestamp1) - int(t0Ofp)
             deltaOfpDevice1 = int(deviceTimestamp1) - int(t0Ofp)
+            # Tshark timestamps 
             deltaTcpOfp1 = int(t0Ofp) - int(t0Tcp)
+            deltaRoleTcp1 = int(roleTimestamp) - int(t0Tcp) 
+            deltaFeatureTcp1 = int(featureTimestamp) - int(t0Tcp)
+            deltaOfpTcp1 = int(t0Ofp) - int(t0Tcp)
             
             if deltaTcpOfp1 > thresholdMin and\
                deltaTcpOfp1 < thresholdMax and i >= iterIgnore:
                 tcpToOfpLatIter.append(deltaTcpOfp1)
-                main.log.info('ONOS1 iter' + str(i) +
+            main.log.info('ONOS1 iter' + str(i) +
                               ' tcp-to-ofp: ' +
                               str(deltaTcpOfp1) + ' ms')
-            else:
-                tcpToOfpLatIter.append(0)
-                main.log.info('ONOS1 iter' + str(i) +
-                        ' tcp-to-ofp: ' + str(deltaTcpOfp1) +
-                        ' ms - ignored this iteration')
+            if deltaFeatureTcp1 > thresholdMin and\
+               deltaFeatureTcp1 < thresholdMax and i >= iterIgnore:
+                tcpToFeatureLatIter.append(deltaFeatureTcp1)
+            main.log.info('ONOS1 iter' + str(i) +
+                            ' tcp-to-feature-reply: ' +
+                            str(deltaFeatureTcp1) + ' ms')
+            if deltaRoleTcp1 > thresholdMin and\
+               deltaRoleTcp1 < thresholdMax and i >= iterIgnore:
+                tcpToRoleLatIter.append(deltaRoleTcp1)
+            main.log.info('ONOS1 iter' + str(i) +
+                            ' tcp-to-role-request: ' +
+                            str(deltaRoleTcp1) + ' ms')
             if deltaGraph1 > thresholdMin and\
                deltaGraph1 < thresholdMax and i >= iterIgnore:
                 endToEndLatNodeIter[0][i] = deltaGraph1
-                main.log.info('ONOS1 iter' + str(i) +
+            main.log.info('ONOS1 iter' + str(i) +
                               ' end-to-end: ' +
                               str(deltaGraph1) + ' ms')
-            else:
-                main.log.info('ONOS1 iter' + str(i) +
-                        ' end-to-end: ' + str(deltaGraph1) +
-                        ' ms - ignored this iteration')
             if deltaOfpGraph1 > thresholdMin and \
                deltaOfpGraph1 < thresholdMax and i >= iterIgnore:
                 ofpToGraphLatNodeIter[0][i] = deltaOfpGraph1
-                main.log.info('ONOS1 iter' + str(i) +
+            main.log.info('ONOS1 iter' + str(i) +
                         ' ofp-to-graph: ' +
                         str(deltaOfpGraph1) + ' ms')
             if deltaOfpDevice1 > thresholdMin and\
                deltaOfpDevice1 < thresholdMax and i >= iterIgnore:
                 ofpToDeviceLatNodeIter[0][i] = deltaOfpDevice1
-                main.log.info('ONOS1 iter' + str(i) +
+            main.log.info('ONOS1 iter' + str(i) +
                         ' ofp-to-device: ' +
                         str(deltaOfpDevice1))
             
@@ -342,36 +445,36 @@
                 if deltaGraph2 > thresholdMin and\
                    deltaGraph2 < thresholdMax and i >= iterIgnore:
                     endToEndLatNodeIter[1][i] = deltaGraph2
-                    main.log.info('ONOS2 iter' + str(i) +
+                main.log.info('ONOS2 iter' + str(i) +
                             ' end-to-end: ' +
                             str(deltaGraph2) + ' ms')
                 if deltaOfpGraph2 > thresholdMin and\
                    deltaOfpGraph2 < thresholdMax and i >= iterIgnore:
                     ofpToGraphLatNodeIter[1][i] = deltaOfpGraph2
-                    main.log.info('ONOS2 iter' + str(i) +
+                main.log.info('ONOS2 iter' + str(i) +
                             ' ofp-to-graph: ' +
                             str(deltaOfpGraph2) + ' ms')
                 if deltaOfpDevice2 > thresholdMin and\
                    deltaOfpDevice2 < thresholdMax and i >= iterIgnore:
                     ofpToDeviceLatNodeIter[1][i] = deltaOfpDevice2
-                    main.log.info('ONOS2 iter' + str(i) +
+                main.log.info('ONOS2 iter' + str(i) +
                             ' ofp-to-device: ' +
-                            str(deltaOfpDevice2))
+                            str(deltaOfpDevice2)+ ' ms')
                 if deltaGraph3 > thresholdMin and\
                    deltaGraph3 < thresholdMax and i >= iterIgnore:
                     endToEndLatNodeIter[2][i] = deltaGraph3
-                    main.log.info('ONOS3 iter' + str(i) +
+                main.log.info('ONOS3 iter' + str(i) +
                             ' end-to-end: ' + str(deltaGraph3) + ' ms')
                 if deltaOfpGraph3 > thresholdMin and\
                    deltaOfpGraph3 < thresholdMax and i >= iterIgnore:
                     ofpToGraphLatNodeIter[2][i] = deltaOfpGraph3
-                    main.log.info('ONOS3 iter' + str(i) +
+                main.log.info('ONOS3 iter' + str(i) +
                             ' ofp-to-graph: ' +
                             str(deltaOfpGraph3) + ' ms')
                 if deltaOfpDevice3 > thresholdMin and\
-                        deltaOfpDevice3 < thresholdMax and i >= iterIgnore:
+                   deltaOfpDevice3 < thresholdMax and i >= iterIgnore:
                     ofpToDeviceLatNodeIter[2][i] = deltaOfpDevice3
-                    main.log.info('ONOS3 iter' + str(i) +
+                main.log.info('ONOS3 iter' + str(i) +
                             ' ofp-to-device: ' + str(deltaOfpDevice3))
             if clusterCount >= 5:
                 jsonStr4 = main.ONOS4cli.topologyEventsMetrics()
@@ -393,32 +496,32 @@
                 if deltaGraph4 > thresholdMin and \
                    deltaGraph4 < thresholdMax and i >= iterIgnore:
                     endToEndLatNodeIter[3][i] = deltaGraph4
-                    main.log.info('ONOS4 iter' + str(i) +
+                main.log.info('ONOS4 iter' + str(i) +
                             ' end-to-end: ' + str(deltaGraph4) + ' ms')
                 if deltaOfpDevice4 > thresholdMin and \
                    deltaOfpDevice4 < thresholdMax and i >= iterIgnore:
                     ofpToDeviceLatNodeIter[3][i] = deltaOfpDevice4
-                    main.log.info('ONOS4 iter' + str(i) +
+                main.log.info('ONOS4 iter' + str(i) +
                             ' ofp-to-device: ' + str(deltaOfpDevice4))
                 if deltaOfpGraph4 > thresholdMin and \
                         deltaOfpGraph4 < thresholdMax and i >= iterIgnore:
                     ofpToGraphLatNodeIter[3][i] = deltaOfpGraph4
-                    main.log.info('ONOS4 iter' + str(i) +
+                main.log.info('ONOS4 iter' + str(i) +
                             ' ofp-to-graph: ' + str(deltaOfpGraph4) + ' ms')
                 if deltaGraph5 > thresholdMin and\
                         deltaGraph5 < thresholdMax and i >= iterIgnore:
                     endToEndLatNodeIter[4][i] = deltaGraph5
-                    main.log.info('ONOS5 iter' + str(i) +
+                main.log.info('ONOS5 iter' + str(i) +
                             ' end-to-end: ' + str(deltaGraph5) + ' ms')
                 if deltaOfpDevice5 > thresholdMin and\
                         deltaOfpDevice5 < thresholdMax and i >= iterIgnore:
                     ofpToDeviceLatNodeIter[4][i] = deltaOfpDevice5
-                    main.log.info('ONOS5 iter' + str(i) +
+                main.log.info('ONOS5 iter' + str(i) +
                             ' ofp-to-device: ' + str(deltaOfpDevice5))
                 if deltaOfpGraph5 > thresholdMin and\
                         deltaOfpGraph5 < thresholdMax and i >= iterIgnore:
                     ofpToGraphLatNodeIter[4][i] = deltaOfpGraph5
-                    main.log.info('ONOS5 iter' + str(i) +
+                main.log.info('ONOS5 iter' + str(i) +
                             ' ofp-to-graph: ' +
                             str(deltaOfpGraph5) + ' ms')
             if clusterCount >= 7:
@@ -441,38 +544,38 @@
                 if deltaGraph6 > thresholdMin and \
                    deltaGraph6 < thresholdMax and i >= iterIgnore:
                     endToEndLatNodeIter[5][i] = deltaGraph6
-                    main.log.info('ONOS6 iter' + str(i) +
+                main.log.info('ONOS6 iter' + str(i) +
                             ' end-to-end: ' + str(deltaGraph6) + ' ms')
                 if deltaOfpDevice6 > thresholdMin and\
                    deltaOfpDevice6 < thresholdMax and i >= iterIgnore:
                     ofpToDeviceLatNodeIter[5][i] = deltaOfpDevice6
-                    main.log.info('ONOS6 iter' + str(i) +
+                main.log.info('ONOS6 iter' + str(i) +
                             ' ofp-to-device: ' + str(deltaOfpDevice6))
                 if deltaOfpGraph6 > thresholdMin and\
                    deltaOfpGraph6 < thresholdMax and i >= iterIgnore:
                     ofpToGraphLatNodeIter[5][i] = deltaOfpGraph6
-                    main.log.info('ONOS6 iter' + str(i) +
+                main.log.info('ONOS6 iter' + str(i) +
                             ' ofp-to-graph: ' +
                             str(deltaOfpGraph6) + ' ms')
                 if deltaGraph7 > thresholdMin and \
                    deltaGraph7 < thresholdMax and i >= iterIgnore:
                     endToEndLatNodeIter[6][i] = deltaGraph7
-                    main.log.info('ONOS7 iter' + str(i) +
+                main.log.info('ONOS7 iter' + str(i) +
                             ' end-to-end: ' + 
                             str(deltaGraph7) + ' ms')
                 if deltaOfpDevice7 > thresholdMin and\
                         deltaOfpDevice7 < thresholdMax and i >= iterIgnore:
                     ofpToDeviceLatNodeIter[6][i] = deltaOfpDevice7
-                    main.log.info('ONOS7 iter' + str(i) +
+                main.log.info('ONOS7 iter' + str(i) +
                             ' ofp-to-device: ' +
                             str(deltaOfpDevice7))
                 if deltaOfpGraph7 > thresholdMin and \
                         deltaOfpGraph7 < thresholdMax and i >= iterIgnore:
                     ofpToGraphLatNodeIter[6][i] = deltaOfpGraph7
-                    main.log.info('ONOS7 iter' + str(i) +
+                main.log.info('ONOS7 iter' + str(i) +
                             ' ofp-to-graph: ' +
                             str(deltaOfpGraph7) + ' ms')
-            
+
             time.sleep(5)
         
             # Get device id to remove
@@ -499,11 +602,19 @@
 
         endToEndAvg = 0
         ofpToGraphAvg = 0
-        endToEndList = []
-        ofpToGraphList = []
-        ofpToDeviceList = []
         dbCmdList = []
         for node in range(0, clusterCount):
+            # List of latency for each node
+            endToEndList = []
+            ofpToGraphList = []
+            ofpToDeviceList = []
+            tcpToOfpList = []
+            tcpToFeatureList = []
+            tcpToRoleList = []
+
+            # LatNodeIter 2d arrays contain all iteration latency
+            # for each node of the current scale cluster size
+
             for item in endToEndLatNodeIter[node]:
                 if item > 0.0:
                     endToEndList.append(item)
@@ -516,7 +627,22 @@
                 if item > 0.0:
                     ofpToDeviceList.append(item)
 
+            for item in tcpToOfpLatIter:
+                if item > 0.0:
+                    tcpToOfpList.append(item)
+
+            for item in tcpToFeatureLatIter:
+                if item > 0.0:
+                    tcpToFeatureList.append(item)
+
+            for item in tcpToRoleLatIter:
+                if item > 0.0:
+                    tcpToRoleList.append(item)
+
             endToEndAvg = round(numpy.mean(endToEndList), 2)
+            tcpToOfpAvg = round(numpy.mean(tcpToOfpList), 2)
+            tcpToFeatureAvg = round(numpy.mean(tcpToFeatureList), 2)
+            tcpToRoleAvg = round(numpy.mean(tcpToRoleList), 2)
             ofpToGraphAvg = round(numpy.mean(ofpToGraphList), 2)
             endToEndStd = round(numpy.std(endToEndList), 2)
             ofpToGraphStd = round(numpy.std(ofpToGraphList), 2)
@@ -526,6 +652,9 @@
             main.log.report(' End-to-end Avg: ' + str(endToEndAvg) +
                     ' ms' + ' End-to-end Std dev: ' +
                     str(endToEndStd) + ' ms')
+            main.log.report(' Tcp-to-role-reply : ' + str(tcpToOfpAvg) + ' ms')
+            main.log.report(' Tcp-to-feature-reply : ' + str(tcpToFeatureAvg) + ' ms')
+            main.log.report(' Tcp-to-role-request : ' + str(tcpToRoleAvg) + ' ms')
             main.log.report(' Ofp-to-graph Avg: ' + str(ofpToGraphAvg) +
                     ' ms' + ' Ofp-to-graph Std dev: ' +
                     str(ofpToGraphStd) + ' ms')
@@ -658,7 +787,59 @@
                         ' results: ' + str(objDown))
                 timestampBeginPtDown = 0
             fPortDown.close()
-            
+          
+            """
+            # TODO: Refactor in progress
+
+            for node in range(0, clusterCount):
+                nodeNum = node+1
+                exec "metricsDown = main.ONOS%scli.topologyEventsMetrics"%str(nodeNum) 
+                jsonStrDown = metricsDown()
+                jsonObj = json.loads(jsonStrDown)
+                
+                graphTimestamp = jsonObj[graphTimestamp]['value']
+                deviceTimestamp = jsonObj[deviceTimestamp]['value']
+                linkTimestamp = jsonObj[linkTimestamp]['value']
+                
+                ptDownGraphToOfp = int(graphTimestamp) - int(timestampBeginPtDown)
+                ptDownDeviceToOfp = int(deviceTimestamp) - int(timestampBeginPtDown)
+                ptDownLinkToOfp = int(linkTimestamp) - int(timestampBeginPtDown)
+
+                if ptDownGraphToOfp > downThresholdMin and\
+                   ptDownGraphToOfp < downThresholdMax and i > iterIgnore:
+                    portDownGraphNodeIter[node][i] = ptDownGraphToOfp
+                    main.log.info("ONOS "+str(nodeNum)+ 
+                            " port down graph-to-ofp: "+
+                            str(ptDownGraphToOfp) + " ms") 
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " port down graph-to-ofp ignored"+
+                            " due to excess in threshold or premature iteration")
+
+                if ptDownDeviceToOfp > downThresholdMin and\
+                   ptDownDeviceToOfp < downThresholdMax and i > iterIgnore:
+                    portDownDeviceNodeIter[node][i] = ptDownDeviceToOfp
+                    main.log.info("ONOS "+str(nodeNum)+ 
+                            " port down device-to-ofp: "+
+                            str(ptDownDeviceToOfp) + " ms") 
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " port down device-to-ofp ignored"+
+                            " due to excess in threshold or premature iteration")
+
+                if ptDownLinkToOfp > downThresholdMin and\
+                   ptDownLinkToOfp < downThresholdMax and i > iterIgnore:
+                    portDownLinkNodeIter[node][i] = ptDownLinkToOfp
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " port down link-to-ofp: "+
+                            str(ptDownLinkToOfp) + " ms")
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " port down link-to-ofp ignored"+
+                            " due to excess in threshold or premature iteration")
+            """
+            # *************************
+
             main.step('Obtain t1 by metrics call')
             
             jsonStrUp1 = main.ONOS1cli.topologyEventsMetrics()
@@ -669,36 +850,27 @@
             ptDownGraphToOfp1 = int(graphTimestamp1) - int(timestampBeginPtDown)
             ptDownDeviceToOfp1 = int(deviceTimestamp1) - int(timestampBeginPtDown)
             ptDownLinkToOfp1 = int(linkTimestamp1) - int(timestampBeginPtDown)
-            
+           
             if ptDownGraphToOfp1 > downThresholdMin and\
                ptDownGraphToOfp1 < downThresholdMax and i > iterIgnore:
                 portDownGraphNodeIter[0][i] = ptDownGraphToOfp1
                 main.log.info('ONOS1 iter' + str(i) +
                         ' port down graph-to-ofp: ' +
                         str(ptDownGraphToOfp1) + ' ms')
-            else:
-                main.log.info('ONOS1 iter' + str(i) + 
-                        ' skipped. Result: ' +
-                        str(ptDownGraphToOfp1) + ' ms')
+            
             if ptDownDeviceToOfp1 > downThresholdMin and \
                ptDownDeviceToOfp1 < downThresholdMax and i > iterIgnore:
                 portDownDevNodeIter[0][i] = ptDownDeviceToOfp1
                 main.log.info('ONOS1 iter' + str(i) + 
                         ' port down device-to-ofp: ' +
                         str(ptDownDeviceToOfp1) + ' ms')
-            else:
-                main.log.info('ONOS1 iter' + str(i) +
-                        ' skipped. Result: ' +
-                        str(ptDownDeviceToOfp1) + ' ms')
             if ptDownLinkToOfp1 > downThresholdMin and\
                ptDownLinkToOfp1 < downThresholdMax and i > iterIgnore:
                 portDownLinkNodeIter[0][i] = ptDownLinkToOfp1
                 main.log.info('ONOS1 iter' + str(i) +
                         ' port down link-to-ofp: ' +
                         str(ptDownLinkToOfp1) + ' ms')
-            else:
-                main.log.info('ONOS1 Link-to-ofp skipped. Result: ' +
-                        str(ptDownLinkToOfp1) + ' ms')
+            
             if clusterCount >= 3:
                 jsonStrUp2 = main.ONOS2cli.topologyEventsMetrics()
                 jsonStrUp3 = main.ONOS3cli.topologyEventsMetrics()
@@ -858,7 +1030,7 @@
                     main.log.info('ONOS7 iter' + str(i) +
                             ' link-to-ofp: ' +
                             str(ptDownLinkToOfp7) + ' ms')
-            
+
             time.sleep(3)
             
             main.step('Starting wireshark capture for port status up')
@@ -888,6 +1060,62 @@
                 main.log.info('Tshark output file returned unexpected' + ' results.')
                 timestampBeginPtUp = 0
             fPortUp.close()
+            """ 
+            # TODO: Refactoring in progress
+            
+            for node in range(0, clusterCount):
+                nodeNum = node+1
+                exec "metricsUp = main.ONOS%scli.topologyEventsMetrics"%str(nodeNum) 
+                jsonStrUp = metricsUp()
+                jsonObj = json.loads(jsonStrUp)
+                
+                print jsonObj
+
+                graphTimestamp = jsonObj[graphTimestamp]['value']
+                deviceTimestamp = jsonObj[deviceTimestamp]['value']
+                linkTimestamp = jsonObj[linkTimestamp]['value']
+                
+                ptUpGraphToOfp = int(graphTimestamp) - int(timestampBeginPtUp)
+                ptUpDeviceToOfp = int(deviceTimestamp) - int(timestampBeginPtUp)
+                ptUpLinkToOfp = int(linkTimestamp) - int(timestampBeginPtUp)
+
+                if ptUpGraphToOfp > upThresholdMin and\
+                   ptUpGraphToOfp < upThresholdMax and i > iterIgnore:
+                    portUpGraphNodeIter[node][i] = ptUpGraphToOfp
+                    main.log.info("ONOS "+str(nodeNum)+ 
+                            " port up graph-to-ofp: "+
+                            str(ptUpGraphToOfp) + " ms") 
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " port up graph-to-ofp ignored"+
+                            " due to excess in threshold or premature iteration")
+
+                if ptUpDeviceToOfp > upThresholdMin and\
+                   ptUpDeviceToOfp < upThresholdMax and i > iterIgnore:
+                    portUpDeviceNodeIter[node][i] = ptUpDeviceToOfp
+                    main.log.info("ONOS "+str(nodeNum)+ 
+                            " port up device-to-ofp: "+
+                            str(ptUpDeviceToOfp) + " ms") 
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " port up device-to-ofp ignored"+
+                            " due to excess in threshold or premature iteration")
+
+                if ptUpLinkToOfp > upThresholdMin and\
+                   ptUpLinkToOfp < upThresholdMax and i > iterIgnore:
+                    portUpLinkNodeIter[node][i] = ptUpLinkToOfp
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " port up link-to-ofp: "+
+                            str(ptUpLinkToOfp) + " ms")
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " port up link-to-ofp ignored"+
+                            " due to excess in threshold or premature iteration")
+
+            """
+
+            # *****************************
+            
             main.step('Obtain t1 by REST call')
             jsonStrUp1 = main.ONOS1cli.topologyEventsMetrics()
             jsonObj1 = json.loads(jsonStrUp1)
@@ -903,20 +1131,12 @@
                 main.log.info('ONOS1 iter' + str(i) +
                         ' port up graph-to-ofp: ' +
                         str(ptUpGraphToOfp1) + ' ms')
-            else:
-                main.log.info('ONOS1 iter' + str(i) +
-                        ' skipped. Result: ' +
-                        str(ptUpGraphToOfp1) + ' ms')
             if ptUpDeviceToOfp1 > upThresholdMin and \
                ptUpDeviceToOfp1 < upThresholdMax and i > iterIgnore:
                 portUpDevNodeIter[0][i] = ptUpDeviceToOfp1
                 main.log.info('ONOS1 iter' + str(i) +
                         ' port up device-to-ofp: ' +
                         str(ptUpDeviceToOfp1) + ' ms')
-            else:
-                main.log.info('ONOS1 iter' + str(i) +
-                        ' skipped. Result: ' +
-                        str(ptUpDeviceToOfp1) + ' ms')
             if ptUpLinkToOfp1 > downThresholdMin and\
                ptUpLinkToOfp1 < downThresholdMax and i > iterIgnore:
                 portUpLinkNodeIter[0][i] = ptUpLinkToOfp1
@@ -1005,10 +1225,16 @@
                     main.log.info('ONOS4 iter' + str(i) +
                             ' port up device-to-ofp: ' +
                             str(ptUpDeviceToOfp4) + ' ms')
+                if ptUpLinkToOfp4 > downThresholdMin and\
+                   ptUpLinkToOfp4 < downThresholdMax and i > iterIgnore:
+                    portUpLinkNodeIter[3][i] = ptUpLinkToOfp4
+                    main.log.info('ONOS4 iter' + str(i) +
+                            ' port up link-to-ofp: ' +
+                            str(ptUpLinkToOfp4) + ' ms')
                 if ptUpGraphToOfp5 > upThresholdMin and\
                     ptUpGraphToOfp5 < upThresholdMax and i > iterIgnore:
                     portUpGraphNodeIter[4][i] = ptUpGraphToOfp5
-                    main.log.info('ONSO5 iter' + str(i) +
+                    main.log.info('ONOS5 iter' + str(i) +
                             ' port up graph-to-ofp: ' +
                             str(ptUpGraphToOfp5) + ' ms')
                 if ptUpDeviceToOfp5 > upThresholdMin and \
@@ -1017,6 +1243,13 @@
                     main.log.info('ONOS5 iter' + str(i) +
                             ' port up device-to-ofp: ' +
                             str(ptUpDeviceToOfp5) + ' ms')
+                if ptUpLinkToOfp5 > downThresholdMin and\
+                   ptUpLinkToOfp5 < downThresholdMax and i > iterIgnore:
+                    portUpLinkNodeIter[4][i] = ptUpLinkToOfp5
+                    main.log.info('ONOS5 iter' + str(i) +
+                            ' port up link-to-ofp: ' +
+                            str(ptUpLinkToOfp5) + ' ms')
+            
             if clusterCount >= 7:
                 jsonStrUp6 = main.ONOS6cli.topologyEventsMetrics()
                 jsonStrUp7 = main.ONOS7cli.topologyEventsMetrics()
@@ -1026,45 +1259,67 @@
                 graphTimestamp7 = jsonObj7[graphTimestamp]['value']
                 deviceTimestamp6 = jsonObj6[deviceTimestamp]['value']
                 deviceTimestamp7 = jsonObj7[deviceTimestamp]['value']
+                linkTimestamp6 = jsonObj6[linkTimestamp]['value']
+                linkTimestamp7 = jsonObj7[linkTimestamp]['value']
                 ptUpGraphToOfp6 = int(graphTimestamp6) - int(timestampBeginPtUp)
                 ptUpGraphToOfp7 = int(graphTimestamp7) - int(timestampBeginPtUp)
                 ptUpDeviceToOfp6 = int(deviceTimestamp6) - int(timestampBeginPtUp)
                 ptUpDeviceToOfp7 = int(deviceTimestamp7) - int(timestampBeginPtUp)
+                ptUpLinkToOfp6 = int(linkTimestamp6) - int(timestampBeginPtUp)
+                ptUpLinkToOfp7 = int(linkTimestamp7) - int(timestampBeginPtUp)
                 if ptUpGraphToOfp6 > upThresholdMin and\
                    ptUpGraphToOfp6 < upThresholdMax and i > iterIgnore:
                     portUpGraphNodeIter[5][i] = ptUpGraphToOfp6
-                    main.log.info('iter' + str(i) +
+                    main.log.info('ONOS6 iter' + str(i) +
                             ' port up graph-to-ofp: ' +
                             str(ptUpGraphToOfp6) + ' ms')
                 if ptUpDeviceToOfp6 > upThresholdMin and\
                    ptUpDeviceToOfp6 < upThresholdMax and i > iterIgnore:
                     portUpDevNodeIter[5][i] = ptUpDeviceToOfp6
-                    main.log.info('iter' + str(i) +
+                    main.log.info('ONOS6 iter' + str(i) +
                             ' port up device-to-ofp: ' + 
                             str(ptUpDeviceToOfp6) + ' ms')
+                if ptUpLinkToOfp6 > downThresholdMin and\
+                   ptUpLinkToOfp6 < downThresholdMax and i > iterIgnore:
+                    portUpLinkNodeIter[5][i] = ptUpLinkToOfp6
+                    main.log.info('ONOS6 iter' + str(i) +
+                            ' port up link-to-ofp: ' +
+                            str(ptUpLinkToOfp6) + ' ms')
                 if ptUpGraphToOfp7 > upThresholdMin and \
                    ptUpGraphToOfp7 < upThresholdMax and i > iterIgnore:
                     portUpGraphNodeIter[6][i] = ptUpGraphToOfp7
-                    main.log.info('iter' + str(i) +
+                    main.log.info('ONOS7 iter' + str(i) +
                             ' port up graph-to-ofp: ' + 
                             str(ptUpGraphToOfp7) + ' ms')
                 if ptUpDeviceToOfp7 > upThresholdMin and\
                    ptUpDeviceToOfp7 < upThresholdMax and i > iterIgnore:
                     portUpDevNodeIter[6][i] = ptUpDeviceToOfp7
-                    main.log.info('iter' + str(i) +
+                    main.log.info('ONOS7 iter' + str(i) +
                             ' port up device-to-ofp: ' +
                             str(ptUpDeviceToOfp7) + ' ms')
+                if ptUpLinkToOfp7 > downThresholdMin and\
+                   ptUpLinkToOfp7 < downThresholdMax and i > iterIgnore:
+                    portUpLinkNodeIter[6][i] = ptUpLinkToOfp7
+                    main.log.info('ONOS7 iter' + str(i) +
+                            ' port up link-to-ofp: ' +
+                            str(ptUpLinkToOfp7) + ' ms')
 
         dbCmdList = []
         for node in range(0, clusterCount):
             portUpDevList = []
             portUpGraphList = []
+            portUpLinkList = []
             portDownDevList = []
             portDownGraphList = []
+            portDownLinkList = []
+
             portUpDevAvg = 0
             portUpGraphAvg = 0
+            portUpLinkAvg = 0
             portDownDevAvg = 0
             portDownGraphAvg = 0
+            portDownLinkAvg = 0
+
             for item in portUpDevNodeIter[node]:
                 if item > 0.0:
                     portUpDevList.append(item)
@@ -1073,6 +1328,10 @@
                 if item > 0.0:
                     portUpGraphList.append(item)
 
+            for item in portUpLinkNodeIter[node]:
+                if item > 0.0:
+                    portUpLinkList.append(item)
+
             for item in portDownDevNodeIter[node]:
                 if item > 0.0:
                     portDownDevList.append(item)
@@ -1081,21 +1340,36 @@
                 if item > 0.0:
                     portDownGraphList.append(item)
 
+            for item in portDownLinkNodeIter[node]:
+                if item > 0.0:
+                    portDownLinkList.append(item)
+
             portUpDevAvg = round(numpy.mean(portUpDevList), 2)
             portUpGraphAvg = round(numpy.mean(portUpGraphList), 2)
+            portUpLinkAvg = round(numpy.mean(portUpLinkList), 2)
+
             portDownDevAvg = round(numpy.mean(portDownDevList), 2)
             portDownGraphAvg = round(numpy.mean(portDownGraphList), 2)
+            portDownLinkAvg = round(numpy.mean(portDownLinkList), 2)
+            
             portUpStdDev = round(numpy.std(portUpGraphList), 2)
             portDownStdDev = round(numpy.std(portDownGraphList), 2)
+           
             main.log.report(' - Node ' + str(node + 1) + ' Summary - ')
             main.log.report(' Port up ofp-to-device ' +
-                    str(round(portUpDevAvg, 2)) + ' ms')
+                    str(portUpDevAvg) + ' ms')
             main.log.report(' Port up ofp-to-graph ' +
                     str(portUpGraphAvg) + ' ms')
+            main.log.report(' Port up ofp-to-link ' +
+                    str(portUpLinkAvg) + ' ms')
+            
             main.log.report(' Port down ofp-to-device ' +
                     str(round(portDownDevAvg, 2)) + ' ms')
             main.log.report(' Port down ofp-to-graph ' +
                     str(portDownGraphAvg) + ' ms')
+            main.log.report(' Port down ofp-to-link ' +
+                    str(portDownLinkAvg) + ' ms')
+
             dbCmdList.append("INSERT INTO port_latency_tests VALUES('" + 
                     timeToPost + "','port_latency_results'," + runNum +
                     ',' + str(clusterCount) + ",'baremetal" + str(node + 1) +
diff --git a/TestON/tests/flowTP1g/flowTP1g.params b/TestON/tests/flowTP1g/flowTP1g.params
index 93b3923..5771a62 100644
--- a/TestON/tests/flowTP1g/flowTP1g.params
+++ b/TestON/tests/flowTP1g/flowTP1g.params
@@ -17,8 +17,8 @@
         <skipCleanInstall>yes</skipCleanInstall> 
         <warmUp>4</warmUp>                               #number of runs to warm up the system
         <sampleSize>20</sampleSize>                      #number of runs to take data from
-        <neighbors>6</neighbors>                    #list of number of neighbors
-        <servers>7</servers>                      #list of servers
+        <neighbors>4,2,0</neighbors>                    #list of number of neighbors
+        <servers>7,5,3,1</servers>                      #list of servers
         <flows>122500</flows>
         <switches>35</switches>
 
diff --git a/TestON/tests/flowTP1g/flowTP1g.py b/TestON/tests/flowTP1g/flowTP1g.py
index b8450fd..8261a47 100644
--- a/TestON/tests/flowTP1g/flowTP1g.py
+++ b/TestON/tests/flowTP1g/flowTP1g.py
@@ -182,7 +182,7 @@
             serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
             serviceConfig.write("#------------------------------------- \n ")
             serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
-            serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms256m -Xmx8G}" \n """)
+            serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms8G -Xmx8G}" \n """)
             serviceConfig.write("")
             serviceConfig.write("ONOS_HOME=/opt/onos \n ")
             serviceConfig.write("")
diff --git a/TestON/tests/pushTestIntents/pushTestIntents.params b/TestON/tests/pushTestIntents/pushTestIntents.params
index c6b79d5..067ff8e 100644
--- a/TestON/tests/pushTestIntents/pushTestIntents.params
+++ b/TestON/tests/pushTestIntents/pushTestIntents.params
@@ -1,6 +1,6 @@
 <PARAMS>
 
-    <testcases>1,2,3,2,3,2,3</testcases>
+    <testcases>1,3,2,3,2,3,2,3</testcases>
 
     <SCALE>2</SCALE>
     <availableNodes>7</availableNodes>
@@ -16,8 +16,8 @@
         <warmUp>4</warmUp>
         <sampleSize>10</sampleSize>                     
         <wait></wait>
-        <intents>1,1000</intents>                       #list format, will be split on ','
-        <debug></debug>                          #empty for false/no
+        <intents>1000</intents>                       #list format, will be split on ','
+        <debug>False</debug>                                        #"True" for true
     </TEST>
 
     <GIT>
@@ -28,36 +28,36 @@
     <CTRL>
         <USER>admin</USER>
         
-        <ip1>10.128.5.51</ip1>
+        <ip1>10.254.1.201</ip1>
         <port1>6633</port1>
         
-        <ip2>10.128.5.52</ip2>
+        <ip2>10.254.1.202</ip2>
         <port2>6633</port2>
         
-        <ip3>10.128.5.53</ip3>
+        <ip3>10.254.1.203</ip3>
         <port3>6633</port3>
         
-        <ip4>10.128.5.54</ip4>
+        <ip4>10.254.1.204</ip4>
         <port4>6633</port4>
         
-        <ip5>10.128.5.65</ip5>
+        <ip5>10.254.1.205</ip5>
         <port5>6633</port5>
         
-        <ip6>10.128.5.66</ip6>
+        <ip6>10.254.1.206</ip6>
         <port6>6633</port6> 
        
-        <ip7>10.128.5.67</ip7>
+        <ip7>10.254.1.207</ip7>
         <port7>6633</port7>
 
     </CTRL>
 
     <MN>
-        <ip1>10.128.5.59</ip1>
+        <ip1>10.254.1.200</ip1>
     </MN>
 
     <BENCH>
         <user>admin</user>
-        <ip1>10.128.5.55</ip1>
+        <ip1>10.254.1.200</ip1>
     </BENCH>
 
     <JSON>
diff --git a/TestON/tests/pushTestIntents/pushTestIntents.py b/TestON/tests/pushTestIntents/pushTestIntents.py
index d5623cf..1594345 100644
--- a/TestON/tests/pushTestIntents/pushTestIntents.py
+++ b/TestON/tests/pushTestIntents/pushTestIntents.py
@@ -175,16 +175,21 @@
         debug = main.params[ 'TEST' ][ 'switchCount' ]
         for i in range(0,len(intentsList)):
             intentsList[i] = int(intentsList[i]) 
-         
+  
+        if debug == "True": 
+            debug = True
+        else: 
+            debug = False
    
         linkCount = 0
-        while True:
+        for i in range(0,10):
             main.ONOSbench.handle.sendline("onos $OC1 links|wc -l")
             main.ONOSbench.handle.expect(":~")
             linkCount = main.ONOSbench.handle.before    
             if debug: main.log.info("Link Count check: " + linkCount)   
             if str((switchCount*2)-2) in linkCount: 
                 break 
+            time.sleep(2)
     
         links = "--" 
         while "=null:" not in links:
@@ -225,6 +230,8 @@
             withdrawn = []
 
             for run in range(0, (warmUp + sampleSize)):
+                if run > warmUp: 
+                    time.sleep(5)
         
                 myRawResult = "--"
                 while "ms" not in myRawResult:
@@ -233,22 +240,32 @@
                     myRawResult = main.ONOSbench.handle.before
                     if debug: main.log.info(myRawResult)
 
-                main.log.info(myRawResult)  
+                if debug: main.log.info(myRawResult)  
 
                 if run >= warmUp: 
                     myRawResult = myRawResult.splitlines()
                     for line in myRawResult:
                         if "install" in line:
-                            installed.append(line.split(" ")[5])  
-                        if "withdrawn" in line: 
-                            withdrawn.append(line.split(" ")[5])
-                    print(installed)
-                    print(withdrawn)
-            
-            main.log.info("Scale: " + str(clusterCount) + "\tIntent batch size: " + str(intentSize)) 
-            
+                            installed.append(int(line.split(" ")[5]))  
+                    
+                    for line in myRawResult:
+                        if "withdraw" in line: 
+                            withdrawn.append(int(line.split(" ")[5]))
+
+                    print("installed: " + str(installed))
+                    print("withraw: " + str(withdrawn) + "\n")
+    
+            main.log.report("----------------------------------------------------")
+            main.log.report("Scale: " + str(clusterCount) + "\tIntent batch size: " + str(intentSize)) 
+            main.log.report("Installed average: " + str(numpy.mean(installed)))
+            main.log.report("Installed standard deviation: " + str(numpy.std(installed)))
+            main.log.report("Withdraw average: " + str(numpy.mean(withdrawn)))
+            main.log.report("Withdraw standard deviation: " + str(numpy.std(withdrawn)))
+            main.log.report("     ")
+
+        
                 
-                time.sleep(5)
+            
 
 
 
diff --git a/TestON/tests/pushTestIntents/pushTestIntents.topo b/TestON/tests/pushTestIntents/pushTestIntents.topo
index 30a1467..0e45e0f 100644
--- a/TestON/tests/pushTestIntents/pushTestIntents.topo
+++ b/TestON/tests/pushTestIntents/pushTestIntents.topo
@@ -3,7 +3,7 @@
     <COMPONENT>
 
         <ONOSbench>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosDriver</type>
@@ -12,7 +12,7 @@
         </ONOSbench>
 
         <ONOS1cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -21,7 +21,7 @@
         </ONOS1cli>
 
         <ONOS2cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -30,7 +30,7 @@
         </ONOS2cli>
 
         <ONOS3cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -39,7 +39,7 @@
         </ONOS3cli>
 
         <ONOS4cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -48,7 +48,7 @@
         </ONOS4cli>
 
         <ONOS5cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -57,7 +57,7 @@
         </ONOS5cli>
 
         <ONOS6cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -66,7 +66,7 @@
         </ONOS6cli>
 
         <ONOS7cli>
-            <host>10.128.5.55</host>
+            <host>10.254.1.200</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -75,7 +75,7 @@
         </ONOS7cli>
 
         <ONOS1>
-            <host>10.128.5.51</host>
+            <host>10.254.1.201</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -84,7 +84,7 @@
         </ONOS1>
 
         <ONOS2>
-            <host>10.128.5.52</host>
+            <host>10.254.1.202</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -93,7 +93,7 @@
         </ONOS2>
 
         <ONOS3>
-            <host>10.128.5.53</host>
+            <host>10.254.1.203</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -102,7 +102,7 @@
         </ONOS3>
 
         <ONOS4>
-            <host>10.128.5.54</host>
+            <host>10.254.1.204</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -112,7 +112,7 @@
 
     
         <ONOS5>
-            <host>10.128.5.65</host>
+            <host>10.254.1.205</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -121,7 +121,7 @@
         </ONOS5>
 
         <ONOS6>
-            <host>10.128.5.66</host>
+            <host>10.254.1.206</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -130,7 +130,7 @@
         </ONOS6>
 
         <ONOS7>
-            <host>10.128.5.67</host>
+            <host>10.254.1.207</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
