diff --git a/TestON/tests/flowTP1g/flowTP1g.params b/TestON/tests/flowTP1g/flowTP1g.params
index 5771a62..bb05f0e 100644
--- a/TestON/tests/flowTP1g/flowTP1g.params
+++ b/TestON/tests/flowTP1g/flowTP1g.params
@@ -1,29 +1,28 @@
 <PARAMS>
 
-    <testcases>1,3</testcases>
+    <testcases>1,2</testcases>
     
-    <isOnBaremetal>true</isOnBaremetal>
-    <SCALE>1</SCALE>
+    <isOnBaremetal>False</isOnBaremetal>
+    <SCALE>7</SCALE>
     <availableNodes>7</availableNodes>
     
 
 
     <ENV>
         <cellName>flowTP</cellName>
-        <cellFeatures>webconsole,onos-core,onos-api,onos-cli,onos-null,onos-app-demo,onos-rest,onos-app-metrics,onos-app-metrics-intent,onos-app-metrics-topology</cellFeatures>
+        <cellApps>null,demo</cellApps>
     </ENV>
 
     <TEST>
         <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>4,2,0</neighbors>                    #list of number of neighbors
-        <servers>7,5,3,1</servers>                      #list of servers
-        <flows>122500</flows>
+        <warmUp>4</warmUp>                              #number of runs to warm up the system
+        <sampleSize>2</sampleSize>                     #number of runs to take data from
+        <neighbors>0,a</neighbors>                      #list of number of neighbors, a = all 
+        <flows>3500</flows>
         <switches>35</switches>
 
-        <testCMD0>flow-tester.py -f</testCMD0>      #base command 
-        <testCMD1> -n </testCMD1>                        #neighbors 
+        <testCMD0>flow-tester.py -f</testCMD0>          #base command 
+        <testCMD1> -n </testCMD1>                       #neighbors 
         
     </TEST>
 
@@ -35,36 +34,36 @@
     <CTRL>
         <USER>admin</USER>
         
-        <ip1>10.254.1.201</ip1>
+        <ip1>10.128.5.51</ip1>
         <port1>6633</port1>
         
-        <ip2>10.254.1.202</ip2>
+        <ip2>10.128.5.52</ip2>
         <port2>6633</port2>
         
-        <ip3>10.254.1.203</ip3>
+        <ip3>10.128.5.53</ip3>
         <port3>6633</port3>
         
-        <ip4>10.254.1.204</ip4>
+        <ip4>10.128.5.54</ip4>
         <port4>6633</port4>
         
-        <ip5>10.254.1.205</ip5>
+        <ip5>10.128.5.65</ip5>
         <port5>6633</port5>
         
-        <ip6>10.254.1.206</ip6>
+        <ip6>10.128.5.66</ip6>
         <port6>6633</port6> 
        
-         <ip7>10.254.1.207</ip7>
+        <ip7>10.128.5.67</ip7>
         <port7>6633</port7>
 
     </CTRL>
 
     <MN>
-        <ip1>10.254.1.200</ip1>
+        <ip1>10.128.5.55</ip1>
     </MN>
 
     <BENCH>
         <user>admin</user>
-        <ip1>10.254.1.200</ip1>
+        <ip1>10.128.5.55</ip1>
     </BENCH>
 
     <JSON>
diff --git a/TestON/tests/flowTP1g/flowTP1g.py b/TestON/tests/flowTP1g/flowTP1g.py
index 8261a47..946864c 100644
--- a/TestON/tests/flowTP1g/flowTP1g.py
+++ b/TestON/tests/flowTP1g/flowTP1g.py
@@ -13,63 +13,52 @@
     def __init__( self ):
         self.default = ''
 
-    def CASE1( self, main ):            #This is the initialization case
-                                        #this case will clean up all nodes 
-                                        #but only node 1 is started in this case
-        
-        global clusterCount             #number of nodes running
-        global ONOSIp                   #list of ONOS IP addresses 
-        clusterCount = 1
-        ONOSIp = [ 0 ]
+    def CASE1( self, main ):          
 
+        import time
+        global init
+        try:
+            if type(init) is not bool:
+                init = False
+        except NameError:
+            init = False
 
         #Load values from params file
         checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
         gitPull = main.params[ 'GIT' ][ 'autopull' ]
         cellName = main.params[ 'ENV' ][ 'cellName' ]
