diff --git a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
index 276de24..d4dc087 100644
--- a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
+++ b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
@@ -192,8 +192,8 @@
         resultPath = main.params['DB']['switchEventResultPath']
         thresholdStr = main.params['TEST']['singleSwThreshold']
         thresholdObj = thresholdStr.split(',')
-        thresholdMin = float(thresholdObj[0])
-        thresholdMax = float(thresholdObj[1])
+        thresholdMin = int(thresholdObj[0])
+        thresholdMax = int(thresholdObj[1])
        
         # Look for 'role-request' messages,
         # which replaces the 'vendor' messages previously seen
@@ -266,8 +266,13 @@
             main.log.info('Assigning s3 to controller')
             main.Mininet1.assignSwController(sw='3',
                     ip1=nodeIpList[0], port1=defaultSwPort)
-            
-            time.sleep(10)
+               
+            jsonStr = []
+            for node in range (0, clusterCount): 
+                metricsSwUp = CLIs[node].topologyEventsMetrics()
+                jsonStr.append(metricsSwUp)
+           
+            time.sleep(1)
             
             main.log.info('Stopping all Tshark processes')
             main.ONOS1.tsharkStop()
@@ -283,7 +288,7 @@
                       nodeIpList[0] + ':' + tsharkOfOutput + ' /tmp/')
            
             # Get tcp syn / ack output
-            time.sleep(5)
+            # time.sleep(1)
             tcpFile = open(tsharkTcpOutput, 'r')
             tempText = tcpFile.readline()
             tempText = tempText.split(' ')
@@ -300,7 +305,6 @@
             tcpFile.close()
            
             # Get Role reply output
-            time.sleep(5)
             ofFile = open(tsharkOfOutput, 'r')
             lineOfp = ''
             while True:
@@ -351,16 +355,11 @@
                 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
-                metricsSwUp = CLIs[node].topologyEventsMetrics
-                jsonStr = metricsSwUp()
-                jsonObj = json.loads(jsonStr)
+                #metricsSwUp = CLIs[node].topologyEventsMetrics
+                #jsonStr = metricsSwUp()
+                jsonObj = json.loads(jsonStr[node])
                 if jsonObj:
                     graphTimestamp = jsonObj[graphTimestampKey]['value']
                     deviceTimestamp = jsonObj[deviceTimestampKey]['value']
@@ -398,8 +397,9 @@
                 else:
                     main.log.info("ONOS "+str(nodeNum)+ " end-to-end "+
                             "measurement ignored due to excess in "+
-                            "threshold or premature iteration")
-
+                            "threshold or premature iteration: ")
+                    main.log.info(str(endToEnd))
+                        
                 if tcpToFeature >= thresholdMin and\
                    tcpToFeature < thresholdMax and i >= iterIgnore:
                     tcpToFeatureLatNodeIter[node][i] = tcpToFeature 
@@ -408,7 +408,8 @@
                 else:
                     main.log.info("ONOS "+str(nodeNum)+ " tcp-to-feature "+
                             "measurement ignored due to excess in "+
-                            "threshold or premature iteration")
+                            "threshold or premature iteration: ")
+                    main.log.info(str(tcpToFeature))
 
                 if featureToRole >= thresholdMin and\
                    featureToRole < thresholdMax and i >= iterIgnore:
@@ -418,7 +419,8 @@
                 else:
                     main.log.info("ONOS "+str(nodeNum)+ " feature-to-role "+
                             "measurement ignored due to excess in "+
-                            "threshold or premature iteration")
+                            "threshold or premature iteration: ")
+                    main.log.info(str(featureToRole))
 
                 if roleToOfp >= thresholdMin and\
                    roleToOfp < thresholdMax and i >= iterIgnore:
@@ -428,7 +430,8 @@
                 else:
                     main.log.info("ONOS "+str(nodeNum)+ " role-to-reply "+
                             "measurement ignored due to excess in "+
-                            "threshold or premature iteration")
+                            "threshold or premature iteration: ")
+                    main.log.info(str(roleToOfp))
                 
                 if ofpToDevice >= thresholdMin and\
                    ofpToDevice < thresholdMax and i >= iterIgnore:
@@ -438,7 +441,8 @@
                 else:
                     main.log.info("ONOS "+str(nodeNum)+ " reply-to-device "+
                             "measurement ignored due to excess in "+
-                            "threshold or premature iteration")
+                            "threshold or premature iteration: ")
+                    main.log.info(str(ofpToDevice))
 
                 if deviceToGraph >= thresholdMin and\
                    deviceToGraph < thresholdMax and i >= iterIgnore:
