diff --git a/TestON/tests/scaleONOS7nodes/scaleONOS7nodes.py b/TestON/tests/scaleONOS7nodes/scaleONOS7nodes.py
index 57c0ada..475f931 100644
--- a/TestON/tests/scaleONOS7nodes/scaleONOS7nodes.py
+++ b/TestON/tests/scaleONOS7nodes/scaleONOS7nodes.py
@@ -44,7 +44,7 @@
         
         time.sleep(5)
         
-        
+        """        
         main.RamCloud1.del_db()
         main.RamCloud2.del_db()
         main.RamCloud3.del_db()
@@ -53,7 +53,7 @@
         time.sleep(5)
         #main.log.report("Pulling latest code from github to all nodes")
           
-        """
+        
         for i in range(2):
             uptodate = main.ONOS1.git_pull()
             main.ONOS2.git_pull()
@@ -87,7 +87,7 @@
        # main.ONOS3.start_all()
        # main.ONOS4.start_all()
 
-        """
+        
         main.RamCloud1.start_coor()
         main.RamCloud1.start_serv()
         main.RamCloud2.start_serv()
@@ -98,10 +98,10 @@
         main.ONOS3.start()
         #main.ONOS4.start()
         time.sleep(5)
-        
-        #main.ONOS1.handle.sendline("./onos.sh core start")
-        #main.ONOS1.handle.sendline("./onos.sh core start")
-        #main.ONOS1.handle.sendline("./onos.sh core start")
+        """
+        main.ONOS1.handle.sendline("./onos.sh core start")
+        main.ONOS2.handle.sendline("./onos.sh core start")
+        main.ONOS3.handle.sendline("./onos.sh core start")
 
         main.ONOS1.start_rest()
         main.ONOS2.start_rest()
@@ -110,11 +110,11 @@
         if test == main.FALSE:
             main.ONOS1.start_rest()
         main.ONOS1.get_version()
-        main.log.report("Startup check Zookeeper1, RamCloud1, and ONOS1 connections")
+        main.log.report("Startup check Zookeeper1, and ONOS1 connections")
         main.step("Testing startup Zookeeper")   
         data =  main.Zookeeper1.isup() and main.Zookeeper2.isup() and main.Zookeeper3.isup()
         utilities.assert_equals(expect=main.TRUE,actual=data,onpass="Zookeeper is up!",onfail="Zookeeper is down...")
-        
+        """
         main.step("Testing startup RamCloud")   
         data =  main.RamCloud1.status_serv() and main.RamCloud2.status_serv() and main.RamCloud3.status_serv() #and main.RamCloud4.status_serv()
         if data == main.FALSE:
@@ -136,7 +136,7 @@
 
         
         utilities.assert_equals(expect=main.TRUE,actual=data,onpass="RamCloud is up!",onfail="RamCloud is down...")
-        
+        """
         main.step("Testing startup ONOS")   
         data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() #and main.ONOS4.isup()
         for i in range(3):
@@ -231,79 +231,8 @@
         print tpavg3n
         main.log.report("Topology Event Throughput for 3-node ONOS cluster = " +str(tpavg3n) + " Events/sec")
         main.Mininet2.handle.expect("\$", timeout=900)
-       # main.Mininet2.handle.sendline("sudo mn -c")
-        #main.Mininet2.handle.expect("\$")
-       # main.Mininet2.handle.expect("\$", timeout=900)
         time.sleep(180)
         
-
-    def CASE32(self,main):
-        ip1 = main.params['CTRL']['ip1']
-        ip2 = main.params['CTRL']['ip2']
-        ip3 = main.params['CTRL']['ip3']
-        import time
-        rate2 = main.params['RATE2']
-        run_dur = main.params['RUN_DUR']
-        loop = int(main.params['loop'])
-        sleep_init = int(main.params['sleep_init'])
-        sleep_t = int(main.params['sleep_t'])
-        port = main.params['port']
-        switches_num = main.params['switches_num']
-        main.case("Starting SB load on 3 nodes from mininet with " + rate2 +"  added/removed/s for " + run_dur)
-        #main.Mininet2.handle.sendline("./loadgen_SB.sh startload \"" + ip1 + " " + ip2 + " " + ip3 + "\"" + " " + switches_num + " " + port + " " + rate2 + " " + run_dur +  "  \"11\"")
-        main.Mininet2.handle.sendline("sudo ./loadgen_SB.py -u \"" + ip1 + " " + ip2 + " " + ip3 + "\"" + " -s " + switches_num + " -p " + port + " -a " + rate2 + " -d " + rate2 + " -l " + run_dur)
-       #main.Mininet2.handle.sendline("./loadgen_SB.sh startload \"10.128.10.1\" 100 50 1200 \"11\"")
-        main.Mininet2.handle.expect("Starting SB load....", timeout=900 )
-        time.sleep(sleep_init )
-        import json
-        time.sleep(sleep_init)
-        open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale3nodesrate2", 'w').close()
-        url1 = "http://10.128.10.1:8080/wm/onos/metrics"
-        url2 = "http://10.128.10.2:8080/wm/onos/metrics"
-        url3 = "http://10.128.10.3:8080/wm/onos/metrics"
-        f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale3nodesrate2", "a")
-        for i in range(int (loop)):
-            j1 = main.ONOS1.get_json(url1)
-            j2 = main.ONOS1.get_json(url2)
-            j3 = main.ONOS1.get_json(url3)
-            json_str = []
-            json_str.append(0)
-            json_str.append(j1)
-            json_str.append(j2)
-            json_str.append(j3)
-            if json_str[1] != "" and json_str[2] != "" and json_str[3] != "":
-                # write_str = str(json_str["meters"][4]["meter"][2])
-                #print str(json_str["meters"][4])
-                #f.write(str(json_str["meters"][4]))
-                #f.write('\n')
-                #time.sleep(3)
-                for j in range(1,4):
-                    f.write("ONOS" + str(j) + "\n")
-                    f.write(str(json_str[j]["meters"][4]['meter']['count']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m1_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m5_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m15_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['mean_rate']))
-                    f.write('\n')
-                
-                f.write('\n')
-                f.write('\n')
-                
-                f.write("--------------------------------------------------------------------------------- \n") 
-                time.sleep(sleep_t)
-        f.close() 
-        #time.sleep(10)
-        main.Mininet2.handle.expect("\$", timeout=900)
-        time.sleep(180)
-       # main.Mininet2.handle.sendline("sudo mn -c")
-        #time.sleep(5)
-       # main.Mininet2.handle.expect("\$", timeout=900)
-
-
     def CASE33(self,main):
         
         ip1 = main.params['CTRL']['ip1']
