diff --git a/TestON/drivers/common/cli/onosdriver.py b/TestON/drivers/common/cli/onosdriver.py
index 6eaeb15..27c2d92 100644
--- a/TestON/drivers/common/cli/onosdriver.py
+++ b/TestON/drivers/common/cli/onosdriver.py
@@ -1334,13 +1334,14 @@
             main.cleanup()
             main.exit()
 
-    def tsharkGrep( self, grep, directory, interface='eth0' ):
+    def tsharkGrep( self, grep, directory, interface='eth0', grepOptions='' ):
         """
         Required:
             * grep string
             * directory to store results
         Optional:
             * interface - default: eth0
+            * grepOptions - options for grep 
         Description:
             Uses tshark command to grep specific group of packets
             and stores the results to specified directory.
@@ -1350,10 +1351,16 @@
             self.handle.sendline( "" )
             self.handle.expect( "\$" )
             self.handle.sendline( "" )
+            if grepOptions:
+                grepStr = "grep "+str(grepOptions)
+            else:
+                grepStr = "grep"
+            
             self.handle.sendline(
                 "tshark -i " +
                 str( interface ) +
-                " -t e | grep --line-buffered \"" +
+                " -t e | " +
+                grepStr + " --line-buffered \"" +
                 str(grep) +
                 "\" >" +
                 directory +
diff --git a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params
index 24588e0..b898149 100644
--- a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params
+++ b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params
@@ -3,7 +3,7 @@
 
     <ENV>
         <cellName>topo_perf_test</cellName>
-        <cellFeatures>"webconsole,onos-core,onos-api,onos-cli,onos-app-metrics,onos-app-gui,onos-openflow"</cellFeatures>
+        <cellFeatures>"org.onosproject.metrics,org.onosproject.openflow"</cellFeatures>
     </ENV>
 
     <GIT>
@@ -37,11 +37,14 @@
     </BENCH>
 
     <TSHARK>
+        # What to 'grep' for tshark outputs
+
         <ofpPortStatus>OF 1.3 146</ofpPortStatus>
         <ofpRoleReply>OF 1.3 90 of_role_reply</ofpRoleReply>
         <featureReply>OF 1.3 98 of_features_reply</featureReply>
         <roleRequest>OF 1.3 90 of_role_request</roleRequest>
         <tcpSynAck>TCP 74 6633</tcpSynAck>
+        <finAckSequence>FIN</finAckSequence>
     </TSHARK>
 
     <TEST>
@@ -61,17 +64,17 @@
         </topoConfigName>
 
         #Number of times to iterate each case
-        <numIter>35</numIter>
+        <numIter>25</numIter>
         <numSwitch>2</numSwitch>
         #Number of iterations to ignore initially
         <iterIgnore>2</iterIgnore>
 
-        <singleSwThreshold>0,1000</singleSwThreshold>
-        <portUpThreshold>0,1000</portUpThreshold>
-        <portDownThreshold>0,1000</portDownThreshold>
-        <linkUpThreshold>0,10000</linkUpThreshold>
-        <linkDownThreshold>0,10000</linkDownThreshold>
-        <swDisc100Threshold>0,10000</swDisc100Threshold>
+        <singleSwThreshold>0.0,1000</singleSwThreshold>
+        <portUpThreshold>0.0,1000</portUpThreshold>
+        <portDownThreshold>0.0,1000</portDownThreshold>
+        <linkUpThreshold>0.0,10000</linkUpThreshold>
+        <linkDownThreshold>0.0,10000</linkDownThreshold>
+        <swDisc100Threshold>0.0,10000</swDisc100Threshold>
     
         <tabletFile>tablets_3node.json</tabletFile>
    </TEST>
diff --git a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
index e89491a..de0ad05 100644
--- a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
+++ b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
@@ -119,6 +119,16 @@
         CLIs[0].activateApp( 'org.onosproject.openflow' )
 
         main.step( 'Configuring application parameters' )
+<<<<<<< HEAD
+        configName = 'org.onosproject.net.topology.impl.DefaultTopologyProvider'
+        configParam = 'maxEvents 1'
+        main.ONOSbench.onosCfgSet( nodeIpList[0], configName, configParam )
+        configParam = 'maxBatchMs 0'
+        main.ONOSbench.onosCfgSet( nodeIpList[0], configName, configParam )
+        configParam = 'maxIdleMs 0'
+        main.ONOSbench.onosCfgSet( nodeIpList[0], configName, configParam )
+        
+=======
         # TODO: Check driver for this functionality
         main.ONOSbench.handle.sendline(
                 'onos '+nodeIpList[0]+
@@ -139,6 +149,7 @@
                 ' maxIdleMs 0')
         main.ONOSbench.handle.expect(":~")
 
+>>>>>>> c16e983dcc6a370bcdebdf4168770cee5c619a7d
         utilities.assert_equals(expect=main.TRUE,
                 actual=cellFileResult and cellApplyResult and\
                         verifyCellResult and checkoutResult and\
@@ -194,11 +205,40 @@
         tsharkFeatureReply = main.params[ 'TSHARK' ][ 'featureReply' ]
         tsharkRoleRequest = main.params[ 'TSHARK' ][ 'roleRequest' ]
         tsharkOfString = main.params[ 'TSHARK' ][ 'ofpRoleReply' ]
+        tsharkFinAckSequence = main.params[ 'TSHARK' ][ 'finAckSequence' ]
 
         tsharkOfOutput = '/tmp/tshark_of_topo.txt'
         tsharkTcpOutput = '/tmp/tshark_tcp_topo.txt'
         tsharkRoleOutput = '/tmp/tshark_role_request.txt'
         tsharkFeatureOutput = '/tmp/tshark_feature_reply.txt'
+        tsharkFinAckOutput = '/tmp/tshark_fin_ack.txt'
+
+        # Switch connect measurement list
+        # TCP Syn/Ack -> Feature Reply latency collection for each node
+        tcpToFeatureLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
+        # Feature Reply -> Role Request latency collection for each node
+        featureToRoleRequestLatNodeIter = numpy.zeros((clusterCount, 
+            int(numIter)))
+        # Role Request -> Role Reply latency collection for each node
+        roleRequestToRoleReplyLatNodeIter = numpy.zeros((clusterCount,
+            int(numIter)))
+        # Role Reply -> Device Update latency collection for each node
+        roleReplyToDeviceLatNodeIter = numpy.zeros((clusterCount,
+            int(numIter)))
+        # Device Update -> Graph Update latency collection for each node
+        deviceToGraphLatNodeIter = numpy.zeros((clusterCount,
+            int(numIter)))
+        
+        # Switch disconnect measurement lists
+        # Mininet Fin / Ack -> Mininet Ack
+        finAckTransactionLatNodeIter = numpy.zeros((clusterCount,
+            int(numIter)))
+        # Mininet Ack -> Device Event
+        ackToDeviceLatNodeIter = numpy.zeros((clusterCount,
+            int(numIter)))
+        # Device event -> Graph event
+        deviceToGraphDiscLatNodeIter = numpy.zeros((clusterCount,
+            int(numIter)))
 
         # TCP Syn/Ack -> Feature Reply latency collection for each node
         tcpToFeatureLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
@@ -348,6 +388,7 @@
                 if jsonObj:
                     graphTimestamp = jsonObj[graphTimestampKey]['value']
                     deviceTimestamp = jsonObj[deviceTimestampKey]['value']
+<<<<<<< HEAD
                 else:
                     main.log.error( "Unexpected JSON object" )
                     # If we could not obtain the JSON object, 
@@ -373,6 +414,33 @@
                     main.log.info("ONOS "+str(nodeNum)+ " end-to-end: "+
                             str(endToEnd) + " ms")
                 else:
+=======
+                else:
+                    main.log.error( "Unexpected JSON object" )
+                    # If we could not obtain the JSON object, 
+                    # set the timestamps to 0, which will be
+                    # excluded from the measurement later on
+                    # (realized as invalid)
+                    graphTimestamp = 0
+                    deviceTimestamp = 0
+                
+                endToEnd = int(graphTimestamp) - int(t0Tcp)
+                
+                # Below are measurement breakdowns of the end-to-end
+                # measurement. 
+                tcpToFeature = int(featureTimestamp) - int(t0Tcp)
+                featureToRole = int(roleTimestamp) - int(featureTimestamp)
+                roleToOfp = int(t0Ofp) - int(roleTimestamp)
+                ofpToDevice = int(deviceTimestamp) - int(t0Ofp)
+                deviceToGraph = float(graphTimestamp) - float(deviceTimestamp)
+                
+                if endToEnd > thresholdMin and\
+                   endToEnd < thresholdMax and i >= iterIgnore:
+                    endToEndLatNodeIter[node][i] = endToEnd 
+                    main.log.info("ONOS "+str(nodeNum)+ " end-to-end: "+
+                            str(endToEnd) + " ms")
+                else:
+>>>>>>> c16e983dcc6a370bcdebdf4168770cee5c619a7d
                     main.log.info("ONOS "+str(nodeNum)+ " end-to-end "+
                             "measurement ignored due to excess in "+
                             "threshold or premature iteration")
@@ -444,18 +512,122 @@
             # TCP FIN/ACK -> TCP FIN
             # TCP FIN -> Device Event
             # Device Event -> Graph Event
+<<<<<<< HEAD
+           
+            # Capture switch down FIN / ACK packets
+
+            main.ONOS1.tsharkGrep( tsharkFinAckSequence, tsharkFinAckOutput, 
+                    grepOptions = '-A 1' )
+           
+            time.sleep( 5 )
+=======
+>>>>>>> c16e983dcc6a370bcdebdf4168770cee5c619a7d
 
             main.step('Remove switch from controller')
             main.Mininet1.deleteSwController('s3')
-            
             #firstDevice = deviceList[0] 
             firstDevice = "of:0000000000000003"
             main.log.info( "Removing device " +str(firstDevice)+
                     " from ONOS" )
             #if deviceId:
             main.ONOS1cli.deviceRemove(firstDevice)
+           
+            time.sleep( 5 )
+            main.ONOS1.tsharkStop()
+
+            main.log.info('Copying over tshark files')
+            os.system('scp ' + ONOSUser + '@' + nodeIpList[0] +
+                    ':' + tsharkFinAckOutput + ' /tmp/')
+           
+            time.sleep( 10 )
+            finAckOutputList = []
+            with open(tsharkFinAckOutput, 'r') as f:
+                tempLine = f.readlines()
+                main.log.info('Object read in from FinAck capture: ' +
+                    str(tempLine))
+                
+                index = 1
+                for line in tempLine:
+                    obj = line.split(' ')
             
+                    if len(obj) > 1:
+                        if index == 1:
+                            tFinAck = float(obj[1]) * 1000.0
+                            print "*** fin ack time :"+str(tFinAck)
+                        elif index == 3:
+                            tAck = float(obj[1]) * 1000.0
+                            print "*** Ack time: "+str(tAck)
+                    else:
+                        main.log.error('Tshark output file for OFP' +
+                            ' returned unexpected results')
+                        tFinAck = 0
+                        tAck = 0
+                        assertion = main.FALSE
+                    
+                    index = index+1
+
+            # with open() as f takes care of closing file
+
             time.sleep(5)
+            
+            for node in range(0, clusterCount):
+                nodeNum = node+1
+                metricsSwDown = CLIs[node].topologyEventsMetrics
+                jsonStr = metricsSwDown()
+                jsonObj = json.loads(jsonStr)
+                if jsonObj:
+                    graphTimestamp = jsonObj[graphTimestampKey]['value']
+                    deviceTimestamp = jsonObj[deviceTimestampKey]['value']
+                    main.log.info("Graph timestamp: "+str(graphTimestamp))
+                    main.log.info("Device timestamp: "+str(deviceTimestamp))
+                else:
+                    main.log.error( "Unexpected JSON object" )
+                    # If we could not obtain the JSON object, 
+                    # set the timestamps to 0, which will be
+                    # excluded from the measurement later on
+                    # (realized as invalid)
+                    graphTimestamp = 0
+                    deviceTimestamp = 0
+               
+                finAckTransaction = int(tAck) - int(tFinAck)
+                ackToDevice = int(deviceTimestamp) - int(tAck)
+                deviceToGraph = int(graphTimestamp) - int(deviceTimestamp)
+                
+                if finAckTransaction > thresholdMin and\
+                   finAckTransaction < thresholdMax and i >= iterIgnore:
+                    finAckTransactionLatNodeIter[node][i] = finAckTransaction 
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " fin/ack transaction: "+
+                            str(finAckTransaction) + " ms")
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " fin/ack transaction "+
+                            "measurement ignored due to excess in "+
+                            "threshold or premature iteration")
+                
+                if ackToDevice > thresholdMin and\
+                   ackToDevice < thresholdMax and i >= iterIgnore:
+                    ackToDeviceLatNodeIter[node][i] = ackToDevice
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " ack-to-device: "+
+                            str(ackToDevice) + " ms")
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " ack-to-device "+
+                            "measurement ignored due to excess in "+
+                            "threshold or premature iteration")
+                
+                if deviceToGraph > thresholdMin and\
+                   deviceToGraph < thresholdMax and i >= iterIgnore:
+                    deviceToGraphDiscLatNodeIter[node][i] = deviceToGraph
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " device-to-graph disconnect: "+
+                            str(deviceToGraph) + " ms")
+                else:
+                    main.log.info("ONOS "+str(nodeNum)+
+                            " device-to-graph disconnect "+
+                            "measurement ignored due to excess in "+
+                            "threshold or premature iteration")
 
         endToEndAvg = 0
         ofpToGraphAvg = 0
@@ -469,17 +641,28 @@
             roleToOfpList = []
             ofpToDeviceList = []
             deviceToGraphList = []
+<<<<<<< HEAD
+            finAckTransactionList = []
+            ackToDeviceList = []
+            deviceToGraphDiscList = []
+=======
+>>>>>>> c16e983dcc6a370bcdebdf4168770cee5c619a7d
 
             # LatNodeIter 2d arrays contain all iteration latency
             # for each node of the current scale cluster size
             
+<<<<<<< HEAD
+            # Switch connection measurements
+=======
             # TODO: Use the new breakdown latency lists
 
+>>>>>>> c16e983dcc6a370bcdebdf4168770cee5c619a7d
             for item in endToEndLatNodeIter[node]:
                 if item > 0.0:
                     endToEndList.append(item)
 
             for item in tcpToFeatureLatNodeIter[node]:
+<<<<<<< HEAD
                 if item > 0.0:
                     tcpToFeatureList.append(item)
 
@@ -492,12 +675,45 @@
                     roleToOfpList.append(item)
 
             for item in roleReplyToDeviceLatNodeIter[node]:
+=======
+                if item > 0.0:
+                    tcpToFeatureList.append(item)
+
+            for item in featureToRoleRequestLatNodeIter[node]:
+>>>>>>> c16e983dcc6a370bcdebdf4168770cee5c619a7d
+                if item > 0.0:
+                    featureToRoleList.append(item)
+
+<<<<<<< HEAD
+            for item in deviceToGraphLatNodeIter[node]:
+                if item > 0.0:
+                    deviceToGraphList.append(item)
+
+            # Switch disconnect measurements
+            for item in finAckTransactionLatNodeIter[node]:
+                if item > 0.0:
+                    finAckTransactionList.append(item)
+
+            for item in ackToDeviceLatNodeIter[node]:
+                if item > 0.0:
+                    ackToDeviceList.append(item)
+
+            for item in deviceToGraphDiscLatNodeIter[node]:
+                if item > 0.0:
+                    deviceToGraphDiscList.append(item)
+=======
+            for item in roleRequestToRoleReplyLatNodeIter[node]:
+                if item > 0.0:
+                    roleToOfpList.append(item)
+
+            for item in roleReplyToDeviceLatNodeIter[node]:
                 if item > 0.0:
                     ofpToDeviceList.append(item)
 
             for item in deviceToGraphLatNodeIter[node]:
                 if item > 0.0:
                     deviceToGraphList.append(item)
+>>>>>>> c16e983dcc6a370bcdebdf4168770cee5c619a7d
 
             endToEndAvg = round(numpy.mean(endToEndList), 2)
             endToEndStdDev = round(numpy.std(endToEndList), 2)
@@ -517,7 +733,21 @@
             deviceToGraphAvg = round(numpy.mean(deviceToGraphList), 2)
             deviceToGraphStdDev = round(numpy.std(deviceToGraphList), 2)
 
+<<<<<<< HEAD
+            finAckAvg = round(numpy.mean(finAckTransactionList), 2)
+            finAckStdDev = round(numpy.std(finAckTransactionList), 2)
+            
+            ackToDeviceAvg = round(numpy.mean(ackToDeviceList), 2)
+            ackToDeviceStdDev = round(numpy.std(ackToDeviceList), 2)
+            
+            deviceToGraphDiscAvg = round(numpy.mean(deviceToGraphDiscList), 2)
+            deviceToGraphDiscStdDev = round(numpy.std(deviceToGraphDiscList), 2)
+
+=======
+>>>>>>> c16e983dcc6a370bcdebdf4168770cee5c619a7d
             main.log.report(' - Node ' + str(node + 1) + ' Summary - ')
+            main.log.report(' - Switch Connection Statistics - ')
+            
             main.log.report(' End-to-end Avg: ' + str(endToEndAvg) +
                     ' ms' + ' End-to-end Std dev: ' +
                     str(endToEndStdDev) + ' ms')
@@ -547,12 +777,30 @@
             main.log.report( 'Device-to-graph Std dev: ' +
                     str(deviceToGraphStdDev) + ' ms')
             
+<<<<<<< HEAD
+            main.log.report(' - Switch Disconnection Statistics - ')
+            main.log.report(' Fin/Ack-to-Ack Avg: ' + str(finAckAvg) + ' ms')
+            main.log.report(' Fin/Ack-to-Ack Std dev: ' +
+                    str(finAckStdDev) + ' ms')
+            
+            main.log.report(' Ack-to-device Avg: ' + str(ackToDeviceAvg) + 
+                    ' ms')
+            main.log.report(' Ack-to-device Std dev: ' + str(ackToDeviceStdDev) +
+                    ' ms')
+
+            main.log.report(' Device-to-graph (disconnect) Avg: ' +
+                    str(deviceToGraphDiscAvg) + ' ms')
+            main.log.report(' Device-to-graph (disconnect) Std dev: ' +
+                    str(deviceToGraphDiscStdDev) + ' ms')
+
+=======
+>>>>>>> c16e983dcc6a370bcdebdf4168770cee5c619a7d
             dbCmdList.append(
                     "INSERT INTO switch_latency_tests VALUES('" +
                     timeToPost + "','switch_latency_results'," +
                     runNum + ',' + str(clusterCount) + ",'baremetal" + 
                     str(node + 1) + "'," + str(endToEndAvg) + ',' +
-                    str(endToEndStd) + ',0,0);')
+                    str(endToEndStdDev) + ',0,0);')
 
         if debugMode == 'on':
             main.ONOS1.cpLogsToDir('/opt/onos/log/karaf.log',
@@ -674,19 +922,22 @@
                 timestampBeginPtDown = 0
             fPortDown.close()
           
-            """
-            # TODO: Refactor in progress
-
             for node in range(0, clusterCount):
                 nodeNum = node+1