-        Features= main.params[ 'ENV' ][ 'cellFeatures' ]
+        Apps = main.params[ 'ENV' ][ 'cellApps' ]
         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' ]
-        
-        main.ONOSbench.handle.sendline("export TERM=vt100")
+        cellName = main.params[ 'ENV' ][ 'cellName' ]       
+ 
+        #----do i need this line?
+        #main.ONOSbench.handle.sendline("export TERM=vt100")
 
-        #Populate ONOSIp with ips from params 
-        for i in range(1, maxNodes + 1): 
-            ipString = 'ip' + str(i) 
-            ONOSIp.append(main.params[ 'CTRL' ][ ipString ])   
+        # -- INIT SECTION, ONLY RUNS ONCE -- #
+        if init == False:
+            init = True
+            global clusterCount             #number of nodes running
+            global ONOSIp                   #list of ONOS IP addresses
+            global scale
 
-        #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])
+            clusterCount = 0
+            ONOSIp = [ 0 ]
+            scale = (main.params[ 'SCALE' ]).split(",")
+            clusterCount = int(scale[0])
 
+            #Populate ONOSIp with ips from params
+            for i in range(1, maxNodes + 1):
+                ipString = 'ip' + str(i)
+                ONOSIp.append(main.params[ 'CTRL' ][ ipString ])
 
-        #construct the cell file
-        main.log.info("Creating initial cell file")
-        exec "a = main.ONOSbench.createCellFile"
-        cellIp = []
-        for node in range(1, 2):
-        #for node in range (1, maxNodes + 1):
-            cellIp.append(ONOSIp[node])
-        a(BENCHIp,cellName,MN1Ip,str(Features), *cellIp)
+            #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
+            if skipMvn != "yes":
+                mvnResult = main.ONOSbench.cleanInstall()
 
-        main.log.info(cellIp)
-
-        #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':
@@ -81,53 +70,64 @@
                 pullResult = main.TRUE
                 main.log.info( "Skipped git checkout and pull" )
 
+        # -- END OF INIT SECTION --#
 
-        #main.step( "Set cell for ONOS cli env" )
-        #main.ONOS1cli.setCell( cellName )
+        clusterCount = int(scale[0])
+        scale.remove(scale[0])
+        main.log.info("CLUSTER COUNT: " + str(clusterCount))
+
+        #kill off all onos processes 
+        main.log.step("Safety check, killing all ONOS processes")
+        main.log.step("before initiating enviornment setup")
+        for node in range(1, maxNodes + 1):
+            main.ONOSbench.onosDie(ONOSIp[node])
+
+        #Uninstall everywhere
+        main.log.step( "Cleaning Enviornment..." )
+        for i in range(1, maxNodes + 1):
+            main.log.info(" Uninstalling ONOS " + str(i) )
+            main.ONOSbench.onosUninstall( ONOSIp[i] )
+
+        #construct the cell file
+        main.log.info("Creating cell file")
+        cellIp = []
+        for node in range (1, clusterCount + 1):
+            cellIp.append(ONOSIp[node])        
         
+        main.ONOSbench.createCellFile(BENCHIp,cellName,MN1Ip,str(Apps), *cellIp)
+        main.log.info("Cell Ip list: " + str(cellIp))
+        
+        main.step( "Set Cell" )
+        main.ONOSbench.setCell(cellName)       
+ 
         main.step( "Creating ONOS package" )
         packageResult = main.ONOSbench.onosPackage()  
 
-        #main.step( "Installing ONOS package" )
-        #install1Result = main.ONOSbench.onosInstall( node=ONOSIp[1] )
-
-        cellName = main.params[ 'ENV' ][ 'cellName' ]
-        main.step( "Applying cell file to environment" )
-        cellApplyResult = main.ONOSbench.setCell( cellName )
         main.step( "verify cells" )
         verifyCellResult = main.ONOSbench.verifyCell()
 
-        #main.step( "Set cell for ONOS cli env" )
-        #cli1 = main.ONOS1cli.startOnosCli( node=ONOSIp[1] )
+        main.log.report( "Initializeing " + str( clusterCount ) + " node cluster." )
+        for node in range(1, clusterCount + 1):
+            main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
+            main.ONOSbench.onosInstall( ONOSIp[node])
 