@@ -311,17 +240,15 @@
         ip3 = main.params['CTRL']['ip3']
         import time
         import json
-        int_num = main.params['int_num']
+        int_num = int(main.params['int_num'])
         addrate = main.params['addrate']
         NBdur = main.params['NBdur']
         NBsleep = int(main.params['NBsleep'])
         NBsleep_init = int(main.params['NBsleep_init'])
         NBloop = int(main.params['NBloop'])
-        
-        main.log.report("Starting NB Throughput test: loading 3-node ONOS cluster with " + int_num + " Intents/s" )
+        int_r = 3 * int_num
+        main.log.report("Starting NB Throughput test: loading 3-node ONOS cluster with " + str(int_num) + " Intents/s on each node" )
         main.Mininet4.handle.expect("\$")
-        #main.Mininet2.handle.sendline("sudo mn --custom topo-intentTPtest.py --topo mytopo --mac --arp")
-        #main.Mininet2.handle.expect("mininet>" , timeout=400)
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s1 tcp:10.128.10.1:6633")
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s2 tcp:10.128.10.1:6633")
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s3 tcp:10.128.10.2:6633")
@@ -333,10 +260,9 @@
         main.ONOS3.handle.sendline("cd ~admin/suibin-dev")
         main.ONOS3.handle.expect("\$")
 
-        main.ONOS3.handle.sendline("./loadgen_NB.py -n 3 -u \"10.128.10.1:8080 10.128.10.2:8080 10.128.10.3:8080 \" -i " + int_num + " -a " + addrate + " -l " + NBdur + " -p 20")
+        main.ONOS3.handle.sendline("./loadgen_NB.py -n 3 -u \"10.128.10.1:8080 10.128.10.2:8080 10.128.10.3:8080 \" -i " + str(int_r) + " -a " + addrate + " -l " + NBdur + " -p 20")
         main.ONOS3.handle.expect("Pause between add and delete:", timeout=900)
         time.sleep(NBsleep_init)
-        #time.sleep(60)
         import json
         nbtpval = 0.0
         global nbtpavg3n
@@ -347,7 +273,6 @@
         url2 = "http://10.128.10.2:8080/wm/onos/metrics"
         url3 = "http://10.128.10.3:8080/wm/onos/metrics"
         f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/NBscale3nodesrate1", "a")
-        #time.sleep(10)
         for i in range(NBloop):
             j1 = main.ONOS1.get_json(url1)
             j2 = main.ONOS1.get_json(url2)
@@ -415,22 +340,19 @@
             
         main.Zookeeper4.start()
         time.sleep(5)
-        
+        """ 
         main.RamCloud4.del_db()
         time.sleep(3)
         main.RamCloud4.start_serv()
         time.sleep(3)
+        """
         main.ONOS4.start()
         main.ONOS4.start_rest()
         time.sleep(5)
         data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup()
         for i in range(3):
             if data == main.FALSE: 
-                #main.log.report("Something is funny... restarting ONOS")
-                #main.ONOS1.stop()
                 time.sleep(3)
-                #main.ONOS1.start()
-                #time.sleep(5) 
                 data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup()
             else:
                 break
@@ -442,29 +364,24 @@
         main.log.report("Scale-up ONOS to 5-nodes")
         main.case("Starting ONOS scale-up/down to 5 nodes ")
         import time
-       # main.RamCloud4.start_serv()
         main.ONOS6.handle.sendline("./onos.sh core stop")
         main.ONOS7.handle.sendline("./onos.sh core stop")
-        #pdata = main.ONOS5.isup()
     
         main.Zookeeper5.start()
         time.sleep(5)
-        
+        """
         main.RamCloud5.del_db()
         time.sleep(3)
         main.RamCloud5.start_serv()
         time.sleep(3)
+        """
         main.ONOS5.start()
         main.ONOS5.start_rest()
         time.sleep(5)
         data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup() and main.ONOS5.isup()
         for i in range(3):
             if data == main.FALSE: 
-                #main.log.report("Something is funny... restarting ONOS")
-                #main.ONOS1.stop()
                 time.sleep(3)
-                #main.ONOS1.start()
-                #time.sleep(5) 
                 data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup() and main.ONOS5.isup() 
             else:
                 break
@@ -475,28 +392,23 @@
         main.log.report("Scale-up ONOS to 6-nodes")
         main.case("Starting ONOS scale-up/down to 6 nodes ")
         import time
-       # main.RamCloud4.start_serv()
         main.ONOS7.handle.sendline("./onos.sh core stop")
-        #pdata = main.ONOS6.isup()
 
         main.Zookeeper6.start()
         time.sleep(5)
-        
+        """
         main.RamCloud6.del_db()
         time.sleep(3)
         main.RamCloud6.start_serv()
         time.sleep(3)
+        """
         main.ONOS6.start()
         main.ONOS6.start_rest()
         time.sleep(5)
         data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup() and main.ONOS5.isup() and main.ONOS6.isup()
         for i in range(3):
             if data == main.FALSE: 
-                #main.log.report("Something is funny... restarting ONOS")
-                #main.ONOS1.stop()
                 time.sleep(3)
-                #main.ONOS1.start()
-                #time.sleep(5) 
                 data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup() and main.ONOS5.isup() and main.ONOS6.isup()
             else:
                 break
@@ -507,27 +419,22 @@
         main.log.report("Scale-up ONOS to 7-nodes")
         main.case("Starting ONOS scale-up/down to 7 nodes ")
         import time
-       # main.RamCloud4.start_serv()
-        #pdata = main.ONOS7.isup()
     
         main.Zookeeper7.start()
         time.sleep(5)