-                exec "metricsDown = main.ONOS%scli.topologyEventsMetrics"%str(nodeNum) 
+                metricsDown = CLIs[node].topologyEventsMetrics
                 jsonStrDown = metricsDown()
                 jsonObj = json.loads(jsonStrDown)
                 
-                graphTimestamp = jsonObj[graphTimestamp]['value']
-                deviceTimestamp = jsonObj[deviceTimestamp]['value']
-                linkTimestamp = jsonObj[linkTimestamp]['value']
-                
+                if jsonObj:
+                    graphTimestamp = jsonObj[graphTimestamp]['value']
+                    deviceTimestamp = jsonObj[deviceTimestamp]['value']
+                    linkTimestamp = jsonObj[linkTimestamp]['value']
+                else:
+                    main.log.error( "Unexpected json object" )
+                    graphTimestamp = 0
+                    deviceTimestamp = 0
+                    linkTimestamp = 0
+
                 ptDownGraphToOfp = int(graphTimestamp) - int(timestampBeginPtDown)
                 ptDownDeviceToOfp = int(deviceTimestamp) - int(timestampBeginPtDown)
                 ptDownLinkToOfp = int(linkTimestamp) - int(timestampBeginPtDown)
@@ -723,199 +974,6 @@
                     main.log.info("ONOS "+str(nodeNum)+
                             " port down link-to-ofp ignored"+
                             " due to excess in threshold or premature iteration")