@@ -451,13 +455,14 @@
                         main.log.info("ONOS "+str(nodeNum) +
                             " device-to-graph measurement "+
                             "was set to 0 ms because of precision "+
-                            "uncertainty")
+                            "uncertainty. ")
                     else:
                         main.log.info("ONOS "+str(nodeNum)+ 
                             " device-to-graph "+
                             "measurement ignored due to excess in "+
-                            "threshold or premature iteration")
-                                
+                            "threshold or premature iteration: ")
+                        main.log.info(str(deviceToGraph))   
+                            
             # ********************
             time.sleep(5)
         
@@ -520,12 +525,23 @@
                 index = 1
                 for line in tempLine:
                     obj = line.split(' ')
-            
-                    if len(obj) > 1:
+           
+                    # There are at least 3 objects in field (valid 
+                    # tshark output is lengthy)
+                    if len(obj) > 2:
+                        # If first index of object is like an epoch time
+                        if obj[1] > 1400000000:
+                            temp = obj[1] 
+                        elif obj[2] > 1400000000:
+                            temp = obj[2]
+                        else:
+                            temp = 0
+
                         if index == 1:
-                            tFinAck = float(obj[1]) * 1000.0
+                            tFinAck = float(temp) * 1000.0
                         elif index == 3:
-                            tAck = float(obj[1]) * 1000.0
+                            tAck = float(temp) * 1000.0
+                        
                     else:
                         main.log.error('Tshark output file for OFP' +
                             ' returned unexpected results')
@@ -571,7 +587,8 @@
                     main.log.info("ONOS " + str(nodeNum) + 
                             " end-to-end disconnection "+
                             "measurement ignored due to excess in "+
-                            "threshold or premature iteration")
+                            "threshold or premature iteration: ")
+                    main.log.info(str(endToEndDisc))
 
                 if finAckTransaction >= thresholdMin and\
                    finAckTransaction < thresholdMax and i >= iterIgnore:
@@ -583,8 +600,9 @@
                     main.log.info("ONOS "+str(nodeNum)+
                             " fin/ack transaction "+
                             "measurement ignored due to excess in "+
-                            "threshold or premature iteration")
-                
+                            "threshold or premature iteration: ")
+                    main.log.info(str(finAckTransaction))
+
                 if ackToDevice >= thresholdMin and\
                    ackToDevice < thresholdMax and i >= iterIgnore:
                     ackToDeviceLatNodeIter[node][i] = ackToDevice
@@ -595,8 +613,9 @@
                     main.log.info("ONOS "+str(nodeNum)+
                             " ack-to-device "+
                             "measurement ignored due to excess in "+
-                            "threshold or premature iteration")
-                
+                            "threshold or premature iteration: ")
+                    main.log.info(str(ackToDevice))
+
                 if deviceToGraph >= thresholdMin and\
                    deviceToGraph < thresholdMax and i >= iterIgnore:
                     deviceToGraphDiscLatNodeIter[node][i] = deviceToGraph
@@ -607,7 +626,8 @@
                     main.log.info("ONOS "+str(nodeNum)+
                             " device-to-graph disconnect "+
                             "measurement ignored due to excess in "+
-                            "threshold or premature iteration")
+                            "threshold or premature iteration: ")
+                    main.log.info(str(deviceToGraph))
 
         endToEndAvg = 0
         ofpToGraphAvg = 0
@@ -648,15 +668,15 @@
                     roleToOfpList.append(item)
 
             for item in roleReplyToDeviceLatNodeIter[node]:
-                if item > 0.0:
-                    tcpToFeatureList.append(item)
-
+                if item >= 0.0:
+                    ofpToDeviceList.append(item)
+            
             for item in featureToRoleRequestLatNodeIter[node]:
                 if item > 0.0:
                     featureToRoleList.append(item)
 
             for item in deviceToGraphLatNodeIter[node]:
-                if item > 0.0:
+                if item >= 0.0:
                     deviceToGraphList.append(item)
 
             # Switch disconnect measurements
@@ -673,9 +693,9 @@
                     ackToDeviceList.append(item)
 
             for item in deviceToGraphDiscLatNodeIter[node]:
-                if item > 0.0:
+                if item >= 0.0:
                     deviceToGraphDiscList.append(item)