-        
+        """
         main.RamCloud7.del_db()            
         time.sleep(3)
         main.RamCloud7.start_serv()
         time.sleep(3)
+        """
         main.ONOS7.start()
         main.ONOS7.start_rest()
         time.sleep(5)
         data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup() and main.ONOS5.isup() and main.ONOS6.isup() and main.ONOS7.isup()
         for i in range(3):
             if data == main.FALSE: 
-                #main.log.report("Something is funny... restarting ONOS")
-                #main.ONOS1.stop()
                 time.sleep(3)
-                #main.ONOS1.start()
-                #time.sleep(5) 
                 data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup() and main.ONOS5.isup() and main.ONOS6.isup() and main.ONOS7.isup()
             else:
                 break
@@ -552,7 +459,6 @@
         sleep_init = int(main.params['sleep_init'])
         sleep_t =int( main.params['sleep_t'])
         main.case("Starting SB load on 4 nodes from mininet with " + rate1 +"  added/removed/s for " + run_dur)
-        #main.Mininet2.handle.sendline("./loadgen_SB.sh startload \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 + "\"" + " " + switches_num + " " + port + " " + rate1 + " " + run_dur +  "  \"11\"")
         main.Mininet2.handle.sendline("sudo ./loadgen_SB.py -u \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 +  "\"" + " -s " + switches_num + " -p " + port + " -a " + rate1 + " -d " + rate1 + " -l " + run_dur)
         main.Mininet2.handle.expect("Starting SB load....", timeout=900)
         import time
@@ -569,7 +475,6 @@
         tpavg4n = 0.0
 
         f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale4nodesrate1", "a")
-        #time.sleep(10)
         for i in range(int (loop)):
             j1 = main.ONOS2.get_json(url1)
             j2 = main.ONOS2.get_json(url2)
@@ -582,11 +487,6 @@
             json_str.append(j3)
             json_str.append(j4)
             if json_str[1] != "" and json_str[2] != "" and json_str[3] != "" and json_str[4] != "":
-                # write_str = str(json_str["meters"][4]["meter"][2])
-                #print str(json_str["meters"][4])
-                #f.write(str(json_str["meters"][4]))
-                #f.write('\n')
-                #time.sleep(3)
                 for j in range(1,5):
                     f.write("ONOS" + str(j) + "\n")
                     f.write(str(json_str[j]["meters"][4]['meter']['count']))
@@ -601,7 +501,6 @@
                     f.write('\n')
                     if j == 3:
                         tpval += float(json_str[j]["meters"][4]['meter']['m1_rate']) 
-                       # print tpval
                 
                 f.write('\n')
                 f.write('\n')
@@ -609,86 +508,16 @@
                 f.write("--------------------------------------------------------------------------------- \n") 
                 time.sleep(sleep_t)
         f.close() 
-       # print tpval
         print("\n")
         tpavg4n = round(tpval)/loop
         print tpavg4n
         main.log.report("Topology Event Throughput for 4-node ONOS cluster = " + str(tpavg4n) + " Events/sec")
         
-        #main.Mininet2.handle.expect("\$", timeout=900)
-        #main.Mininet2.handle.sendline("sudo mn -c")
-        #main.Mininet2.handle.expect("\$")
         time.sleep(5)
         main.Mininet2.handle.expect("\$", timeout=900)
         time.sleep(180)
         
 
-    def CASE42(self,main):
-        
-        ip1 = main.params['CTRL']['ip1']
-        ip2 = main.params['CTRL']['ip2']
-        ip3 = main.params['CTRL']['ip3']
-        ip4 = main.params['CTRL']['ip4']
-        
-        import time
-        import json
-        rate2 = main.params['RATE2']
-        run_dur = main.params['RUN_DUR']
-        loop = int(main.params['loop'])
-        sleep_init = int(main.params['sleep_init'])
-        sleep_t = int(main.params['sleep_t'])
-        switches_num = main.params['switches_num']
-        port = main.params['port']
-        main.case("Starting SB load on 4 nodes from mininet with " + rate2 +"  added/removed/s for " + run_dur)
-        #main.Mininet2.handle.sendline("./loadgen_SB.sh startload \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 +  "\"" + " " + switches_num + " " + port +  " " + rate2 + " " + run_dur +  "  \"11\"")
-        main.Mininet2.handle.sendline("sudo ./loadgen_SB.py -u \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 +  "\"" + " -s " + switches_num + " -p " + port + " -a " + rate2 + " -d " + rate2 + " -l " + run_dur)
-        main.Mininet2.handle.expect("Starting SB load....", timeout=900 )
-        time.sleep(sleep_init)
-        open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale4nodesrate2", 'w').close()
-        url1 = "http://10.128.10.1:8080/wm/onos/metrics"
-        url2 = "http://10.128.10.2:8080/wm/onos/metrics"
-        url3 = "http://10.128.10.3:8080/wm/onos/metrics"
-        url4 = "http://10.128.10.4:8080/wm/onos/metrics"
-        f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale4nodesrate2", "a")
-        #time.sleep(10)
-        for i in range(int (loop)):
-            j1 = main.ONOS2.get_json(url1)
-            j2 = main.ONOS2.get_json(url2)
-            j3 = main.ONOS2.get_json(url3)
-            j4 = main.ONOS2.get_json(url4)
-            json_str = []
-            json_str.append(0)
-            json_str.append(j1)
-            json_str.append(j2)
-            json_str.append(j3)
-            json_str.append(j4)
-            if json_str[1] != "" and json_str[2] != "" and json_str[3] != "" and json_str[4] != "":
-                # write_str = str(json_str["meters"][4]["meter"][2])
-                #print str(json_str["meters"][4])
-                #f.write(str(json_str["meters"][4]))
-                #f.write('\n')
-                #time.sleep(3)
-                for j in range(1,5):
-                    f.write("ONOS" + str(j) + "\n")
-                    f.write(str(json_str[j]["meters"][4]['meter']['count']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m1_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m5_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m15_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['mean_rate']))
-                    f.write('\n')
-                
-                f.write('\n')
-                f.write('\n')
-                
-                f.write("--------------------------------------------------------------------------------- \n") 
-                time.sleep(sleep_t)
-        f.close() 
-        time.sleep(180)
-
     def CASE43(self,main):
         
         main.case("Starting NB Throughput test after scaling up to 4 onos nodes")
@@ -699,20 +528,18 @@
 
         import time
         import json