-            """
-            # *************************
-
-            main.step('Obtain t1 by metrics call')
-            
-            jsonStrUp1 = main.ONOS1cli.topologyEventsMetrics()
-            jsonObj1 = json.loads(jsonStrUp1)
-            graphTimestamp1 = jsonObj1[graphTimestamp]['value']
-            deviceTimestamp1 = jsonObj1[deviceTimestamp]['value']
-            linkTimestamp1 = jsonObj1[linkTimestamp]['value']
-            ptDownGraphToOfp1 = int(graphTimestamp1) - int(timestampBeginPtDown)
-            ptDownDeviceToOfp1 = int(deviceTimestamp1) - int(timestampBeginPtDown)
-            ptDownLinkToOfp1 = int(linkTimestamp1) - int(timestampBeginPtDown)
-           
-            if ptDownGraphToOfp1 > downThresholdMin and\
-               ptDownGraphToOfp1 < downThresholdMax and i > iterIgnore:
-                portDownGraphNodeIter[0][i] = ptDownGraphToOfp1
-                main.log.info('ONOS1 iter' + str(i) +
-                        ' port down graph-to-ofp: ' +
-                        str(ptDownGraphToOfp1) + ' ms')
-            
-            if ptDownDeviceToOfp1 > downThresholdMin and \
-               ptDownDeviceToOfp1 < downThresholdMax and i > iterIgnore:
-                portDownDevNodeIter[0][i] = ptDownDeviceToOfp1
-                main.log.info('ONOS1 iter' + str(i) + 
-                        ' port down device-to-ofp: ' +
-                        str(ptDownDeviceToOfp1) + ' ms')
-            if ptDownLinkToOfp1 > downThresholdMin and\
-               ptDownLinkToOfp1 < downThresholdMax and i > iterIgnore:
-                portDownLinkNodeIter[0][i] = ptDownLinkToOfp1
-                main.log.info('ONOS1 iter' + str(i) +
-                        ' port down link-to-ofp: ' +
-                        str(ptDownLinkToOfp1) + ' ms')
-            
-            if clusterCount >= 3:
-                jsonStrUp2 = main.ONOS2cli.topologyEventsMetrics()
-                jsonStrUp3 = main.ONOS3cli.topologyEventsMetrics()
-                jsonObj2 = json.loads(jsonStrUp2)
-                jsonObj3 = json.loads(jsonStrUp3)
-                graphTimestamp2 = jsonObj2[graphTimestamp]['value']
-                graphTimestamp3 = jsonObj3[graphTimestamp]['value']
-                deviceTimestamp2 = jsonObj2[deviceTimestamp]['value']
-                deviceTimestamp3 = jsonObj3[deviceTimestamp]['value']
-                linkTimestamp2 = jsonObj2[linkTimestamp]['value']
-                linkTimestamp3 = jsonObj3[linkTimestamp]['value']
-                ptDownGraphToOfp2 = int(graphTimestamp2) - int(timestampBeginPtDown)
-                ptDownGraphToOfp3 = int(graphTimestamp3) - int(timestampBeginPtDown)
-                ptDownDeviceToOfp2 = int(deviceTimestamp2) - int(timestampBeginPtDown)
-                ptDownDeviceToOfp3 = int(deviceTimestamp3) - int(timestampBeginPtDown)
-                ptDownLinkToOfp2 = int(linkTimestamp2) - int(timestampBeginPtDown)
-                ptDownLinkToOfp3 = int(linkTimestamp3) - int(timestampBeginPtDown)
-                if ptDownGraphToOfp2 > downThresholdMin and\
-                   ptDownGraphToOfp2 < downThresholdMax and i > iterIgnore:
-                    portDownGraphNodeIter[1][i] = ptDownGraphToOfp2
-                    main.log.info('ONOS2 iter' + str(i) +
-                            ' graph-to-ofp: ' +
-                            str(ptDownGraphToOfp2) + ' ms')
-                if ptDownDeviceToOfp2 > downThresholdMin and \
-                   ptDownDeviceToOfp2 < downThresholdMax and i > iterIgnore:
-                    portDownDevNodeIter[1][i] = ptDownDeviceToOfp2
-                    main.log.info('ONOS2 iter' + str(i) +
-                            ' device-to-ofp: ' +
-                            str(ptDownDeviceToOfp2) + ' ms')
-                if ptDownLinkToOfp2 > downThresholdMin and\
-                   ptDownLinkToOfp2 < downThresholdMax and i > iterIgnore:
-                    portDownLinkNodeIter[1][i] = ptDownLinkToOfp2
-                    main.log.info('ONOS2 iter' + str(i) +
-                            ' link-to-ofp: ' +
-                            str(ptDownLinkToOfp2) + ' ms')
-                if ptDownGraphToOfp3 > downThresholdMin and\
-                   ptDownGraphToOfp3 < downThresholdMax and i > iterIgnore:
-                    portDownGraphNodeIter[2][i] = ptDownGraphToOfp3
-                    main.log.info('ONOS3 iter' + str(i) +
-                            ' graph-to-ofp: ' +
-                            str(ptDownGraphToOfp3) + ' ms')
-                if ptDownDeviceToOfp3 > downThresholdMin and\
-                   ptDownDeviceToOfp3 < downThresholdMax and i > iterIgnore:
-                    portDownDevNodeIter[2][i] = ptDownDeviceToOfp3
-                    main.log.info('ONOS3 iter' + str(i) +
-                            ' device-to-ofp: ' +
-                            str(ptDownDeviceToOfp3) + ' ms')
-                if ptDownLinkToOfp3 > downThresholdMin and\
-                   ptDownLinkToOfp3 < downThresholdMax and i > iterIgnore:
-                    portDownLinkNodeIter[2][i] = ptDownLinkToOfp3
-                    main.log.info('ONOS3 iter' + str(i) +
-                            ' link-to-ofp: ' +
-                            str(ptDownLinkToOfp3) + ' ms')
-            if clusterCount >= 5:
-                jsonStrUp4 = main.ONOS4cli.topologyEventsMetrics()
-                jsonStrUp5 = main.ONOS5cli.topologyEventsMetrics()
-                jsonObj4 = json.loads(jsonStrUp4)
-                jsonObj5 = json.loads(jsonStrUp5)
-                graphTimestamp4 = jsonObj4[graphTimestamp]['value']
-                graphTimestamp5 = jsonObj5[graphTimestamp]['value']
-                deviceTimestamp4 = jsonObj4[deviceTimestamp]['value']
-                deviceTimestamp5 = jsonObj5[deviceTimestamp]['value']
-                linkTimestamp4 = jsonObj4[linkTimestamp]['value']
-                linkTimestamp5 = jsonObj5[linkTimestamp]['value']
-                ptDownGraphToOfp4 = int(graphTimestamp4) - int(timestampBeginPtDown)
-                ptDownGraphToOfp5 = int(graphTimestamp5) - int(timestampBeginPtDown)
-                ptDownDeviceToOfp4 = int(deviceTimestamp4) - int(timestampBeginPtDown)
-                ptDownDeviceToOfp5 = int(deviceTimestamp5) - int(timestampBeginPtDown)
-                ptDownLinkToOfp4 = int(linkTimestamp4) - int(timestampBeginPtDown)
-                ptDownLinkToOfp5 = int(linkTimestamp5) - int(timestampBeginPtDown)
-                if ptDownGraphToOfp4 > downThresholdMin and \
-                   ptDownGraphToOfp4 < downThresholdMax and i > iterIgnore:
-                    portDownGraphNodeIter[3][i] = ptDownGraphToOfp4
-                    main.log.info('ONOS4 iter' + str(i) +
-                            ' graph-to-ofp: ' +
-                            str(ptDownGraphToOfp4) + ' ms')
-                if ptDownDeviceToOfp4 > downThresholdMin and\
-                   ptDownDeviceToOfp4 < downThresholdMax and i > iterIgnore:
-                    portDownDevNodeIter[3][i] = ptDownDeviceToOfp4
-                    main.log.info('ONOS4 iter' + str(i) +
-                            ' device-to-ofp: ' +
-                            str(ptDownDeviceToOfp4) + ' ms')
-                if ptDownLinkToOfp4 > downThresholdMin and\
-                   ptDownLinkToOfp4 < downThresholdMax and i > iterIgnore:
-                    portDownLinkNodeIter[3][i] = ptDownLinkToOfp4
-                    main.log.info('ONOS4 iter' + str(i) +
-                            ' link-to-ofp: ' +
-                            str(ptDownLinkToOfp4) + ' ms')
-                if ptDownGraphToOfp5 > downThresholdMin and\
-                   ptDownGraphToOfp5 < downThresholdMax and i > iterIgnore:
-                    portDownGraphNodeIter[4][i] = ptDownGraphToOfp5
-                    main.log.info('ONOS5 iter' + str(i) +
-                            ' graph-to-ofp: ' +
-                            str(ptDownGraphToOfp5) + ' ms')
-                if ptDownDeviceToOfp5 > downThresholdMin and\
-                   ptDownDeviceToOfp5 < downThresholdMax and i > iterIgnore:
-                    portDownDevNodeIter[4][i] = ptDownDeviceToOfp5
-                    main.log.info('ONOS5 iter' + str(i) +
-                            ' device-to-ofp: ' +
-                            str(ptDownDeviceToOfp5) + ' ms')
-                if ptDownLinkToOfp5 > downThresholdMin and\
-                   ptDownLinkToOfp5 < downThresholdMax and i > iterIgnore:
-                    portDownLinkNodeIter[4][i] = ptDownLinkToOfp5
-                    main.log.info('ONOS5 iter' + str(i) +
-                            ' link-to-ofp: ' +
-                            str(ptDownLinkToOfp5) + ' ms')
-            if clusterCount >= 7:
-                jsonStrUp6 = main.ONOS6cli.topologyEventsMetrics()
-                jsonStrUp7 = main.ONOS7cli.topologyEventsMetrics()
-                jsonObj6 = json.loads(jsonStrUp6)
-                jsonObj7 = json.loads(jsonStrUp7)
-                graphTimestamp6 = jsonObj6[graphTimestamp]['value']
-                graphTimestamp7 = jsonObj7[graphTimestamp]['value']
-                deviceTimestamp6 = jsonObj6[deviceTimestamp]['value']
-                deviceTimestamp7 = jsonObj7[deviceTimestamp]['value']
-                linkTimestamp6 = jsonObj6[linkTimestamp]['value']
-                linkTimestamp7 = jsonObj7[linkTimestamp]['value']
-                ptDownGraphToOfp6 = int(graphTimestamp6) - int(timestampBeginPtDown)
-                ptDownGraphToOfp7 = int(graphTimestamp7) - int(timestampBeginPtDown)
-                ptDownDeviceToOfp6 = int(deviceTimestamp6) - int(timestampBeginPtDown)
-                ptDownDeviceToOfp7 = int(deviceTimestamp7) - int(timestampBeginPtDown)
-                ptDownLinkToOfp6 = int(linkTimestamp6) - int(timestampBeginPtDown)
-                ptDownLinkToOfp7 = int(linkTimestamp7) - int(timestampBeginPtDown)
-                if ptDownGraphToOfp6 > downThresholdMin and\
-                   ptDownGraphToOfp6 < downThresholdMax and i > iterIgnore:
-                    portDownGraphNodeIter[5][i] = ptDownGraphToOfp6
-                    main.log.info('ONOS6 iter' + str(i) +
-                            ' graph-to-ofp: ' +
-                            str(ptDownGraphToOfp6) + ' ms')
-                if ptDownDeviceToOfp6 > downThresholdMin and\
-                   ptDownDeviceToOfp6 < downThresholdMax and i > iterIgnore:
-                    portDownDevNodeIter[5][i] = ptDownDeviceToOfp6
-                    main.log.info('ONOS6 iter' + str(i) +
-                            ' device-to-ofp: ' +
-                            str(ptDownDeviceToOfp6) + ' ms')
-                if ptDownLinkToOfp6 > downThresholdMin and\
-                   ptDownLinkToOfp6 < downThresholdMax and i > iterIgnore:
-                    portDownLinkNodeIter[5][i] = ptDownLinkToOfp6
-                    main.log.info('ONOS6 iter' + str(i) +
-                            ' link-to-ofp: ' +
-                            str(ptDownLinkToOfp6) + ' ms')
-                if ptDownGraphToOfp7 > downThresholdMin and\
-                   ptDownGraphToOfp7 < downThresholdMax and i > iterIgnore:
-                    portDownGraphNodeIter[6][i] = ptDownGraphToOfp7
-                    main.log.info('ONOS7 iter' + str(i) +
-                            ' graph-to-ofp: ' +
-                            str(ptDownGraphToOfp7) + ' ms')
-                if ptDownDeviceToOfp7 > downThresholdMin and\
-                   ptDownDeviceToOfp7 < downThresholdMax and i > iterIgnore:
-                    portDownDevNodeIter[6][i] = ptDownDeviceToOfp7
-                    main.log.info('ONOS7 iter' + str(i) +
-                            ' device-to-ofp: ' + 
-                            str(ptDownDeviceToOfp7) + ' ms')
-                if ptDownLinkToOfp7 > downThresholdMin and\
-                   ptDownLinkToOfp7 < downThresholdMax and i > iterIgnore:
-                    portDownLinkNodeIter[6][i] = ptDownLinkToOfp7
-                    main.log.info('ONOS7 iter' + str(i) +
-                            ' link-to-ofp: ' +
-                            str(ptDownLinkToOfp7) + ' ms')
 
             time.sleep(3)
             
@@ -946,21 +1004,23 @@
                 main.log.info('Tshark output file returned unexpected' + ' results.')
                 timestampBeginPtUp = 0
             fPortUp.close()
-            """ 
-            # TODO: Refactoring in progress
             
             for node in range(0, clusterCount):
                 nodeNum = node+1