-    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
-
-        scale = int( main.params[ 'SCALE' ] )
-        clusterCount += scale
-
-        main.log.report( "Increasing cluster size to " + str( clusterCount ) )
-        for node in range((clusterCount - scale) + 1, clusterCount + 1):
-            main.ONOSbench.onosDie(ONOSIp[node])
-            time.sleep(10)
-            main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])    
-            main.ONOSbench.onosInstall( node=ONOSIp[node])
+        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!" )
+        
+        for node in range(1, clusterCount + 1):
             exec "a = main.ONOS%scli.startOnosCli" %str(node)
             a(ONOSIp[node])
-    
-    
-    def CASE3( self, main ):
+         
+        main.log.info("Startup sequence complete")
+
+        
+    def CASE2( self, main ):
         #
         # This is the flow TP test 
         #
@@ -142,27 +142,26 @@
         warmUp = int(main.params[ 'TEST' ][ 'warmUp' ])
         sampleSize = int(main.params[ 'TEST' ][ 'sampleSize' ])
         switches = int(main.params[ 'TEST' ][ 'switches' ])
-        neighborList = main.params[ 'TEST' ][ 'neighbors' ]
-        serverList = main.params[ 'TEST' ][ 'servers' ]
-        #flows = int(main.params[ 'TEST' ][ 'flows' ]) 
+        neighborList = (main.params[ 'TEST' ][ 'neighbors' ]).split(",")
         testCMD[0] = main.params[ 'TEST' ][ 'testCMD0' ]
         testCMD[1] = main.params[ 'TEST' ][ 'testCMD1' ]
         maxNodes = main.params[ 'availableNodes' ]
         onBaremetal = main.params['isOnBaremetal']
 
-
         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' ]
         homeDir = os.path.expanduser('~')
-    
-        serverList = serverList.split(",")
-        main.log.info("serverlist: " + str(serverList))
-        neighborList = neighborList.split(",") 
+  
+        servers = str(clusterCount) 
+        for i in range(0, len(neighborList)):
+            if neighborList[i] == 'a':
+                neighborList[i] = str(clusterCount - 1)  
+        
+        if clusterCount == 1: 
+            neighborList = ['0']
         main.log.info("neightborlist: " + str(neighborList))
 
         ts = time.time()
@@ -191,222 +190,170 @@
             serviceConfig.close()
 
         for n in neighborList:
-            for servers in serverList:
-                main.log.step("\tSTARTING TEST")
-                main.log.step("\tSERVERS:  \t" + servers ) 
-                main.log.step("\tNEIGHBORS:\t" + n )  
-                main.log.info("=============================================================")
-                main.log.info("=============================================================")
-                #write file to configure nil link
-                ipCSV = ""
-                for i in range (1, int(maxNodes) + 1):
-                    tempstr = "ip" + str(i)
-                    ipCSV += main.params[ 'CTRL' ][ tempstr ] 
-                    if i < int(maxNodes):
-                        ipCSV +=","
-                
-                filename = "/onos/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
-                linkConfig = open(homeDir + filename,'w+')
-                linkConfig.write("# eventRate = 2000\n")
-                linkConfig.write("neighbors = "  + ipCSV)
-                main.log.info(" NullLinkProvider.cfg: " + ipCSV)
-                linkConfig.close()
-
-  
-                #write file for null device 
-                filename = "/onos/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
-                deviceConfig = open(homeDir + filename,'w+')    
+            main.log.step("\tSTARTING TEST")
+            main.log.step("\tLOADING FROM SERVERS:  \t" + str(clusterCount) ) 
+            main.log.step("\tNEIGHBORS:\t" + n )  
+            main.log.info("=============================================================")
+            main.log.info("=============================================================")
+            #write file to configure nil link
+            ipCSV = ""
+            for i in range (1, int(maxNodes) + 1):
+                tempstr = "ip" + str(i)
+                ipCSV += main.params[ 'CTRL' ][ tempstr ] 
+                if i < int(maxNodes):
+                    ipCSV +=","
             