-        int_num = main.params['int_num']
+        int_num = int(main.params['int_num'])
         addrate = main.params['addrate']
         NBdur = main.params['NBdur']
         NBsleep = int(main.params['NBsleep'])
         NBsleep_init = int(main.params['NBsleep_init'])
         NBloop = int(main.params['NBloop'])
         nbtpval = 0.0
-        main.log.report("Starting NB Throughput test: loading 4-node ONOS cluster with " + int_num + " Intents/s" )
+        main.log.report("Starting NB Throughput test: loading 4-node ONOS cluster with " +str(int_num) + " Intents/s on each node" )
         global nbtpavg4n
         nbtpavg4n = 0.0
-
+        int_r = 4 * int_num
         main.Mininet4.handle.expect("\$")
-        #main.Mininet2.handle.sendline("sudo mn --custom topo-intentTPtest.py --topo mytopo --mac --arp")
-        #main.Mininet2.handle.expect("mininet>" , timeout=400)
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s1 tcp:10.128.10.1:6633")
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s2 tcp:10.128.10.2:6633")
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s3 tcp:10.128.10.3:6633")
@@ -724,7 +551,7 @@
         main.ONOS3.handle.sendline("cd ~admin/suibin-dev")
         main.ONOS3.handle.expect("\$")
 
-        main.ONOS3.handle.sendline("./loadgen_NB.py -n 4 -u \"10.128.10.1:8080 10.128.10.2:8080 10.128.10.3:8080 10.128.10.4:8080  \" -i " + int_num + " -a " + addrate + " -l " + NBdur + " -p 20")
+        main.ONOS3.handle.sendline("./loadgen_NB.py -n 4 -u \"10.128.10.1:8080 10.128.10.2:8080 10.128.10.3:8080 10.128.10.4:8080  \" -i " + str(int_r) + " -a " + addrate + " -l " + NBdur + " -p 20")
         main.ONOS3.handle.expect("Pause between add and delete:", timeout=900)
 
         
@@ -737,7 +564,6 @@
         url3 = "http://10.128.10.3:8080/wm/onos/metrics"
         url4 = "http://10.128.10.4:8080/wm/onos/metrics"
         f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/NBscale4nodesrate1", "a")
-        #time.sleep(10)
         for i in range(NBloop):
             j1 = main.ONOS2.get_json(url1)
             j2 = main.ONOS2.get_json(url2)
@@ -813,7 +639,6 @@
         sleep_init = int(main.params['sleep_init'])
         sleep_t =int( main.params['sleep_t'])
         main.case("Starting SB load on 5 nodes from mininet with " + rate1 +"  added/removed/s for " + run_dur)
-        #main.Mininet2.handle.sendline("./loadgen_SB.sh startload \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 + "\"" + " " + switches_num + " " + port + " " + rate1 + " " + run_dur +  "  \"11\"")
         main.Mininet2.handle.sendline("sudo ./loadgen_SB.py -u \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 + " " + ip5 + "\"" + " -s " + switches_num + " -p " + port + " -a " + rate1 + " -d " + rate1 + " -l " + run_dur)
         main.Mininet2.handle.expect("Starting SB load....", timeout=900)
         import time
@@ -831,7 +656,6 @@
         url5 = "http://10.128.10.5:8080/wm/onos/metrics"
 
         f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale5nodesrate1", "a")
-        #time.sleep(10)
         for i in range(int (loop)):
             j1 = main.ONOS2.get_json(url1)
             j2 = main.ONOS2.get_json(url2)
@@ -846,11 +670,6 @@
             json_str.append(j4)
             json_str.append(j5)
             if json_str[1] != "" and json_str[2] != "" and json_str[3] != "" and json_str[4] != "" and json_str[5] != "":
-                # write_str = str(json_str["meters"][4]["meter"][2])
-                #print str(json_str["meters"][4])
-                #f.write(str(json_str["meters"][4]))
-                #f.write('\n')
-                #time.sleep(3)
                 for j in range(1,6):
                     f.write("ONOS" + str(j) + "\n")
                     f.write(str(json_str[j]["meters"][4]['meter']['count']))
@@ -865,7 +684,6 @@
                     f.write('\n')
                     if j == 3:
                         tpval += float(json_str[j]["meters"][4]['meter']['m1_rate']) 
-                        #print tpval
                 
                 f.write('\n')
                 f.write('\n')
@@ -873,90 +691,16 @@
                 f.write("--------------------------------------------------------------------------------- \n") 
                 time.sleep(sleep_t)
         f.close() 
-        #print tpval
         print("\n")
         tpavg5n = round(tpval)/loop
         print tpavg5n
         
-        #main.Mininet2.handle.expect("\$", timeout=900)
-        #main.Mininet2.handle.sendline("sudo mn -c")
-        #main.Mininet2.handle.expect("\$")
         time.sleep(5)
         main.Mininet2.handle.expect("\$", timeout=900)
         time.sleep(180)
         main.log.report("Topology Event Throughput for 5-node ONOS cluster = " + str(tpavg5n) + " Events/sec")
         
 