-                exec "metricsUp = main.ONOS%scli.topologyEventsMetrics"%str(nodeNum) 
+                metricsUp = CLIs[node].topologyEventsMetrics
                 jsonStrUp = metricsUp()
                 jsonObj = json.loads(jsonStrUp)
-                
-                print jsonObj
+               
+                if jsonObj:
+                    graphTimestamp = jsonObj[graphTimestamp]['value']
+                    deviceTimestamp = jsonObj[deviceTimestamp]['value']
+                    linkTimestamp = jsonObj[linkTimestamp]['value']
+                else:
+                    main.log.error( "Unexpected json object" )
+                    graphTimestamp = 0
+                    deviceTimestamp = 0
+                    linkTimestamp = 0
 
-                graphTimestamp = jsonObj[graphTimestamp]['value']
-                deviceTimestamp = jsonObj[deviceTimestamp]['value']
-                linkTimestamp = jsonObj[linkTimestamp]['value']
-                
                 ptUpGraphToOfp = int(graphTimestamp) - int(timestampBeginPtUp)
                 ptUpDeviceToOfp = int(deviceTimestamp) - int(timestampBeginPtUp)
                 ptUpLinkToOfp = int(linkTimestamp) - int(timestampBeginPtUp)
@@ -998,198 +1058,6 @@
                             " port up link-to-ofp ignored"+
                             " due to excess in threshold or premature iteration")
 