-                serversToRun = max(int(servers), (int(n) + 1))
+            filename = "/onos/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
+            linkConfig = open(homeDir + filename,'w+')
+            linkConfig.write("# eventRate = 2000\n")
+            linkConfig.write("neighbors = "  + ipCSV)
+            main.log.info(" NullLinkProvider.cfg: " + ipCSV)
+            linkConfig.close()
+            
+            #config null device
+            cellIp = [] 
+            for node in range(1, clusterCount + 1): 
+                cellIp.append(ONOSIp[node])
+            main.log.info(" NullDeviceProvider.cfg: " + str(cellIp))
+            main.ONOSbench.configNullDev(cellIp, switches) 
+            
+            #devide flows
+            flows = int(main.params[ 'TEST' ][ 'flows' ])
+            main.log.info("Flow Target  = " + str(flows))
 
-                switchDistribution = [(switches/int(serversToRun))]*int(serversToRun) 
-                main.log.info("Switch distribution init: " + str(switchDistribution))
-                remainder = switches % int(serversToRun) 
-                for r in range(0, remainder): 
-                    switchDistribution[r] += 1 
-                main.log.info("Switch distribution: " + str(switchDistribution))
-                    
-                deviceSettings = ""
-                for i in range(0, serversToRun):
-                    deviceSettings += (ONOSIp[i+1] + ":" + str(switchDistribution[i]))
-                    if i < int(serversToRun)-1: 
-                        deviceSettings +=","         
+            flows = (flows *max(int(n)+1,int(servers)))/((int(n) + 1)*int(servers)*(switches))
 
-                deviceConfig.write("devConfigs = "  + deviceSettings)
-                main.log.info(" NullDeviceProvider.cfg: " + deviceSettings)
-                deviceConfig.close() 
+            main.log.info("Flows per switch = " + str(flows))
+            #main.log.info("Total flows = " + str(switches * flows))
 
-                main.log.info("Creating cell file for this step")
-                exec "a = main.ONOSbench.createCellFile"
-                cellIp = []
-                for node in range (1, serversToRun + 1):
-                    cellIp.append(ONOSIp[node]) 
-                main.log.info("Cells are: " + str(cellIp) )
-                a(BENCHIp,cellName,MN1Ip,str(Features), *cellIp)
-                main.step( "Applying cell file to environment for this step" )
-                cellApplyResult = main.ONOSbench.setCell( cellName )
-                main.step( "verify cells for this step" )
-                verifyCellResult = main.ONOSbench.verifyCell()
+            #build list of servers in "$OC1, $OC2...." format
+            serverEnvVars = ""
+            for i in range (1,int(servers)+1):
+                serverEnvVars += ("-s " + ONOSIp[i] + " ")
+            
+            data = [[""]*int(servers)]*int(sampleSize)
+            maxes = [""]*int(sampleSize)
+
+            for test in range(0, (warmUp + sampleSize)): 
+                flowCMD = "python3 " + homeDir + "/onos/tools/test/bin/"
+                flowCMD += testCMD[0] + " " + str(flows) + " " + testCMD[1] 
+                flowCMD += " " + str(n) + " " + str(serverEnvVars)
+                print("\n")                    
+                main.log.info("COMMAND: " + flowCMD)
+                main.log.info("Executing command") 
                 