-    def CASE52(self,main):
-        
-        ip1 = main.params['CTRL']['ip1']
-        ip2 = main.params['CTRL']['ip2']
-        ip3 = main.params['CTRL']['ip3']
-        ip4 = main.params['CTRL']['ip4']
-        ip5 = main.params['CTRL']['ip5']
-        
-        import time
-        import json
-        rate2 = main.params['RATE2']
-        run_dur = main.params['RUN_DUR']
-        loop = int(main.params['loop'])
-        sleep_t = int(main.params['sleep_t'])
-        sleep_init = int(main.params['sleep_init'])
-        switches_num = main.params['switches_num']
-        port = main.params['port']
-        main.case("Starting SB load on 4 nodes from mininet with " + rate2 +"  added/removed/s for " + run_dur)
-        #main.Mininet2.handle.sendline("./loadgen_SB.sh startload \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 +  "\"" + " " + switches_num + " " + port +  " " + rate2 + " " + run_dur +  "  \"11\"")
-        main.Mininet2.handle.sendline("sudo ./loadgen_SB.py -u \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 + " " + ip5 + "\"" + " -s " + switches_num + " -p " + port + " -a " + rate2 + " -d " + rate2 + " -l " + run_dur)
-        main.Mininet2.handle.expect("Starting SB load....", timeout=900 )
-        time.sleep(sleep_init)
-        open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale5nodesrate2", 'w').close()
-        url1 = "http://10.128.10.1:8080/wm/onos/metrics"
-        url2 = "http://10.128.10.2:8080/wm/onos/metrics"
-        url3 = "http://10.128.10.3:8080/wm/onos/metrics"
-        url4 = "http://10.128.10.4:8080/wm/onos/metrics"
-        url5 = "http://10.128.10.5:8080/wm/onos/metrics"
-        f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale5nodesrate2", "a")
-        #time.sleep(10)
-        for i in range(int (loop)):
-            j1 = main.ONOS2.get_json(url1)
-            j2 = main.ONOS2.get_json(url2)
-            j3 = main.ONOS2.get_json(url3)
-            j4 = main.ONOS2.get_json(url4)
-            j5 = main.ONOS2.get_json(url5)
-            json_str = []
-            json_str.append(0)
-            json_str.append(j1)
-            json_str.append(j2)
-            json_str.append(j3)
-            json_str.append(j4)
-            json_str.append(j5)
-            if json_str[1] != "" and json_str[2] != "" and json_str[3] != "" and json_str[4] != "" and json_str[4] != "":
-                # write_str = str(json_str["meters"][4]["meter"][2])
-                #print str(json_str["meters"][4])
-                #f.write(str(json_str["meters"][4]))
-                #f.write('\n')
-                #time.sleep(3)
-                for j in range(1,6):
-                    f.write("ONOS" + str(j) + "\n")
-                    f.write(str(json_str[j]["meters"][4]['meter']['count']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m1_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m5_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m15_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['mean_rate']))
-                    f.write('\n')
-                
-                f.write('\n')
-                f.write('\n')
-                
-                f.write("--------------------------------------------------------------------------------- \n") 
-                time.sleep(sleep_t)
-        f.close() 
-        time.sleep(180)
-
     def CASE53(self,main):
         
         main.case("Starting NB Throughput test after scaling up to 5 onos nodes")
@@ -967,20 +711,18 @@
 
         import time
         import json
-        int_num = main.params['int_num']
+        int_num = int(main.params['int_num'])
         addrate = main.params['addrate']
         NBdur = main.params['NBdur']
         NBsleep = int(main.params['NBsleep'])
         NBsleep_init = int(main.params['NBsleep_init'])
         NBloop = int(main.params['NBloop'])
         nbtpval = 0.0
-        main.log.report("Starting NB Throughput test: loading 5-node ONOS cluster with " + int_num + " Intents/s" )
+        main.log.report("Starting NB Throughput test: loading 5-node ONOS cluster with " + str(int_num) + " Intents/s on each node" )
         global nbtpavg5n
         nbtpavg5n = 0.0
-
+        int_r = 5 * int_num
         main.Mininet4.handle.expect("\$")
-        #main.Mininet2.handle.sendline("sudo mn --custom topo-intentTPtest.py --topo mytopo --mac --arp")
-        #main.Mininet2.handle.expect("mininet>" , timeout=400)
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s1 tcp:10.128.10.1:6633")
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s2 tcp:10.128.10.2:6633")
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s3 tcp:10.128.10.3:6633")
@@ -992,7 +734,7 @@
         main.ONOS3.handle.sendline("cd ~admin/suibin-dev")
         main.ONOS3.handle.expect("\$")
 
-        main.ONOS3.handle.sendline("./loadgen_NB.py -n 5 -u \"10.128.10.1:8080 10.128.10.2:8080 10.128.10.3:8080 10.128.10.4:8080 10.128.10.5:8080  \" -i " + int_num + " -a " + addrate + " -l " + NBdur + " -p 20")
+        main.ONOS3.handle.sendline("./loadgen_NB.py -n 5 -u \"10.128.10.1:8080 10.128.10.2:8080 10.128.10.3:8080 10.128.10.4:8080 10.128.10.5:8080  \" -i " + str(int_r) + " -a " + addrate + " -l " + NBdur + " -p 20")
         main.ONOS3.handle.expect("Pause between add and delete:", timeout=900)
 
         
@@ -1006,7 +748,6 @@
         url4 = "http://10.128.10.4:8080/wm/onos/metrics"
         url5 = "http://10.128.10.5:8080/wm/onos/metrics"
         f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/NBscale5nodesrate1", "a")
-        #time.sleep(10)
         for i in range(NBloop):
             j1 = main.ONOS2.get_json(url1)
             j2 = main.ONOS2.get_json(url2)
@@ -1086,7 +827,6 @@
         sleep_t =int( main.params['sleep_t'])
         sleep_init = int(main.params['sleep_init'])
         main.case("Starting SB load on 6 nodes from mininet with " + rate1 +"  added/removed/s for " + run_dur)
-        #main.Mininet2.handle.sendline("./loadgen_SB.sh startload \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 + "\"" + " " + switches_num + " " + port + " " + rate1 + " " + run_dur +  "  \"11\"")
         main.Mininet2.handle.sendline("sudo ./loadgen_SB.py -u \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 + " " + ip5 + " " + ip6 +  "\"" + " -s " + switches_num + " -p " + port + " -a " + rate1 + " -d " + rate1 + " -l " + run_dur)
         main.Mininet2.handle.expect("Starting SB load....", timeout=900)
         
@@ -1106,7 +846,6 @@
         url6 = "http://10.128.10.6:8080/wm/onos/metrics"
 
         f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale6nodesrate1", "a")
-        #time.sleep(10)
         for i in range(int (loop)):
             j1 = main.ONOS2.get_json(url1)
             j2 = main.ONOS2.get_json(url2)
@@ -1123,11 +862,6 @@
             json_str.append(j5)
             json_str.append(j6)
             if json_str[1] != "" and json_str[2] != "" and json_str[3] != "" and json_str[4] != "" and json_str[5] != "" and json_str[6] != "":
-                # write_str = str(json_str["meters"][4]["meter"][2])
-                #print str(json_str["meters"][4])
-                #f.write(str(json_str["meters"][4]))
-                #f.write('\n')
-                #time.sleep(3)
                 for j in range(1,7):
                     f.write("ONOS" + str(j) + "\n")
                     f.write(str(json_str[j]["meters"][4]['meter']['count']))