-            """
-
-            # *****************************
-            
-            main.step('Obtain t1 by REST call')
-            jsonStrUp1 = main.ONOS1cli.topologyEventsMetrics()
-            jsonObj1 = json.loads(jsonStrUp1)
-            graphTimestamp1 = jsonObj1[graphTimestamp]['value']
-            deviceTimestamp1 = jsonObj1[deviceTimestamp]['value']
-            linkTimestamp1 = jsonObj1[linkTimestamp]['value']
-            ptUpGraphToOfp1 = int(graphTimestamp1) - int(timestampBeginPtUp)
-            ptUpDeviceToOfp1 = int(deviceTimestamp1) - int(timestampBeginPtUp)
-            ptUpLinkToOfp1 = int(linkTimestamp1) - int(timestampBeginPtUp)
-            if ptUpGraphToOfp1 > upThresholdMin and\
-               ptUpGraphToOfp1 < upThresholdMax and i > iterIgnore:
-                portUpGraphNodeIter[0][i] = ptUpGraphToOfp1
-                main.log.info('ONOS1 iter' + str(i) +
-                        ' port up graph-to-ofp: ' +
-                        str(ptUpGraphToOfp1) + ' ms')
-            if ptUpDeviceToOfp1 > upThresholdMin and \
-               ptUpDeviceToOfp1 < upThresholdMax and i > iterIgnore:
-                portUpDevNodeIter[0][i] = ptUpDeviceToOfp1
-                main.log.info('ONOS1 iter' + str(i) +
-                        ' port up device-to-ofp: ' +
-                        str(ptUpDeviceToOfp1) + ' ms')
-            if ptUpLinkToOfp1 > downThresholdMin and\
-               ptUpLinkToOfp1 < downThresholdMax and i > iterIgnore:
-                portUpLinkNodeIter[0][i] = ptUpLinkToOfp1
-                main.log.info('ONOS1 iter' + str(i) +
-                        ' link-to-ofp: ' +
-                        str(ptUpLinkToOfp1) + ' ms')
-            if clusterCount >= 3:
-                jsonStrUp2 = main.ONOS2cli.topologyEventsMetrics()
-                jsonStrUp3 = main.ONOS3cli.topologyEventsMetrics()
-                jsonObj2 = json.loads(jsonStrUp2)
-                jsonObj3 = json.loads(jsonStrUp3)
-                graphTimestamp2 = jsonObj2[graphTimestamp]['value']
-                graphTimestamp3 = jsonObj3[graphTimestamp]['value']
-                deviceTimestamp2 = jsonObj2[deviceTimestamp]['value']
-                deviceTimestamp3 = jsonObj3[deviceTimestamp]['value']
-                linkTimestamp2 = jsonObj2[linkTimestamp]['value']
-                linkTimestamp3 = jsonObj3[linkTimestamp]['value']
-                ptUpGraphToOfp2 = int(graphTimestamp2) - int(timestampBeginPtUp)
-                ptUpGraphToOfp3 = int(graphTimestamp3) - int(timestampBeginPtUp)
-                ptUpDeviceToOfp2 = int(deviceTimestamp2) - int(timestampBeginPtUp)
-                ptUpDeviceToOfp3 = int(deviceTimestamp3) - int(timestampBeginPtUp)
-                ptUpLinkToOfp2 = int(linkTimestamp2) - int(timestampBeginPtUp)
-                ptUpLinkToOfp3 = int(linkTimestamp3) - int(timestampBeginPtUp)
-                if ptUpGraphToOfp2 > upThresholdMin and\
-                   ptUpGraphToOfp2 < upThresholdMax and i > iterIgnore:
-                    portUpGraphNodeIter[1][i] = ptUpGraphToOfp2
-                    main.log.info('ONOS2 iter' + str(i) +
-                            ' port up graph-to-ofp: ' +
-                            str(ptUpGraphToOfp2) + ' ms')
-                if ptUpDeviceToOfp2 > upThresholdMin and\
-                   ptUpDeviceToOfp2 < upThresholdMax and i > iterIgnore:
-                    portUpDevNodeIter[1][i] = ptUpDeviceToOfp2
-                    main.log.info('ONOS2 iter' + str(i) +
-                            ' port up device-to-ofp: ' +
-                            str(ptUpDeviceToOfp2) + ' ms')
-                if ptUpLinkToOfp2 > downThresholdMin and\
-                   ptUpLinkToOfp2 < downThresholdMax and i > iterIgnore:
-                    portUpLinkNodeIter[1][i] = ptUpLinkToOfp2
-                    main.log.info('ONOS2 iter' + str(i) +
-                            ' port up link-to-ofp: ' +
-                            str(ptUpLinkToOfp2) + ' ms')
-                if ptUpGraphToOfp3 > upThresholdMin and\
-                   ptUpGraphToOfp3 < upThresholdMax and i > iterIgnore:
-                    portUpGraphNodeIter[2][i] = ptUpGraphToOfp3
-                    main.log.info('ONOS3 iter' + str(i) +
-                            ' port up graph-to-ofp: ' +
-                            str(ptUpGraphToOfp3) + ' ms')
-                if ptUpDeviceToOfp3 > upThresholdMin and\
-                   ptUpDeviceToOfp3 < upThresholdMax and i > iterIgnore:
-                    portUpDevNodeIter[2][i] = ptUpDeviceToOfp3
-                    main.log.info('ONOS3 iter' + str(i) +
-                            ' port up device-to-ofp: ' +
-                            str(ptUpDeviceToOfp3) + ' ms')
-                if ptUpLinkToOfp3 > downThresholdMin and\
-                   ptUpLinkToOfp3 < downThresholdMax and i > iterIgnore:
-                    portUpLinkNodeIter[2][i] = ptUpLinkToOfp3
-                    main.log.info('ONOS3 iter' + str(i) +
-                            ' port up link-to-ofp: ' +
-                            str(ptUpLinkToOfp3) + ' ms')
-            if clusterCount >= 5:
-                jsonStrUp4 = main.ONOS4cli.topologyEventsMetrics()
-                jsonStrUp5 = main.ONOS5cli.topologyEventsMetrics()
-                jsonObj4 = json.loads(jsonStrUp4)
-                jsonObj5 = json.loads(jsonStrUp5)
-                graphTimestamp4 = jsonObj4[graphTimestamp]['value']
-                graphTimestamp5 = jsonObj5[graphTimestamp]['value']
-                deviceTimestamp4 = jsonObj4[deviceTimestamp]['value']
-                deviceTimestamp5 = jsonObj5[deviceTimestamp]['value']
-                linkTimestamp4 = jsonObj4[linkTimestamp]['value']
-                linkTimestamp5 = jsonObj5[linkTimestamp]['value']
-                ptUpGraphToOfp4 = int(graphTimestamp4) - int(timestampBeginPtUp)
-                ptUpGraphToOfp5 = int(graphTimestamp5) - int(timestampBeginPtUp)
-                ptUpDeviceToOfp4 = int(deviceTimestamp4) - int(timestampBeginPtUp)
-                ptUpDeviceToOfp5 = int(deviceTimestamp5) - int(timestampBeginPtUp)
-                ptUpLinkToOfp4 = int(linkTimestamp4) - int(timestampBeginPtUp)
-                ptUpLinkToOfp5 = int(linkTimestamp5) - int(timestampBeginPtUp)
-                if ptUpGraphToOfp4 > upThresholdMin and\
-                   ptUpGraphToOfp4 < upThresholdMax and i > iterIgnore:
-                    portUpGraphNodeIter[3][i] = ptUpGraphToOfp4
-                    main.log.info('ONOS4 iter' + str(i) +
-                            ' port up graph-to-ofp: ' +
-                            str(ptUpGraphToOfp4) + ' ms')
-                if ptUpDeviceToOfp4 > upThresholdMin and\
-                   ptUpDeviceToOfp4 < upThresholdMax and i > iterIgnore:
-                    portUpDevNodeIter[3][i] = ptUpDeviceToOfp4
-                    main.log.info('ONOS4 iter' + str(i) +
-                            ' port up device-to-ofp: ' +
-                            str(ptUpDeviceToOfp4) + ' ms')
-                if ptUpLinkToOfp4 > downThresholdMin and\
-                   ptUpLinkToOfp4 < downThresholdMax and i > iterIgnore:
-                    portUpLinkNodeIter[3][i] = ptUpLinkToOfp4
-                    main.log.info('ONOS4 iter' + str(i) +
-                            ' port up link-to-ofp: ' +
-                            str(ptUpLinkToOfp4) + ' ms')
-                if ptUpGraphToOfp5 > upThresholdMin and\
-                    ptUpGraphToOfp5 < upThresholdMax and i > iterIgnore:
-                    portUpGraphNodeIter[4][i] = ptUpGraphToOfp5
-                    main.log.info('ONOS5 iter' + str(i) +
-                            ' port up graph-to-ofp: ' +
-                            str(ptUpGraphToOfp5) + ' ms')
-                if ptUpDeviceToOfp5 > upThresholdMin and \
-                   ptUpDeviceToOfp5 < upThresholdMax and i > iterIgnore:
-                    portUpDevNodeIter[4][i] = ptUpDeviceToOfp5
-                    main.log.info('ONOS5 iter' + str(i) +
-                            ' port up device-to-ofp: ' +
-                            str(ptUpDeviceToOfp5) + ' ms')
-                if ptUpLinkToOfp5 > downThresholdMin and\
-                   ptUpLinkToOfp5 < downThresholdMax and i > iterIgnore:
-                    portUpLinkNodeIter[4][i] = ptUpLinkToOfp5
-                    main.log.info('ONOS5 iter' + str(i) +
-                            ' port up link-to-ofp: ' +
-                            str(ptUpLinkToOfp5) + ' ms')
-            
-            if clusterCount >= 7:
-                jsonStrUp6 = main.ONOS6cli.topologyEventsMetrics()
-                jsonStrUp7 = main.ONOS7cli.topologyEventsMetrics()
-                jsonObj6 = json.loads(jsonStrUp6)
-                jsonObj7 = json.loads(jsonStrUp7)
-                graphTimestamp6 = jsonObj6[graphTimestamp]['value']
-                graphTimestamp7 = jsonObj7[graphTimestamp]['value']
-                deviceTimestamp6 = jsonObj6[deviceTimestamp]['value']
-                deviceTimestamp7 = jsonObj7[deviceTimestamp]['value']
-                linkTimestamp6 = jsonObj6[linkTimestamp]['value']
-                linkTimestamp7 = jsonObj7[linkTimestamp]['value']
-                ptUpGraphToOfp6 = int(graphTimestamp6) - int(timestampBeginPtUp)
-                ptUpGraphToOfp7 = int(graphTimestamp7) - int(timestampBeginPtUp)
-                ptUpDeviceToOfp6 = int(deviceTimestamp6) - int(timestampBeginPtUp)
-                ptUpDeviceToOfp7 = int(deviceTimestamp7) - int(timestampBeginPtUp)
-                ptUpLinkToOfp6 = int(linkTimestamp6) - int(timestampBeginPtUp)
-                ptUpLinkToOfp7 = int(linkTimestamp7) - int(timestampBeginPtUp)
-                if ptUpGraphToOfp6 > upThresholdMin and\
-                   ptUpGraphToOfp6 < upThresholdMax and i > iterIgnore:
-                    portUpGraphNodeIter[5][i] = ptUpGraphToOfp6
-                    main.log.info('ONOS6 iter' + str(i) +
-                            ' port up graph-to-ofp: ' +
-                            str(ptUpGraphToOfp6) + ' ms')
-                if ptUpDeviceToOfp6 > upThresholdMin and\
-                   ptUpDeviceToOfp6 < upThresholdMax and i > iterIgnore:
-                    portUpDevNodeIter[5][i] = ptUpDeviceToOfp6
-                    main.log.info('ONOS6 iter' + str(i) +
-                            ' port up device-to-ofp: ' + 
-                            str(ptUpDeviceToOfp6) + ' ms')
-                if ptUpLinkToOfp6 > downThresholdMin and\
-                   ptUpLinkToOfp6 < downThresholdMax and i > iterIgnore:
-                    portUpLinkNodeIter[5][i] = ptUpLinkToOfp6
-                    main.log.info('ONOS6 iter' + str(i) +
-                            ' port up link-to-ofp: ' +
-                            str(ptUpLinkToOfp6) + ' ms')
-                if ptUpGraphToOfp7 > upThresholdMin and \
-                   ptUpGraphToOfp7 < upThresholdMax and i > iterIgnore:
-                    portUpGraphNodeIter[6][i] = ptUpGraphToOfp7
-                    main.log.info('ONOS7 iter' + str(i) +
-                            ' port up graph-to-ofp: ' + 
-                            str(ptUpGraphToOfp7) + ' ms')
-                if ptUpDeviceToOfp7 > upThresholdMin and\
-                   ptUpDeviceToOfp7 < upThresholdMax and i > iterIgnore:
-                    portUpDevNodeIter[6][i] = ptUpDeviceToOfp7
-                    main.log.info('ONOS7 iter' + str(i) +
-                            ' port up device-to-ofp: ' +
-                            str(ptUpDeviceToOfp7) + ' ms')
-                if ptUpLinkToOfp7 > downThresholdMin and\
-                   ptUpLinkToOfp7 < downThresholdMax and i > iterIgnore:
-                    portUpLinkNodeIter[6][i] = ptUpLinkToOfp7
-                    main.log.info('ONOS7 iter' + str(i) +
-                            ' port up link-to-ofp: ' +
-                            str(ptUpLinkToOfp7) + ' ms')
-
         dbCmdList = []
         for node in range(0, clusterCount):
             portUpDevList = []
@@ -1341,6 +1209,9 @@
                 main.log.error( "ONOS "+str(node) + " did not start" )
 
         for node in range( 1, clusterCount + 1):
-            exec "a = main.ONOS%scli.startOnosCli" %str(node)
-            a(main.params[ 'CTRL' ][ 'ip'+str(node) ])
+            CLIs[node-1].startOnosCli
+            
+            main.step( 'activating essential applications' )
+            CLIs[node-1].activateApp( 'org.onosproject.metrics' )
+            CLIs[node-1].activateApp( 'org.onosproject.openflow' )
 