-                #devide flows
-                flows = int(main.params[ 'TEST' ][ 'flows' ])
-                main.log.info("Flow Target  = " + str(flows))
-
-                flows = (flows *max(int(n)+1,int(servers)))/((int(n) + 1)*int(servers)*(switches))
-
-                main.log.info("Flows per switch = " + str(flows))
-                #main.log.info("Total flows = " + str(switches * flows))
-
-                
-                #kill off all onos processes
-                main.log.step("Safety check, killing all ONOS processes")
-                for node in range(1, int(maxNodes) + 1):
-                    main.ONOSbench.onosDie(ONOSIp[node]) 
-                  
-                #Uninstall everywhere
-                main.log.step( "Cleaning Enviornment..." )
-                for i in range(1, int(maxNodes) + 1):
-                    main.log.info(" Uninstalling ONOS " + str(i) )
-                    main.ONOSbench.onosUninstall( ONOSIp[i] )
-
-                #package
-                main.log.step( "Repackaging onos to reflect config file changes" )
-                main.ONOSbench.onosPackage()
-                
-                # install on relevant nodes
-                startNodes = max(int(n), serversToRun)
-                main.log.step( "Reinstalling ONOS on relevant nodes (1-" + str(startNodes) + ")" )          
-                for s in range(1, startNodes + 1): 
-                    main.ONOSbench.onosInstall( node=ONOSIp[s])    
-                    exec "a = main.ONOS%scli.startOnosCli" %str(s)
-                    a(ONOSIp[s])
-
-                main.log.info("sleeping 30 second waiting for null provider bundle...")
-                time.sleep(30)
-
-                #build list of servers in "$OC1, $OC2...." format
-                serverEnvVars = ""
-                for i in range (1,int(servers)+1):
-                    serverEnvVars += ("-s " + ONOSIp[i] + " ")
-                
-                data = [[""]*int(servers)]*int(sampleSize)
-                maxes = [""]*int(sampleSize)
-
-                for test in range(0, (warmUp + sampleSize)): 
-                    flowCMD = "python3 " + homeDir + "/onos/tools/test/bin/"
-                    flowCMD += testCMD[0] + " " + str(flows) + " " + testCMD[1] 
-                    flowCMD += " " + str(n) + " " + str(serverEnvVars)
-                    print("\n")                    
-                    main.log.info("COMMAND: " + flowCMD)
-                    main.log.info("Executing command") 
+                for i in range(0,15):
                     main.ONOSbench.handle.sendline(flowCMD)
-                    result = []
-                    for s in range(0, int(servers)):
-                        result.append("q")
-                    
-                    for s in range(0, int(servers)):
-                        main.ONOSbench.handle.expect("ms")
-                        rawResult = ((main.ONOSbench.handle.before).splitlines())
+                    time.sleep(1)
+                    main.ONOSbench.handle.expect(":~")
+                    rawResult = main.ONOSbench.handle.before
+                    if " -> " in rawResult:
+                        break
 
-                        rawResult = ((rawResult.pop()).split(" "))
-                        main.log.info("Debug: rawResult: " + str(rawResult))
+                result = [""]*(clusterCount)
+                rawResult = rawResult.splitlines()
+                print(rawResult)
+                for node in range(1, clusterCount + 1):        
+                    for line in rawResult
+                        if ONOSIp[node] in line and " -> " in line:
+                            myLine = line.split(" ")
+                            for word in myLine:
+                                if "ms" in word:
+                                    result[node-1] = int(word.replace("ms",""))
+                                    main.log.info("Parsed result: " + str(result[node-1]))
+                                    break
+                            break
 
-                        myresult = int(rawResult[2])
-                        main.log.info("Result: " + str(myresult))                    
-                            
-                        myIp = rawResult[0]
-                        main.log.info("myIp: " + myIp)
+                if test >= warmUp:
+                    for i in result: 
+                        if i == "": 
+                            main.log.error("Missing data point, critical failure incoming")
 
-                        serverIndex = int(ONOSIp.index(myIp))
-                        main.log.info("server index = " + str(serverIndex))
-                            
-                        result[serverIndex - 1] = myresult
-                    
-                    if test >= warmUp:
-                        maxes[test-warmUp] = max(result)
-                        main.log.info("Data collection iteration: " + str(test-warmUp) + " of " + str(sampleSize))
-                        main.log.info("Throughput time: " + str(maxes[test-warmUp]) + "(ms)")                
+                    print result
+                    maxes[test-warmUp] = max(result)
+                    main.log.info("Data collection iteration: " + str(test-warmUp) + " of " + str(sampleSize))
+                    main.log.info("Throughput time: " + str(maxes[test-warmUp]) + "(ms)")                
 
-                    if test >= warmUp:
-                        data[test-warmUp] = result
+                if test >= warmUp:
+                    data[test-warmUp] = result
 