@@ -1142,7 +876,6 @@
                     f.write('\n')
                     if j == 3:
                         tpval += float(json_str[j]["meters"][4]['meter']['m1_rate']) 
-                        #print tpval
                 
                 f.write('\n')
                 f.write('\n')
@@ -1150,94 +883,16 @@
                 f.write("--------------------------------------------------------------------------------- \n") 
                 time.sleep(sleep_t)
         f.close() 
-        #print tpval
         print("\n")
         tpavg6n = round(tpval)/loop
         print tpavg6n
         
-        #main.Mininet2.handle.expect("\$", timeout=900)
-        #main.Mininet2.handle.sendline("sudo mn -c")
-        #main.Mininet2.handle.expect("\$")
         time.sleep(5)
         main.Mininet2.handle.expect("\$", timeout=900)
         time.sleep(180)
         main.log.report("Topology Event Throughput for 6-node ONOS cluster = " + str(tpavg6n) + " Events/sec")
         
 
-    def CASE62(self,main):
-        
-        ip1 = main.params['CTRL']['ip1']
-        ip2 = main.params['CTRL']['ip2']
-        ip3 = main.params['CTRL']['ip3']
-        ip4 = main.params['CTRL']['ip4']
-        ip5 = main.params['CTRL']['ip5']
-        ip6 = main.params['CTRL']['ip6']
-        
-        import time
-        import json
-        rate2 = main.params['RATE2']
-        run_dur = main.params['RUN_DUR']
-        loop = int(main.params['loop'])
-        sleep_t = int(main.params['sleep_t'])
-        switches_num = main.params['switches_num']
-        sleep_init = int(main.params['sleep_init'])
-        port = main.params['port']
-        main.case("Starting SB load on 4 nodes from mininet with " + rate2 +"  added/removed/s for " + run_dur)
-        #main.Mininet2.handle.sendline("./loadgen_SB.sh startload \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 +  "\"" + " " + switches_num + " " + port +  " " + rate2 + " " + run_dur +  "  \"11\"")
-        main.Mininet2.handle.sendline("sudo ./loadgen_SB.py -u \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 + " " + ip5 + " " + ip6 + "\"" + " -s " + switches_num + " -p " + port + " -a " + rate2 + " -d " + rate2 + " -l " + run_dur)
-        main.Mininet2.handle.expect("Starting SB load....", timeout=900 )
-        time.sleep(sleep_init)
-        open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale6nodesrate2", 'w').close()
-        url1 = "http://10.128.10.1:8080/wm/onos/metrics"
-        url2 = "http://10.128.10.2:8080/wm/onos/metrics"
-        url3 = "http://10.128.10.3:8080/wm/onos/metrics"
-        url4 = "http://10.128.10.4:8080/wm/onos/metrics"
-        url5 = "http://10.128.10.5:8080/wm/onos/metrics"
-        url6 = "http://10.128.10.6:8080/wm/onos/metrics"
-        f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale6nodesrate2", "a")
-        #time.sleep(10)
-        for i in range(int (loop)):
-            j1 = main.ONOS2.get_json(url1)
-            j2 = main.ONOS2.get_json(url2)
-            j3 = main.ONOS2.get_json(url3)
-            j4 = main.ONOS2.get_json(url4)
-            j5 = main.ONOS2.get_json(url5)
-            j6 = main.ONOS2.get_json(url6)
-            json_str = []
-            json_str.append(0)
-            json_str.append(j1)
-            json_str.append(j2)
-            json_str.append(j3)
-            json_str.append(j4)
-            json_str.append(j5)
-            json_str.append(j6)
-            if json_str[1] != "" and json_str[2] != "" and json_str[3] != "" and json_str[4] != "" and json_str[5] != "" and json_str[6] != "":
-                # write_str = str(json_str["meters"][4]["meter"][2])
-                #print str(json_str["meters"][4])
-                #f.write(str(json_str["meters"][4]))
-                #f.write('\n')
-                #time.sleep(3)
-                for j in range(1,7):
-                    f.write("ONOS" + str(j) + "\n")
-                    f.write(str(json_str[j]["meters"][4]['meter']['count']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m1_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m5_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m15_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['mean_rate']))
-                    f.write('\n')
-                
-                f.write('\n')
-                f.write('\n')
-                
-                f.write("--------------------------------------------------------------------------------- \n") 
-                time.sleep(sleep_t)
-        f.close() 
-        time.sleep(180)
-
     def CASE63(self,main):
         
         main.case("Starting NB Throughput test after scaling up to 4 onos nodes")
@@ -1248,20 +903,18 @@
 
         import time
         import json
-        int_num = main.params['int_num']
+        int_num = int(main.params['int_num'])
         addrate = main.params['addrate']
         NBdur = main.params['NBdur']
         NBsleep = int(main.params['NBsleep'])
         NBsleep_init = int(main.params['NBsleep_init'])
         NBloop = int(main.params['NBloop'])
         nbtpval = 0.0
-        main.log.report("Starting NB Throughput test: loading 6-node ONOS cluster with " + int_num + " Intents/s" )
+        main.log.report("Starting NB Throughput test: loading 6-node ONOS cluster with " + str(int_num) + " Intents/s" )
         global nbtpavg6n
         nbtpavg6n = 0.0
-
+        int_r = 6 * int_num
         main.Mininet4.handle.expect("\$")
-        #main.Mininet2.handle.sendline("sudo mn --custom topo-intentTPtest.py --topo mytopo --mac --arp")
-        #main.Mininet2.handle.expect("mininet>" , timeout=400)
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s1 tcp:10.128.10.1:6633")
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s2 tcp:10.128.10.2:6633")
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s3 tcp:10.128.10.3:6633")
@@ -1273,7 +926,7 @@
         main.ONOS3.handle.sendline("cd ~admin/suibin-dev")
         main.ONOS3.handle.expect("\$")
 