-            
+
             endToEndAvg = round(numpy.mean(endToEndList), 2)
             endToEndStdDev = round(numpy.std(endToEndList), 2)
 
@@ -837,10 +857,10 @@
         downThresholdStr = main.params['TEST']['portDownThreshold']
         upThresholdObj = upThresholdStr.split(',')
         downThresholdObj = downThresholdStr.split(',')
-        upThresholdMin = float(upThresholdObj[0])
-        upThresholdMax = float(upThresholdObj[1])
-        downThresholdMin = float(downThresholdObj[0])
-        downThresholdMax = float(downThresholdObj[1])
+        upThresholdMin = int(upThresholdObj[0])
+        upThresholdMax = int(upThresholdObj[1])
+        downThresholdMin = int(downThresholdObj[0])
+        downThresholdMax = int(downThresholdObj[1])
         
         interfaceConfig = 's1-eth1'
         main.log.report('Port enable / disable latency')
@@ -876,6 +896,11 @@
                     interfaceConfig + ' down')
             main.Mininet1.handle.expect('mininet>')
             
+            jsonStrPtDown = []
+            for node in range (0, clusterCount): 
+                metricsPortDown = CLIs[node].topologyEventsMetrics()
+                jsonStrPtDown.append(metricsPortDown)
+            
             time.sleep(3)
             
             main.ONOS1.tsharkStop()
@@ -906,9 +931,9 @@
           
             for node in range(0, clusterCount):
                 nodeNum = node+1
-                metricsDown = CLIs[node].topologyEventsMetrics
-                jsonStrDown = metricsDown()
-                jsonObj = json.loads(jsonStrDown)
+                # metricsDown = CLIs[node].topologyEventsMetrics
+                #jsonStrPtDown[node] = metricsDown()
+                jsonObj = json.loads(jsonStrPtDown[node])
                 
                 if jsonObj:
                     graphTimestamp = jsonObj[graphTimestampKey]['value']
@@ -979,6 +1004,11 @@
             main.Mininet1.handle.sendline('sh ifconfig ' + interfaceConfig + ' up')
             main.Mininet1.handle.expect('mininet>')
             
+            jsonStrPtUp = []
+            for node in range (0, clusterCount): 
+                metricsPortUp = CLIs[node].topologyEventsMetrics()
+                jsonStrPtUp.append(metricsPortUp)
+            
             time.sleep(5)
             main.ONOS1.tsharkStop()
             
@@ -1001,9 +1031,9 @@
             
             for node in range(0, clusterCount):
                 nodeNum = node+1
-                metricsUp = CLIs[node].topologyEventsMetrics
-                jsonStrUp = metricsUp()
-                jsonObj = json.loads(jsonStrUp)
+                #metricsUp = CLIs[node].topologyEventsMetrics
+                #jsonStrUp = metricsUp()
+                jsonObj = json.loads(jsonStrPtUp[node])
                
                 if jsonObj:
                     graphTimestamp = jsonObj[graphTimestampKey]['value']
@@ -1102,10 +1132,9 @@
                     portUpDevToLinkList.append(item)
 
             for item in portUpLinkToGraphNodeIter[node]:
-                if item > 0.0:
+                if item >= 0.0:
                     portUpLinkToGraphList.append(item)
 
-
             for item in portDownEndToEndNodeIter[node]:
                 if item > 0.0:
                     portDownEndToEndList.append(item)
@@ -1115,11 +1144,11 @@
                     portDownOfpToDevList.append(item)
 
             for item in portDownDevToLinkNodeIter[node]:
-                if item > 0.0:
+                if item >= 0.0:
                     portDownDevToLinkList.append(item)
 
             for item in portDownLinkToGraphNodeIter[node]:
-                if item > 0.0:
+                if item >= 0.0:
                     portDownLinkToGraphList.append(item)
 
             portUpEndToEndAvg = round(numpy.mean(portUpEndToEndList), 2)
@@ -1149,7 +1178,7 @@
                     str(round(portDownEndToEndAvg, 2)) + ' ms')
             main.log.report(' Port down Ofp-to-device ' +
                     str(portDownOfpToDevAvg) + ' ms')
-            main.log.report(' Port down Device-to-link' +
+            main.log.report(' Port down Device-to-link ' +
                     str(portDownDevToLinkAvg) + ' ms')
             main.log.report(' Port down Link-to-graph' +
                     str(portDownLinkToGraphAvg) + ' ms')