-                    # wait for flows = 0 
-                    removedFlows = False
-                    repeat = 0
-                    time.sleep(3)
-                    while removedFlows == False & repeat <= 10:
-                        main.ONOSbench.handle.sendline("onos $OC1 summary| cut -d ' ' -f6")
-                        main.ONOSbench.handle.expect("~")
-                        before = main.ONOSbench.handle.before
-                        parseTest = before.splitlines()
-                        flowsummary = ""
-                        for line in parseTest:
-                            if "flow" in str(line):
-                                flowsummary = line 
-                                break
-                        currentflow = ""
-                        for word in flowsummary.split(" "): 
-                            if "flow" in str(word):
-                                currentflow = str(word)
-                        currentflow = currentflow.replace(",","")
-                        currentflow = currentflow.replace("\n","")
-                        main.log.info(currentflow)
+                # wait for flows = 0 
+                removedFlows = False
+                repeat = 0
+                time.sleep(3)
+                while ( removedFlows == False and repeat <= 10 ):
+                    main.ONOSbench.handle.sendline("onos $OC1 summary| cut -d ' ' -f6")
+                    main.ONOSbench.handle.expect("~")
+                    before = main.ONOSbench.handle.before
+                    parseTest = before.splitlines()
+                    flowsummary = ""
+                    for line in parseTest:
+                        if "flow" in str(line):
+                            flowsummary = line 
+                            break
+                    currentflow = ""
+                    for word in flowsummary.split(" "): 
+                        if "flow" in str(word):
+                            currentflow = str(word)
+                    currentflow = currentflow.replace(",","")
+                    currentflow = currentflow.replace("\n","")
+                    #main.log.info(currentflow)
 
-                        zeroFlow = "flows=0"                
-                        if zeroFlow in before:
-                            removedFlows = True 
-                            main.log.info("\t Wait 5 sec of cool down...")
-                            time.sleep(5)
-
+                    zeroFlow = "flows=0"                
+                    if zeroFlow in before:
+                        removedFlows = True 
+                        main.log.info("\t Wait 5 sec of cool down...")
                         time.sleep(5)
-                        repeat +=1
-         
-                main.log.info("raw data: " + str(data))
-                main.log.info("maxes:" + str(maxes))
 
-                
-                # report data
-                print("")
-                main.log.info("\t Results (measurments are in milliseconds)")
-                print("")
+                    time.sleep(5)
+                    repeat +=1
+     
+            main.log.info("raw data: " + str(data))
+            main.log.info("maxes:" + str(maxes))
 
-                nodeString = ""
-                for i in range(1, int(servers) + 1):
-                    nodeString += ("\tNode " + str(i)) 
-                 
-                for test in range(0, sampleSize ):
-                    main.log.info("\t Test iteration " + str(test + 1) )
-                    main.log.info("\t------------------")
-                    main.log.info(nodeString)       
-                    resultString = ""
+            
+            # report data
+            print("")
+            main.log.info("\t Results (measurments are in milliseconds)")
+            print("")
 
-                    for i in range(0, int(servers) ):
-                        resultString += ("\t" + str(data[test][i]) ) 
-                    main.log.info(resultString)
+            nodeString = ""
+            for i in range(1, int(servers) + 1):
+                nodeString += ("\tNode " + str(i)) 
+             
+            for test in range(0, sampleSize ):
+                main.log.info("\t Test iteration " + str(test + 1) )
+                main.log.info("\t------------------")
+                main.log.info(nodeString)       
+                resultString = ""
 
-                    print("\n")
+                for i in range(0, int(servers) ):
+                    resultString += ("\t" + str(data[test][i]) ) 
+                main.log.info(resultString)
 
-                avgOfMaxes = numpy.mean(maxes)
-                main.log.info("Average of max value from each test iteration: " + str(avgOfMaxes))
+                print("\n")
 
-                stdOfMaxes = numpy.std(maxes)
-                main.log.info("Standard Deviation of max values: " + str(stdOfMaxes))       
-                print("\n\n")
+            avgOfMaxes = numpy.mean(maxes)
+            main.log.info("Average of max value from each test iteration: " + str(avgOfMaxes))
 
-                avgTP = int(main.params[ 'TEST' ][ 'flows' ])  / avgOfMaxes #result in kflows/second
-                
-                tp = []
-                for i in maxes: 
-                    tp.append((int(main.params[ 'TEST' ][ 'flows' ]) / i ))
+            stdOfMaxes = numpy.std(maxes)
+            main.log.info("Standard Deviation of max values: " + str(stdOfMaxes))       
+            print("\n\n")
 
-                stdTP = numpy.std(tp)
+            avgTP = int(main.params[ 'TEST' ][ 'flows' ])  / avgOfMaxes #result in kflows/second
+            
+            tp = []
+            for i in maxes: 
+                tp.append((int(main.params[ 'TEST' ][ 'flows' ]) / i ))
 