-        main.ONOS3.handle.sendline("./loadgen_NB.py -n 6 -u \"10.128.10.1:8080 10.128.10.2:8080 10.128.10.3:8080 10.128.10.4:8080 10.128.10.5:8080 10.128.10.6:8080 \" -i " + int_num + " -a " + addrate + " -l " + NBdur + " -p 20")
+        main.ONOS3.handle.sendline("./loadgen_NB.py -n 6 -u \"10.128.10.1:8080 10.128.10.2:8080 10.128.10.3:8080 10.128.10.4:8080 10.128.10.5:8080 10.128.10.6:8080 \" -i " + str(int_r) + " -a " + addrate + " -l " + NBdur + " -p 20")
         main.ONOS3.handle.expect("Pause between add and delete:", timeout=900)
 
         
@@ -1288,7 +941,6 @@
         url5 = "http://10.128.10.5:8080/wm/onos/metrics"
         url6 = "http://10.128.10.6:8080/wm/onos/metrics"
         f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/NBscale6nodesrate1", "a")
-        #time.sleep(10)
         for i in range(NBloop):
             j1 = main.ONOS2.get_json(url1)
             j2 = main.ONOS2.get_json(url2)
@@ -1372,7 +1024,6 @@
         sleep_t =int( main.params['sleep_t'])
         sleep_init = int(main.params['sleep_init'])
         main.case("Starting SB load on 6 nodes from mininet with " + rate1 +"  added/removed/s for " + run_dur)
-        #main.Mininet2.handle.sendline("./loadgen_SB.sh startload \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 + "\"" + " " + switches_num + " " + port + " " + rate1 + " " + run_dur +  "  \"11\"")
         main.Mininet2.handle.sendline("sudo ./loadgen_SB.py -u \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 + " " + ip5 +  " " + ip6 + " " + ip7 + "\"" + " -s " + switches_num + " -p " + port + " -a " + rate1 + " -d " + rate1 + " -l " + run_dur)
         main.Mininet2.handle.expect("Starting SB load....", timeout=900)
         import time
@@ -1393,7 +1044,6 @@
         url7 = "http://10.128.10.7:8080/wm/onos/metrics"
 
         f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale7nodesrate1", "a")
-        #time.sleep(10)
         for i in range(int (loop)):
             j1 = main.ONOS2.get_json(url1)
             j2 = main.ONOS2.get_json(url2)
@@ -1412,11 +1062,6 @@
             json_str.append(j6)
             json_str.append(j7)
             if json_str[1] != "" and json_str[2] != "" and json_str[3] != "" and json_str[4] != "" and json_str[5] != "" and json_str[6] != "" and json_str[7] != "":
-                # write_str = str(json_str["meters"][4]["meter"][2])
-                #print str(json_str["meters"][4])
-                #f.write(str(json_str["meters"][4]))
-                #f.write('\n')
-                #time.sleep(3)
                 for j in range(1,8):
                     f.write("ONOS" + str(j) + "\n")
                     f.write(str(json_str[j]["meters"][4]['meter']['count']))
@@ -1431,7 +1076,6 @@
                     f.write('\n')
                     if j == 3:
                         tpval += float(json_str[j]["meters"][4]['meter']['m1_rate']) 
-                        #print tpval
                 
                 f.write('\n')
                 f.write('\n')
@@ -1439,103 +1083,19 @@
                 f.write("--------------------------------------------------------------------------------- \n") 
                 time.sleep(sleep_t)
         f.close() 
-        #print tpval
         print("\n")
         tpavg7n = round(tpval)/loop
         print tpavg7n
         
-        #main.Mininet2.handle.expect("\$", timeout=900)
-        #main.Mininet2.handle.sendline("sudo mn -c")
-        #main.Mininet2.handle.expect("\$")
         time.sleep(5)
         main.Mininet2.handle.expect("\$", timeout=900)
         time.sleep(180)
         main.log.report("Topology Event Throughput for 7-node ONOS cluster = " + str(tpavg7n) + " Events/sec")
         
 
-    def CASE72(self,main):
-        
-        ip1 = main.params['CTRL']['ip1']
-        ip2 = main.params['CTRL']['ip2']
-        ip3 = main.params['CTRL']['ip3']
-        ip4 = main.params['CTRL']['ip4']
-        ip5 = main.params['CTRL']['ip5']
-        ip6 = main.params['CTRL']['ip6']
-        ip7 = main.params['CTRL']['ip7']
-        
-        import time
-        import json
-        rate2 = main.params['RATE2']
-        run_dur = main.params['RUN_DUR']
-        loop = int(main.params['loop'])
-        sleep_t = int(main.params['sleep_t'])
-        sleep_init = int(main.params['sleep_init'])
-        switches_num = main.params['switches_num']
-        port = main.params['port']
-        main.case("Starting SB load on 7 nodes from mininet with " + rate2 +"  added/removed/s for " + run_dur)
-        #main.Mininet2.handle.sendline("./loadgen_SB.sh startload \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 +  "\"" + " " + switches_num + " " + port +  " " + rate2 + " " + run_dur +  "  \"11\"")
-        main.Mininet2.handle.sendline("sudo ./loadgen_SB.py -u \"" + ip1 + " " + ip2 + " " + ip3 + " " + ip4 + " " + ip5 + " " + ip6 + " " + ip7 + "\"" + " -s " + switches_num + " -p " + port + " -a " + rate2 + " -d " + rate2 + " -l " + run_dur)
-        main.Mininet2.handle.expect("Starting SB load....", timeout=900 )
-        
-        time.sleep(sleep_init)
-
-        open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale7nodesrate2", 'w').close()
-        url1 = "http://10.128.10.1:8080/wm/onos/metrics"
-        url2 = "http://10.128.10.2:8080/wm/onos/metrics"
-        url3 = "http://10.128.10.3:8080/wm/onos/metrics"
-        url4 = "http://10.128.10.4:8080/wm/onos/metrics"
-        url5 = "http://10.128.10.5:8080/wm/onos/metrics"
-        url6 = "http://10.128.10.6:8080/wm/onos/metrics"
-        url7 = "http://10.128.10.7:8080/wm/onos/metrics"
-        f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/scale6nodesrate2", "a")
-        #time.sleep(10)
-        for i in range(int (loop)):
-            j1 = main.ONOS2.get_json(url1)
-            j2 = main.ONOS2.get_json(url2)
-            j3 = main.ONOS2.get_json(url3)
-            j4 = main.ONOS2.get_json(url4)
-            j5 = main.ONOS2.get_json(url5)
-            j6 = main.ONOS2.get_json(url6)
-            j7 = main.ONOS2.get_json(url7)
-            json_str = []
-            json_str.append(0)
-            json_str.append(j1)
-            json_str.append(j2)
-            json_str.append(j3)
-            json_str.append(j4)
-            json_str.append(j5)
-            json_str.append(j6)
-            json_str.append(j7)
-            if json_str[1] != "" and json_str[2] != "" and json_str[3] != "" and json_str[4] != "" and json_str[5] != "" and json_str[6] != "" and json_str[7] != "":
-                # write_str = str(json_str["meters"][4]["meter"][2])
-                #print str(json_str["meters"][4])
-                #f.write(str(json_str["meters"][4]))
-                #f.write('\n')
-                #time.sleep(3)
-                for j in range(1,8):
-                    f.write("ONOS" + str(j) + "\n")
-                    f.write(str(json_str[j]["meters"][4]['meter']['count']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m1_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m5_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['m15_rate']))
-                    f.write('\t')
-                    f.write(str(json_str[j]["meters"][4]['meter']['mean_rate']))
-                    f.write('\n')
-                
-                f.write('\n')
-                f.write('\n')
-                
-                f.write("--------------------------------------------------------------------------------- \n") 
-                time.sleep(sleep_t)
-        f.close() 
-        time.sleep(180)
-
     def CASE73(self,main):
         
-        main.case("Starting NB Throughput test after scaling up to 4 onos nodes")
+        main.case("Starting NB Throughput test after scaling up to 7 onos nodes")
         ip1 = main.params['CTRL']['ip1']
         ip2 = main.params['CTRL']['ip2']
         ip3 = main.params['CTRL']['ip3']
@@ -1543,20 +1103,18 @@
 
         import time
         import json
-        int_num = main.params['int_num']
+        int_num = int(main.params['int_num'])
         addrate = main.params['addrate']
         NBdur = main.params['NBdur']
         NBsleep = int(main.params['NBsleep'])
         NBsleep_init = int(main.params['NBsleep_init'])
         NBloop = int(main.params['NBloop'])
-        main.log.report("Starting NB Throughput test: loading 7-node ONOS cluster with " + int_num + " Intents/s" )
+        main.log.report("Starting NB Throughput test: loading 7-node ONOS cluster with " + str(int_num) + " Intents/s" )
         nbtpval = 0.0
         global nbtpavg7n
         nbtpavg7n = 0.0
-
+        int_r = 7 * int_num
         main.Mininet4.handle.expect("\$")
-        #main.Mininet2.handle.sendline("sudo mn --custom topo-intentTPtest.py --topo mytopo --mac --arp")
-        #main.Mininet2.handle.expect("mininet>" , timeout=400)
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s1 tcp:10.128.10.1:6633")
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s2 tcp:10.128.10.2:6633")
         main.Mininet4.handle.sendline("sudo ovs-vsctl set-controller s3 tcp:10.128.10.3:6633")
@@ -1568,7 +1126,7 @@
         main.ONOS3.handle.sendline("cd ~admin/suibin-dev")
         main.ONOS3.handle.expect("\$")
 
-        main.ONOS3.handle.sendline("./loadgen_NB.py -n 7 -u \"10.128.10.1:8080 10.128.10.2:8080 10.128.10.3:8080 10.128.10.4:8080 10.128.10.6:8080 10.128.10.5:8080 10.128.10.7:8080  \" -i " + int_num + " -a " + addrate + " -l " + NBdur + " -p 20")
+        main.ONOS3.handle.sendline("./loadgen_NB.py -n 7 -u \"10.128.10.1:8080 10.128.10.2:8080 10.128.10.3:8080 10.128.10.4:8080 10.128.10.6:8080 10.128.10.5:8080 10.128.10.7:8080  \" -i " + str(int_r) + " -a " + addrate + " -l " + NBdur + " -p 20")
         main.ONOS3.handle.expect("Pause between add and delete:", timeout=900)
 
         
@@ -1584,7 +1142,6 @@
         url6 = "http://10.128.10.6:8080/wm/onos/metrics"
         url7 = "http://10.128.10.7:8080/wm/onos/metrics"
         f = open("/home/admin/TestON/tests/scaleONOS7nodes/logs/NBscale7nodesrate1", "a")
-        #time.sleep(10)
         for i in range(NBloop):
             j1 = main.ONOS2.get_json(url1)
             j2 = main.ONOS2.get_json(url2)
@@ -1661,11 +1218,7 @@
         data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup() and main.ONOS5.isup() and main.ONOS6.isup()
         for i in range(3):
             if data == main.FALSE: 
-                #main.log.report("Something is funny... restarting ONOS")
-                #main.ONOS1.stop()
                 time.sleep(3)
-                #main.ONOS1.start()
-                #time.sleep(5) 
                 data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup() and main.ONOS5.isup() and main.ONOS6.isup()
             else:
                 break
@@ -1681,11 +1234,7 @@
         data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup() and main.ONOS5.isup()
         for i in range(3):
             if data == main.FALSE: 
-                #main.log.report("Something is funny... restarting ONOS")
-                #main.ONOS1.stop()
                 time.sleep(3)
-                #main.ONOS1.start()
-                #time.sleep(5) 
                 data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup() and main.ONOS5.isup()
             else:
                 break
@@ -1702,11 +1251,7 @@
         data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup()
         for i in range(3):
             if data == main.FALSE: 
-                #main.log.report("Something is funny... restarting ONOS")
-                #main.ONOS1.stop()
                 time.sleep(3)
-                #main.ONOS1.start()
-                #time.sleep(5) 
                 data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup() and main.ONOS4.isup()
             else:
                 break
@@ -1722,11 +1267,7 @@
         data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup()
         for i in range(3):
             if data == main.FALSE: 
-                #main.log.report("Something is funny... restarting ONOS")
-                #main.ONOS1.stop()
                 time.sleep(3)
-                #main.ONOS1.start()
-                #time.sleep(5) 
                 data = main.ONOS1.isup() and main.ONOS2.isup() and main.ONOS3.isup()
             else:
                 break