-                main.log.info("Average thoughput:  " + str(avgTP) + " Kflows/second" )
-                main.log.info("Standard deviation of throughput: " + str(stdTP) + " Kflows/second") 
+            stdTP = numpy.std(tp)
 
-                resultsLog = open(logFileName,"a")
-                resultsLog.write(str(main.params[ 'TEST' ][ 'flows' ]) + "," + n + "," + str(servers) + str(switches) + "," + str(warmUp))
-                resultsLog.write("," +str(sampleSize) + "," + str(avgTP) + "," + str(stdTP) + "\n")
-                resultsLog.close()
- 
-                    
+            main.log.info("Average thoughput:  " + str(avgTP) + " Kflows/second" )
+            main.log.info("Standard deviation of throughput: " + str(stdTP) + " Kflows/second") 
+
+            resultsLog = open(logFileName,"a")
+            resultsLog.write(str(main.params[ 'TEST' ][ 'flows' ]) + "," + n + "," + str(servers) + str(switches) + "," + str(warmUp))
+            resultsLog.write("," +str(sampleSize) + "," + str(avgTP) + "," + str(stdTP) + "\n")
+            resultsLog.close()
+
+            
diff --git a/TestON/tests/flowTP1g/flowTP1g.topo b/TestON/tests/flowTP1g/flowTP1g.topo
index 0e45e0f..30a1467 100644
--- a/TestON/tests/flowTP1g/flowTP1g.topo
+++ b/TestON/tests/flowTP1g/flowTP1g.topo
@@ -3,7 +3,7 @@
     <COMPONENT>
 
         <ONOSbench>
-            <host>10.254.1.200</host>
+            <host>10.128.5.55</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosDriver</type>
@@ -12,7 +12,7 @@
         </ONOSbench>
 
         <ONOS1cli>
-            <host>10.254.1.200</host>
+            <host>10.128.5.55</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -21,7 +21,7 @@
         </ONOS1cli>
 
         <ONOS2cli>
-            <host>10.254.1.200</host>
+            <host>10.128.5.55</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -30,7 +30,7 @@
         </ONOS2cli>
 
         <ONOS3cli>
-            <host>10.254.1.200</host>
+            <host>10.128.5.55</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -39,7 +39,7 @@
         </ONOS3cli>
 
         <ONOS4cli>
-            <host>10.254.1.200</host>
+            <host>10.128.5.55</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -48,7 +48,7 @@
         </ONOS4cli>
 
         <ONOS5cli>
-            <host>10.254.1.200</host>
+            <host>10.128.5.55</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -57,7 +57,7 @@
         </ONOS5cli>
 
         <ONOS6cli>
-            <host>10.254.1.200</host>
+            <host>10.128.5.55</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -66,7 +66,7 @@
         </ONOS6cli>
 
         <ONOS7cli>
-            <host>10.254.1.200</host>
+            <host>10.128.5.55</host>
             <user>admin</user>
             <password>onos_test</password>
             <type>OnosCliDriver</type>
@@ -75,7 +75,7 @@
         </ONOS7cli>
 
         <ONOS1>
-            <host>10.254.1.201</host>
+            <host>10.128.5.51</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -84,7 +84,7 @@
         </ONOS1>
 
         <ONOS2>
-            <host>10.254.1.202</host>
+            <host>10.128.5.52</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -93,7 +93,7 @@
         </ONOS2>
 
         <ONOS3>
-            <host>10.254.1.203</host>
+            <host>10.128.5.53</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -102,7 +102,7 @@
         </ONOS3>
 
         <ONOS4>
-            <host>10.254.1.204</host>
+            <host>10.128.5.54</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -112,7 +112,7 @@
 
     
         <ONOS5>
-            <host>10.254.1.205</host>
+            <host>10.128.5.65</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -121,7 +121,7 @@
         </ONOS5>
 
         <ONOS6>
-            <host>10.254.1.206</host>
+            <host>10.128.5.66</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
@@ -130,7 +130,7 @@
         </ONOS6>
 
         <ONOS7>
-            <host>10.254.1.207</host>
+            <host>10.128.5.67</host>
             <user>sdn</user>
             <password>rocks</password>
             <type>OnosDriver</type>
